/*************************************************************** __MPU_FLOATP.H This file contains declarations of functions for REAL constants operations. PART OF : MPU - library . USAGE : Internal only . NOTE : Include "libmpu.h" before this FILE . Copyright (C) 2000 - 2024 by Andrew V.Kosteltsev. All Rights Reserved. ***************************************************************/ #ifndef __MPU_FLOATP_H #define __MPU_FLOATP_H /*************************************************************** Количество десятичных знаков в мантиссе: ***************************************************************/ #define REAL_32_MDEC_DIG 6 /* 6.924 = 23*log10(2.) */ #define REAL_64_MDEC_DIG 15 /* 15.654 = 52*log10(2.) */ #define REAL_128_MDEC_DIG 28 /* 28.899 = 96*log10(2.) */ #define REAL_256_MDEC_DIG 67 /* 67.431 = 224*log10(2.) */ #define REAL_512_MDEC_DIG 134 /* 134.861 = 448*log10(2.) */ #define REAL_1024_MDEC_DIG 288 /* 288.989 = 960*log10(2.) */ #define REAL_2048_MDEC_DIG 577 /* 577.978 = 1920*log10(2.) */ #define REAL_4096_MDEC_DIG 1194 /* 1194.487 = 3968*log10(2.) */ #define REAL_8192_MDEC_DIG 2388 /* 2388.974 = 7936*log10(2.) */ #define REAL_16384_MDEC_DIG 4855 /* 4855.012 = 16128*log10(2.) */ #define REAL_32768_MDEC_DIG 9710 /* 9710.024 = 32256*log10(2.) */ #define REAL_65536_MDEC_DIG 19574 /* 19574.174 = 65024*log10(2.) */ #define REAL_131072_MDEC_DIG 39148 /* 39148.349 = 130048*log10(2.) */ /*************************************************************** Максимальные размеры строк даны с запасом, в действительности они вычисляются как сумма макс.размер мантиссы + макс.размер экспоненты + знак + знак экспоненты + [суффикс, например, r256]. ***************************************************************/ #define REAL_32_MAX_STRING 20 #define REAL_64_MAX_STRING 40 #define REAL_128_MAX_STRING 60 #define REAL_256_MAX_STRING 80 #define REAL_512_MAX_STRING 160 #define REAL_1024_MAX_STRING 320 #define REAL_2048_MAX_STRING 640 #define REAL_4096_MAX_STRING 1280 #define REAL_8192_MAX_STRING 2560 #define REAL_16384_MAX_STRING 5120 #define REAL_32768_MAX_STRING 10240 #define REAL_65536_MAX_STRING 20480 #define REAL_131072_MAX_STRING 40960 #ifdef __cplusplus extern "C" { #endif /*************************************************************** Следующие функции возвращают указатели на статические массивы содержащие числа размером nE+1 порций EMUSHORT. Числа равны, соответственно, - максимальной десятичной экспоненте вещественного числа размером nb-бит (REAL_xxxxxx_MAX_DEC_EXP) - и минимальной десятичной экспоненте вещественного числа размером nb-бит (REAL_xxxxxx_MIN_DEC_EXP). [see: float.h: DBL_MAX_10_EXP, DBL_MIN_10_EXP.] nE можно вычислить следующим образом: int nE = (int)internal_ne( nb ); => see mpu-real.h NOTE: 32 и 64 работают правильно!!!; т.е.: REAL_32_MAX_10_EXP = 38, REAL_32_MIN_10_EXP = -37, REAL_64_MAX_10_EXP = 308, REAL_64_MAX_10_EXP = -307. ***************************************************************/ extern EMUSHORT *_get_max_10_exp_ptr ( int nb ); extern EMUSHORT *_get_min_10_exp_ptr ( int nb ); /* СЛУЖЕБНЫЕ для MPU-IOREAL.C В ОТЛИЧИЕ ОТ ПРЕДЫДУЩИХ: для 32 и 64 работают иначе; т.е.: REAL_32_MAX_10_EXP = REAL_128_MAX_10_EXP, REAL_32_MIN_10_EXP = REAL_128_MAX_10_EXP, REAL_64_MAX_10_EXP = REAL_128_MAX_10_EXP, REAL_64_MAX_10_EXP = REAL_128_MAX_10_EXP. ***************************************************************/ extern EMUSHORT *_get_maxdecexp_ptr ( int nb ); extern EMUSHORT *_get_mindecexp_ptr ( int nb ); /*************************************************************** Следующие функции возвращают указатели на статические массивы содержащие числа размером nE+1 порций EMUSHORT. Числа равны, соответственно, - МАКСИМАЛЬНОЙ двоичной экспоненте вещественного числа размером nb-бит (REAL_xxxxxx_MAX_MAX_BIN_EXP), - максимальной двоичной экспоненте вещественного числа размером nb-бит (REAL_xxxxxx_MAX_BIN_EXP), - и минимальной двоичной экспоненте вещественного числа размером nb-бит (REAL_xxxxxx_MIN_BIN_EXP). [ REAL_MAX_MAX_BIN_EXP, REAL_MAX_BIN_EXP, REAL_MIN_BIN_EXP ] [see: float.h: DBL_MAX_EXP, DBL_MIN_EXP.] nE можно вычислить следующим образом: int nE = (int)internal_ne( nb ); => see mpu-real.h NOTE: 32 и 64 работают правильно!!!; т.е.: REAL_32_MAX_MAX_BIN_EXP = 128, REAL_32_MAX_BIN_EXP = +127, REAL_32_MIN_BIN_EXP = -126, REAL_64_MAX_MAX_BIN_EXP = 1024, REAL_64_MAX_BIN_EXP = +1023, REAL_64_MAX_BIN_EXP = -1022. ***************************************************************/ extern EMUSHORT *_get_max_max_2_exp_ptr ( int nb ); extern EMUSHORT *_get_max_2_exp_ptr ( int nb ); extern EMUSHORT *_get_min_2_exp_ptr ( int nb ); /*************************************************************** Количество десятичных знаков в мантиссе. ***************************************************************/ extern int _get_ndec ( int nb ); /*************************************************************** Максимальное количество десятичных знаков в числе [с запасом]. ***************************************************************/ extern int _get_max_string ( int nb ); /*************************************************************** Возвращает указатель на EPSILON во внутреннем формате. EPSILON is smallest such that 1.0+EPSILON != 1.0. ***************************************************************/ extern EMUSHORT *_get_epsilon_ptr ( int nb ); #ifdef __cplusplus } /* ... extern "C" */ #endif #endif /* __MPU_FLOATP_H */