Math Processor Unit Library

libmpu – library of arithmetic functions for integer, real, and complex numbers of increased digit capacity

16 Commits   0 Branches   2 Tags
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 */