868b2b66 (kx 2024-12-20 16:11:07 +0300 1)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 3) __MPU_FLOATP.H
868b2b66 (kx 2024-12-20 16:11:07 +0300 4)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5) This file contains declarations of functions for
868b2b66 (kx 2024-12-20 16:11:07 +0300 6) REAL constants operations.
868b2b66 (kx 2024-12-20 16:11:07 +0300 7)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8) PART OF : MPU - library .
868b2b66 (kx 2024-12-20 16:11:07 +0300 9)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10) USAGE : Internal only .
868b2b66 (kx 2024-12-20 16:11:07 +0300 11)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12) NOTE : Include "libmpu.h" before this FILE .
868b2b66 (kx 2024-12-20 16:11:07 +0300 13)
868b2b66 (kx 2024-12-20 16:11:07 +0300 14) Copyright (C) 2000 - 2024 by Andrew V.Kosteltsev.
868b2b66 (kx 2024-12-20 16:11:07 +0300 15) All Rights Reserved.
868b2b66 (kx 2024-12-20 16:11:07 +0300 16) ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 17)
868b2b66 (kx 2024-12-20 16:11:07 +0300 18) #ifndef __MPU_FLOATP_H
868b2b66 (kx 2024-12-20 16:11:07 +0300 19) #define __MPU_FLOATP_H
868b2b66 (kx 2024-12-20 16:11:07 +0300 20)
868b2b66 (kx 2024-12-20 16:11:07 +0300 21)
868b2b66 (kx 2024-12-20 16:11:07 +0300 22) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 23) Количество десятичных знаков в мантиссе:
868b2b66 (kx 2024-12-20 16:11:07 +0300 24) ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 25) #define REAL_32_MDEC_DIG 6 /* 6.924 = 23*log10(2.) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 26) #define REAL_64_MDEC_DIG 15 /* 15.654 = 52*log10(2.) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 27) #define REAL_128_MDEC_DIG 28 /* 28.899 = 96*log10(2.) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 28) #define REAL_256_MDEC_DIG 67 /* 67.431 = 224*log10(2.) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 29)
868b2b66 (kx 2024-12-20 16:11:07 +0300 30) #define REAL_512_MDEC_DIG 134 /* 134.861 = 448*log10(2.) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 31) #define REAL_1024_MDEC_DIG 288 /* 288.989 = 960*log10(2.) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 32)
868b2b66 (kx 2024-12-20 16:11:07 +0300 33) #define REAL_2048_MDEC_DIG 577 /* 577.978 = 1920*log10(2.) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 34) #define REAL_4096_MDEC_DIG 1194 /* 1194.487 = 3968*log10(2.) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 35)
868b2b66 (kx 2024-12-20 16:11:07 +0300 36) #define REAL_8192_MDEC_DIG 2388 /* 2388.974 = 7936*log10(2.) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 37) #define REAL_16384_MDEC_DIG 4855 /* 4855.012 = 16128*log10(2.) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 38)
868b2b66 (kx 2024-12-20 16:11:07 +0300 39) #define REAL_32768_MDEC_DIG 9710 /* 9710.024 = 32256*log10(2.) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 40) #define REAL_65536_MDEC_DIG 19574 /* 19574.174 = 65024*log10(2.) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 41)
868b2b66 (kx 2024-12-20 16:11:07 +0300 42) #define REAL_131072_MDEC_DIG 39148 /* 39148.349 = 130048*log10(2.) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 43)
868b2b66 (kx 2024-12-20 16:11:07 +0300 44) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 45) Максимальные размеры строк даны с запасом, в действительности
868b2b66 (kx 2024-12-20 16:11:07 +0300 46) они вычисляются как сумма макс.размер мантиссы + макс.размер
868b2b66 (kx 2024-12-20 16:11:07 +0300 47) экспоненты + знак + знак экспоненты + [суффикс, например,
868b2b66 (kx 2024-12-20 16:11:07 +0300 48) r256].
868b2b66 (kx 2024-12-20 16:11:07 +0300 49) ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 50) #define REAL_32_MAX_STRING 20
868b2b66 (kx 2024-12-20 16:11:07 +0300 51) #define REAL_64_MAX_STRING 40
868b2b66 (kx 2024-12-20 16:11:07 +0300 52) #define REAL_128_MAX_STRING 60
868b2b66 (kx 2024-12-20 16:11:07 +0300 53) #define REAL_256_MAX_STRING 80
868b2b66 (kx 2024-12-20 16:11:07 +0300 54)
868b2b66 (kx 2024-12-20 16:11:07 +0300 55) #define REAL_512_MAX_STRING 160
868b2b66 (kx 2024-12-20 16:11:07 +0300 56) #define REAL_1024_MAX_STRING 320
868b2b66 (kx 2024-12-20 16:11:07 +0300 57)
868b2b66 (kx 2024-12-20 16:11:07 +0300 58) #define REAL_2048_MAX_STRING 640
868b2b66 (kx 2024-12-20 16:11:07 +0300 59) #define REAL_4096_MAX_STRING 1280
868b2b66 (kx 2024-12-20 16:11:07 +0300 60)
868b2b66 (kx 2024-12-20 16:11:07 +0300 61) #define REAL_8192_MAX_STRING 2560
868b2b66 (kx 2024-12-20 16:11:07 +0300 62) #define REAL_16384_MAX_STRING 5120
868b2b66 (kx 2024-12-20 16:11:07 +0300 63)
868b2b66 (kx 2024-12-20 16:11:07 +0300 64) #define REAL_32768_MAX_STRING 10240
868b2b66 (kx 2024-12-20 16:11:07 +0300 65) #define REAL_65536_MAX_STRING 20480
868b2b66 (kx 2024-12-20 16:11:07 +0300 66)
868b2b66 (kx 2024-12-20 16:11:07 +0300 67) #define REAL_131072_MAX_STRING 40960
868b2b66 (kx 2024-12-20 16:11:07 +0300 68)
868b2b66 (kx 2024-12-20 16:11:07 +0300 69)
868b2b66 (kx 2024-12-20 16:11:07 +0300 70) #ifdef __cplusplus
868b2b66 (kx 2024-12-20 16:11:07 +0300 71) extern "C" {
868b2b66 (kx 2024-12-20 16:11:07 +0300 72) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 73)
868b2b66 (kx 2024-12-20 16:11:07 +0300 74)
868b2b66 (kx 2024-12-20 16:11:07 +0300 75) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 76) Следующие функции возвращают указатели на статические массивы
868b2b66 (kx 2024-12-20 16:11:07 +0300 77) содержащие числа размером nE+1 порций EMUSHORT.
868b2b66 (kx 2024-12-20 16:11:07 +0300 78) Числа равны, соответственно,
868b2b66 (kx 2024-12-20 16:11:07 +0300 79) - максимальной десятичной экспоненте вещественного числа
868b2b66 (kx 2024-12-20 16:11:07 +0300 80) размером nb-бит (REAL_xxxxxx_MAX_DEC_EXP)
868b2b66 (kx 2024-12-20 16:11:07 +0300 81) - и минимальной десятичной экспоненте вещественного числа
868b2b66 (kx 2024-12-20 16:11:07 +0300 82) размером nb-бит (REAL_xxxxxx_MIN_DEC_EXP).
868b2b66 (kx 2024-12-20 16:11:07 +0300 83) [see: float.h: DBL_MAX_10_EXP, DBL_MIN_10_EXP.]
868b2b66 (kx 2024-12-20 16:11:07 +0300 84)
868b2b66 (kx 2024-12-20 16:11:07 +0300 85) nE можно вычислить следующим образом:
868b2b66 (kx 2024-12-20 16:11:07 +0300 86) int nE = (int)internal_ne( nb ); => see mpu-real.h
868b2b66 (kx 2024-12-20 16:11:07 +0300 87)
868b2b66 (kx 2024-12-20 16:11:07 +0300 88) NOTE: 32 и 64 работают правильно!!!; т.е.:
868b2b66 (kx 2024-12-20 16:11:07 +0300 89) REAL_32_MAX_10_EXP = 38,
868b2b66 (kx 2024-12-20 16:11:07 +0300 90) REAL_32_MIN_10_EXP = -37,
868b2b66 (kx 2024-12-20 16:11:07 +0300 91) REAL_64_MAX_10_EXP = 308,
868b2b66 (kx 2024-12-20 16:11:07 +0300 92) REAL_64_MAX_10_EXP = -307.
868b2b66 (kx 2024-12-20 16:11:07 +0300 93) ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 94) extern EMUSHORT *_get_max_10_exp_ptr ( int nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 95) extern EMUSHORT *_get_min_10_exp_ptr ( int nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 96)
868b2b66 (kx 2024-12-20 16:11:07 +0300 97) /*
868b2b66 (kx 2024-12-20 16:11:07 +0300 98) СЛУЖЕБНЫЕ для MPU-IOREAL.C
868b2b66 (kx 2024-12-20 16:11:07 +0300 99) В ОТЛИЧИЕ ОТ ПРЕДЫДУЩИХ: для 32 и 64 работают иначе;
868b2b66 (kx 2024-12-20 16:11:07 +0300 100) т.е.:
868b2b66 (kx 2024-12-20 16:11:07 +0300 101) REAL_32_MAX_10_EXP = REAL_128_MAX_10_EXP,
868b2b66 (kx 2024-12-20 16:11:07 +0300 102) REAL_32_MIN_10_EXP = REAL_128_MAX_10_EXP,
868b2b66 (kx 2024-12-20 16:11:07 +0300 103) REAL_64_MAX_10_EXP = REAL_128_MAX_10_EXP,
868b2b66 (kx 2024-12-20 16:11:07 +0300 104) REAL_64_MAX_10_EXP = REAL_128_MAX_10_EXP.
868b2b66 (kx 2024-12-20 16:11:07 +0300 105) ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 106) extern EMUSHORT *_get_maxdecexp_ptr ( int nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 107) extern EMUSHORT *_get_mindecexp_ptr ( int nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 108)
868b2b66 (kx 2024-12-20 16:11:07 +0300 109) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 110) Следующие функции возвращают указатели на статические массивы
868b2b66 (kx 2024-12-20 16:11:07 +0300 111) содержащие числа размером nE+1 порций EMUSHORT.
868b2b66 (kx 2024-12-20 16:11:07 +0300 112) Числа равны, соответственно,
868b2b66 (kx 2024-12-20 16:11:07 +0300 113) - МАКСИМАЛЬНОЙ двоичной экспоненте вещественного числа
868b2b66 (kx 2024-12-20 16:11:07 +0300 114) размером nb-бит (REAL_xxxxxx_MAX_MAX_BIN_EXP),
868b2b66 (kx 2024-12-20 16:11:07 +0300 115) - максимальной двоичной экспоненте вещественного числа
868b2b66 (kx 2024-12-20 16:11:07 +0300 116) размером nb-бит (REAL_xxxxxx_MAX_BIN_EXP),
868b2b66 (kx 2024-12-20 16:11:07 +0300 117) - и минимальной двоичной экспоненте вещественного числа
868b2b66 (kx 2024-12-20 16:11:07 +0300 118) размером nb-бит (REAL_xxxxxx_MIN_BIN_EXP).
868b2b66 (kx 2024-12-20 16:11:07 +0300 119) [
868b2b66 (kx 2024-12-20 16:11:07 +0300 120) REAL_MAX_MAX_BIN_EXP,
868b2b66 (kx 2024-12-20 16:11:07 +0300 121) REAL_MAX_BIN_EXP,
868b2b66 (kx 2024-12-20 16:11:07 +0300 122) REAL_MIN_BIN_EXP
868b2b66 (kx 2024-12-20 16:11:07 +0300 123) ]
868b2b66 (kx 2024-12-20 16:11:07 +0300 124) [see: float.h: DBL_MAX_EXP, DBL_MIN_EXP.]
868b2b66 (kx 2024-12-20 16:11:07 +0300 125)
868b2b66 (kx 2024-12-20 16:11:07 +0300 126) nE можно вычислить следующим образом:
868b2b66 (kx 2024-12-20 16:11:07 +0300 127) int nE = (int)internal_ne( nb ); => see mpu-real.h
868b2b66 (kx 2024-12-20 16:11:07 +0300 128)
868b2b66 (kx 2024-12-20 16:11:07 +0300 129) NOTE: 32 и 64 работают правильно!!!; т.е.:
868b2b66 (kx 2024-12-20 16:11:07 +0300 130) REAL_32_MAX_MAX_BIN_EXP = 128,
868b2b66 (kx 2024-12-20 16:11:07 +0300 131) REAL_32_MAX_BIN_EXP = +127,
868b2b66 (kx 2024-12-20 16:11:07 +0300 132) REAL_32_MIN_BIN_EXP = -126,
868b2b66 (kx 2024-12-20 16:11:07 +0300 133) REAL_64_MAX_MAX_BIN_EXP = 1024,
868b2b66 (kx 2024-12-20 16:11:07 +0300 134) REAL_64_MAX_BIN_EXP = +1023,
868b2b66 (kx 2024-12-20 16:11:07 +0300 135) REAL_64_MAX_BIN_EXP = -1022.
868b2b66 (kx 2024-12-20 16:11:07 +0300 136) ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 137) extern EMUSHORT *_get_max_max_2_exp_ptr ( int nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 138) extern EMUSHORT *_get_max_2_exp_ptr ( int nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 139) extern EMUSHORT *_get_min_2_exp_ptr ( int nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 140)
868b2b66 (kx 2024-12-20 16:11:07 +0300 141) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 142) Количество десятичных знаков в мантиссе.
868b2b66 (kx 2024-12-20 16:11:07 +0300 143) ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 144) extern int _get_ndec ( int nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 145)
868b2b66 (kx 2024-12-20 16:11:07 +0300 146) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 147) Максимальное количество десятичных знаков в числе
868b2b66 (kx 2024-12-20 16:11:07 +0300 148) [с запасом].
868b2b66 (kx 2024-12-20 16:11:07 +0300 149) ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 150) extern int _get_max_string ( int nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 151)
868b2b66 (kx 2024-12-20 16:11:07 +0300 152)
868b2b66 (kx 2024-12-20 16:11:07 +0300 153) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 154) Возвращает указатель на EPSILON во внутреннем формате.
868b2b66 (kx 2024-12-20 16:11:07 +0300 155) EPSILON is smallest such that 1.0+EPSILON != 1.0.
868b2b66 (kx 2024-12-20 16:11:07 +0300 156) ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 157) extern EMUSHORT *_get_epsilon_ptr ( int nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 158)
868b2b66 (kx 2024-12-20 16:11:07 +0300 159)
868b2b66 (kx 2024-12-20 16:11:07 +0300 160)
868b2b66 (kx 2024-12-20 16:11:07 +0300 161) #ifdef __cplusplus
868b2b66 (kx 2024-12-20 16:11:07 +0300 162) } /* ... extern "C" */
868b2b66 (kx 2024-12-20 16:11:07 +0300 163) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 164)
868b2b66 (kx 2024-12-20 16:11:07 +0300 165) #endif /* __MPU_FLOATP_H */