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)   __ST_LOG.C
868b2b66 (kx 2024-12-20 16:11:07 +0300   4) 
868b2b66 (kx 2024-12-20 16:11:07 +0300   5)        This file contains source code of functions for
868b2b66 (kx 2024-12-20 16:11:07 +0300   6)        LOG 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    : NONE .
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) #ifdef HAVE_CONFIG_H
868b2b66 (kx 2024-12-20 16:11:07 +0300  19) #include <config.h>
868b2b66 (kx 2024-12-20 16:11:07 +0300  20) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  21) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  22) #include <errno.h>   /* errno(3)  */
868b2b66 (kx 2024-12-20 16:11:07 +0300  23) #include <string.h>  /* strcpy(3) */
868b2b66 (kx 2024-12-20 16:11:07 +0300  24) #include <strings.h> /* bzero(3)  */
868b2b66 (kx 2024-12-20 16:11:07 +0300  25) #include <stdlib.h>
868b2b66 (kx 2024-12-20 16:11:07 +0300  26) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  27) #include <libmpu.h>
868b2b66 (kx 2024-12-20 16:11:07 +0300  28) #include <mpu-context.h>
868b2b66 (kx 2024-12-20 16:11:07 +0300  29) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  30) #include <mpu-emutype.h>
868b2b66 (kx 2024-12-20 16:11:07 +0300  31) #include <mpu-integer.h>
868b2b66 (kx 2024-12-20 16:11:07 +0300  32) #include <mpu-real.h>
868b2b66 (kx 2024-12-20 16:11:07 +0300  33) #include <mpu-floatp.h>
868b2b66 (kx 2024-12-20 16:11:07 +0300  34) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  35) #include <mpu-char.h>
868b2b66 (kx 2024-12-20 16:11:07 +0300  36) #include <mpu-symbols.h>
868b2b66 (kx 2024-12-20 16:11:07 +0300  37) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  38) #include <mpu-math-errno.h>
868b2b66 (kx 2024-12-20 16:11:07 +0300  39) #include <mpu-mtherr.h>
868b2b66 (kx 2024-12-20 16:11:07 +0300  40) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  41) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  42) /***************************************************************
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)   128-и битных слов, из которых состоят вещественные числа
868b2b66 (kx 2024-12-20 16:11:07 +0300  47)   размещенные в массивах:
868b2b66 (kx 2024-12-20 16:11:07 +0300  48) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  49)     размер чисел в битах  кодировка
868b2b66 (kx 2024-12-20 16:11:07 +0300  50)     --------------------  ---------
868b2b66 (kx 2024-12-20 16:11:07 +0300  51)                      128  001
868b2b66 (kx 2024-12-20 16:11:07 +0300  52)                      256  002
868b2b66 (kx 2024-12-20 16:11:07 +0300  53)                      512  004
868b2b66 (kx 2024-12-20 16:11:07 +0300  54)                     1024  008
868b2b66 (kx 2024-12-20 16:11:07 +0300  55)                     2048  016
868b2b66 (kx 2024-12-20 16:11:07 +0300  56)                     4096  032
868b2b66 (kx 2024-12-20 16:11:07 +0300  57)                     8192  064
868b2b66 (kx 2024-12-20 16:11:07 +0300  58)                    16384  128
868b2b66 (kx 2024-12-20 16:11:07 +0300  59)                    32768  256
868b2b66 (kx 2024-12-20 16:11:07 +0300  60)                    65536  512 (это предел);
868b2b66 (kx 2024-12-20 16:11:07 +0300  61) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  62)     ПРИМЕРЫ:
868b2b66 (kx 2024-12-20 16:11:07 +0300  63)     -------
868b2b66 (kx 2024-12-20 16:11:07 +0300  64)       ei_log_001_emu32lsb.dfn -   128-бит,
868b2b66 (kx 2024-12-20 16:11:07 +0300  65)       ei_log_512_emu32lsb.dfn - 65536-бит.
868b2b66 (kx 2024-12-20 16:11:07 +0300  66) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  67)  ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  68) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  69) #if MPU_MATH_FN_LIMIT >= 128
868b2b66 (kx 2024-12-20 16:11:07 +0300  70) #if MPU_WORD_ORDER_BIG_ENDIAN == 0
868b2b66 (kx 2024-12-20 16:11:07 +0300  71) #include <math/log/emu00128/ei_log_001_emu32lsb.dfn>
868b2b66 (kx 2024-12-20 16:11:07 +0300  72) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300  73) #include <math/log/emu00128/ei_log_001_emu32msb.dfn>
868b2b66 (kx 2024-12-20 16:11:07 +0300  74) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  75) #endif /* MPU_MATH_FN_LIMIT >= 128 */
868b2b66 (kx 2024-12-20 16:11:07 +0300  76) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  77) #if MPU_MATH_FN_LIMIT >= 256
868b2b66 (kx 2024-12-20 16:11:07 +0300  78) #if MPU_WORD_ORDER_BIG_ENDIAN == 0
868b2b66 (kx 2024-12-20 16:11:07 +0300  79) #include <math/log/emu00256/ei_log_002_emu32lsb.dfn>
868b2b66 (kx 2024-12-20 16:11:07 +0300  80) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300  81) #include <math/log/emu00256/ei_log_002_emu32msb.dfn>
868b2b66 (kx 2024-12-20 16:11:07 +0300  82) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  83) #endif /* MPU_MATH_FN_LIMIT >= 256 */
868b2b66 (kx 2024-12-20 16:11:07 +0300  84) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  85) #if MPU_MATH_FN_LIMIT >= 512
868b2b66 (kx 2024-12-20 16:11:07 +0300  86) #if MPU_WORD_ORDER_BIG_ENDIAN == 0
868b2b66 (kx 2024-12-20 16:11:07 +0300  87) #include <math/log/emu00512/ei_log_004_emu32lsb.dfn>
868b2b66 (kx 2024-12-20 16:11:07 +0300  88) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300  89) #include <math/log/emu00512/ei_log_004_emu32msb.dfn>
868b2b66 (kx 2024-12-20 16:11:07 +0300  90) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  91) #endif /* MPU_MATH_FN_LIMIT >= 512 */
868b2b66 (kx 2024-12-20 16:11:07 +0300  92) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  93) #if MPU_MATH_FN_LIMIT >= 1024
868b2b66 (kx 2024-12-20 16:11:07 +0300  94) #if MPU_WORD_ORDER_BIG_ENDIAN == 0
868b2b66 (kx 2024-12-20 16:11:07 +0300  95) #include <math/log/emu01024/ei_log_008_emu32lsb.dfn>
868b2b66 (kx 2024-12-20 16:11:07 +0300  96) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300  97) #include <math/log/emu01024/ei_log_008_emu32msb.dfn>
868b2b66 (kx 2024-12-20 16:11:07 +0300  98) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  99) #endif /* MPU_MATH_FN_LIMIT >= 1024 */
868b2b66 (kx 2024-12-20 16:11:07 +0300 100) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 101) #if MPU_MATH_FN_LIMIT >= 2048
868b2b66 (kx 2024-12-20 16:11:07 +0300 102) #if MPU_WORD_ORDER_BIG_ENDIAN == 0
868b2b66 (kx 2024-12-20 16:11:07 +0300 103) #include <math/log/emu02048/ei_log_016_emu32lsb.dfn>
868b2b66 (kx 2024-12-20 16:11:07 +0300 104) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 105) #include <math/log/emu02048/ei_log_016_emu32msb.dfn>
868b2b66 (kx 2024-12-20 16:11:07 +0300 106) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 107) #endif /* MPU_MATH_FN_LIMIT >= 2048 */
868b2b66 (kx 2024-12-20 16:11:07 +0300 108) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 109) #if MPU_MATH_FN_LIMIT >= 4096
868b2b66 (kx 2024-12-20 16:11:07 +0300 110) #if MPU_WORD_ORDER_BIG_ENDIAN == 0
868b2b66 (kx 2024-12-20 16:11:07 +0300 111) #include <math/log/emu04096/ei_log_032_emu32lsb.dfn>
868b2b66 (kx 2024-12-20 16:11:07 +0300 112) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 113) #include <math/log/emu04096/ei_log_032_emu32msb.dfn>
868b2b66 (kx 2024-12-20 16:11:07 +0300 114) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 115) #endif /* MPU_MATH_FN_LIMIT >= 4096 */
868b2b66 (kx 2024-12-20 16:11:07 +0300 116) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 117) #if MPU_MATH_FN_LIMIT >= 8192
868b2b66 (kx 2024-12-20 16:11:07 +0300 118) #if MPU_WORD_ORDER_BIG_ENDIAN == 0
868b2b66 (kx 2024-12-20 16:11:07 +0300 119) #include <math/log/emu08192/ei_log_064_emu32lsb.dfn>
868b2b66 (kx 2024-12-20 16:11:07 +0300 120) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 121) #include <math/log/emu08192/ei_log_064_emu32msb.dfn>
868b2b66 (kx 2024-12-20 16:11:07 +0300 122) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 123) #endif /* MPU_MATH_FN_LIMIT >= 8192 */
868b2b66 (kx 2024-12-20 16:11:07 +0300 124) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 125) #if MPU_MATH_FN_LIMIT >= 16384
868b2b66 (kx 2024-12-20 16:11:07 +0300 126) #if MPU_WORD_ORDER_BIG_ENDIAN == 0
868b2b66 (kx 2024-12-20 16:11:07 +0300 127) #include <math/log/emu16384/ei_log_128_emu32lsb.dfn>
868b2b66 (kx 2024-12-20 16:11:07 +0300 128) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 129) #include <math/log/emu16384/ei_log_128_emu32msb.dfn>
868b2b66 (kx 2024-12-20 16:11:07 +0300 130) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 131) #endif /* MPU_MATH_FN_LIMIT >= 16384 */
868b2b66 (kx 2024-12-20 16:11:07 +0300 132) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 133) #if MPU_MATH_FN_LIMIT >= 32768
868b2b66 (kx 2024-12-20 16:11:07 +0300 134) #if MPU_WORD_ORDER_BIG_ENDIAN == 0
868b2b66 (kx 2024-12-20 16:11:07 +0300 135) #include <math/log/emu32768/ei_log_256_emu32lsb.dfn>
868b2b66 (kx 2024-12-20 16:11:07 +0300 136) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 137) #include <math/log/emu32768/ei_log_256_emu32msb.dfn>
868b2b66 (kx 2024-12-20 16:11:07 +0300 138) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 139) #endif /* MPU_MATH_FN_LIMIT >= 32768 */
868b2b66 (kx 2024-12-20 16:11:07 +0300 140) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 141) #if MPU_MATH_FN_LIMIT >= 65536
868b2b66 (kx 2024-12-20 16:11:07 +0300 142) #if MPU_WORD_ORDER_BIG_ENDIAN == 0
868b2b66 (kx 2024-12-20 16:11:07 +0300 143) #include <math/log/emu65536/ei_log_512_emu32lsb.dfn>
868b2b66 (kx 2024-12-20 16:11:07 +0300 144) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 145) #include <math/log/emu65536/ei_log_512_emu32msb.dfn>
868b2b66 (kx 2024-12-20 16:11:07 +0300 146) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 147) #endif /* MPU_MATH_FN_LIMIT >= 65536 */
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) static int _get_n_log( int nb )
868b2b66 (kx 2024-12-20 16:11:07 +0300 151) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 152)   int  rc = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 153) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 154)   if( nb < NBR_32 || nb > MPU_MATH_FN_LIMIT )
868b2b66 (kx 2024-12-20 16:11:07 +0300 155)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 156)     /* error: Invalid size of operand(s) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 157)     __real_error_no = __R_ESIZE__;
868b2b66 (kx 2024-12-20 16:11:07 +0300 158)     __STIND; /* Set REAL ind-produsing operation Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 159)     return( rc );
868b2b66 (kx 2024-12-20 16:11:07 +0300 160)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300 161) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 162)   switch( nb )
868b2b66 (kx 2024-12-20 16:11:07 +0300 163)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 164) #if MPU_MATH_FN_LIMIT >= 128
868b2b66 (kx 2024-12-20 16:11:07 +0300 165)     case NBR_32   :
868b2b66 (kx 2024-12-20 16:11:07 +0300 166)     case NBR_64   :
868b2b66 (kx 2024-12-20 16:11:07 +0300 167)     case NBR_128  :
868b2b66 (kx 2024-12-20 16:11:07 +0300 168)       rc = N_LOG_L128;
868b2b66 (kx 2024-12-20 16:11:07 +0300 169)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300 170) #endif /* MPU_MATH_FN_LIMIT >= 128 */
868b2b66 (kx 2024-12-20 16:11:07 +0300 171) #if MPU_MATH_FN_LIMIT >= 256
868b2b66 (kx 2024-12-20 16:11:07 +0300 172)     case NBR_256  :
868b2b66 (kx 2024-12-20 16:11:07 +0300 173)       rc = N_LOG_L256;
868b2b66 (kx 2024-12-20 16:11:07 +0300 174)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300 175) #endif /* MPU_MATH_FN_LIMIT >= 256 */
868b2b66 (kx 2024-12-20 16:11:07 +0300 176) #if MPU_MATH_FN_LIMIT >= 512
868b2b66 (kx 2024-12-20 16:11:07 +0300 177)     case NBR_512  :
868b2b66 (kx 2024-12-20 16:11:07 +0300 178)       rc = N_LOG_L512;
868b2b66 (kx 2024-12-20 16:11:07 +0300 179)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300 180) #endif /* MPU_MATH_FN_LIMIT >= 512 */
868b2b66 (kx 2024-12-20 16:11:07 +0300 181) #if MPU_MATH_FN_LIMIT >= 1024
868b2b66 (kx 2024-12-20 16:11:07 +0300 182)     case NBR_1024 :
868b2b66 (kx 2024-12-20 16:11:07 +0300 183)       rc = N_LOG_L1024;
868b2b66 (kx 2024-12-20 16:11:07 +0300 184)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300 185) #endif /* MPU_MATH_FN_LIMIT >= 1024 */
868b2b66 (kx 2024-12-20 16:11:07 +0300 186) #if MPU_MATH_FN_LIMIT >= 2048
868b2b66 (kx 2024-12-20 16:11:07 +0300 187)     case NBR_2048 :
868b2b66 (kx 2024-12-20 16:11:07 +0300 188)       rc = N_LOG_L2048;
868b2b66 (kx 2024-12-20 16:11:07 +0300 189)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300 190) #endif /* MPU_MATH_FN_LIMIT >= 2048 */
868b2b66 (kx 2024-12-20 16:11:07 +0300 191) #if MPU_MATH_FN_LIMIT >= 4096
868b2b66 (kx 2024-12-20 16:11:07 +0300 192)     case NBR_4096 :
868b2b66 (kx 2024-12-20 16:11:07 +0300 193)       rc = N_LOG_L4096;
868b2b66 (kx 2024-12-20 16:11:07 +0300 194)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300 195) #endif /* MPU_MATH_FN_LIMIT >= 4096 */
868b2b66 (kx 2024-12-20 16:11:07 +0300 196) #if MPU_MATH_FN_LIMIT >= 8192
868b2b66 (kx 2024-12-20 16:11:07 +0300 197)     case NBR_8192 :
868b2b66 (kx 2024-12-20 16:11:07 +0300 198)       rc = N_LOG_L8192;
868b2b66 (kx 2024-12-20 16:11:07 +0300 199)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300 200) #endif /* MPU_MATH_FN_LIMIT >= 8192 */
868b2b66 (kx 2024-12-20 16:11:07 +0300 201) #if MPU_MATH_FN_LIMIT >= 16384
868b2b66 (kx 2024-12-20 16:11:07 +0300 202)     case NBR_16384:
868b2b66 (kx 2024-12-20 16:11:07 +0300 203)       rc = N_LOG_L16384;
868b2b66 (kx 2024-12-20 16:11:07 +0300 204)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300 205) #endif /* MPU_MATH_FN_LIMIT >= 16384 */
868b2b66 (kx 2024-12-20 16:11:07 +0300 206) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 207)     default:
868b2b66 (kx 2024-12-20 16:11:07 +0300 208)     {
868b2b66 (kx 2024-12-20 16:11:07 +0300 209)       /* error: Invalid size of operand(s) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 210)       __real_error_no = __R_ESIZE__;
868b2b66 (kx 2024-12-20 16:11:07 +0300 211)       __STIND; /* Set REAL ind-produsing operation Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 212)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300 213)     }
868b2b66 (kx 2024-12-20 16:11:07 +0300 214) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 215)   } /* End of switch( nb ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 216) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 217)   return( rc );
868b2b66 (kx 2024-12-20 16:11:07 +0300 218) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 219) } /* End of _get_n_log() */
868b2b66 (kx 2024-12-20 16:11:07 +0300 220) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 221) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 222) static EMUSHORT *_get_log__L_ptr( int nb )
868b2b66 (kx 2024-12-20 16:11:07 +0300 223) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 224)   EMUSHORT *rc = (EMUSHORT *)NULL;
868b2b66 (kx 2024-12-20 16:11:07 +0300 225) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 226)   if( nb < NBR_32 || nb > MPU_MATH_FN_LIMIT )
868b2b66 (kx 2024-12-20 16:11:07 +0300 227)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 228)     /* error: Invalid size of operand(s) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 229)     __real_error_no = __R_ESIZE__;
868b2b66 (kx 2024-12-20 16:11:07 +0300 230)     __STIND; /* Set REAL ind-produsing operation Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 231)     return( rc );
868b2b66 (kx 2024-12-20 16:11:07 +0300 232)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300 233) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 234)   switch( nb )
868b2b66 (kx 2024-12-20 16:11:07 +0300 235)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 236) #if MPU_MATH_FN_LIMIT >= 128
868b2b66 (kx 2024-12-20 16:11:07 +0300 237)     case NBR_32   :
868b2b66 (kx 2024-12-20 16:11:07 +0300 238)     case NBR_64   :
868b2b66 (kx 2024-12-20 16:11:07 +0300 239)     case NBR_128  :
868b2b66 (kx 2024-12-20 16:11:07 +0300 240)       rc = (EMUSHORT *)&_ei_log__L_128_[0][0];
868b2b66 (kx 2024-12-20 16:11:07 +0300 241)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300 242) #endif /* MPU_MATH_FN_LIMIT >= 128 */
868b2b66 (kx 2024-12-20 16:11:07 +0300 243) #if MPU_MATH_FN_LIMIT >= 256
868b2b66 (kx 2024-12-20 16:11:07 +0300 244)     case NBR_256  :
868b2b66 (kx 2024-12-20 16:11:07 +0300 245)       rc = (EMUSHORT *)&_ei_log__L_256_[0][0];
868b2b66 (kx 2024-12-20 16:11:07 +0300 246)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300 247) #endif /* MPU_MATH_FN_LIMIT >= 256 */
868b2b66 (kx 2024-12-20 16:11:07 +0300 248) #if MPU_MATH_FN_LIMIT >= 512
868b2b66 (kx 2024-12-20 16:11:07 +0300 249)     case NBR_512  :
868b2b66 (kx 2024-12-20 16:11:07 +0300 250)       rc = (EMUSHORT *)&_ei_log__L_512_[0][0];
868b2b66 (kx 2024-12-20 16:11:07 +0300 251)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300 252) #endif /* MPU_MATH_FN_LIMIT >= 512 */
868b2b66 (kx 2024-12-20 16:11:07 +0300 253) #if MPU_MATH_FN_LIMIT >= 1024
868b2b66 (kx 2024-12-20 16:11:07 +0300 254)     case NBR_1024 :
868b2b66 (kx 2024-12-20 16:11:07 +0300 255)       rc = (EMUSHORT *)&_ei_log__L_1024_[0][0];
868b2b66 (kx 2024-12-20 16:11:07 +0300 256)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300 257) #endif /* MPU_MATH_FN_LIMIT >= 1024 */
868b2b66 (kx 2024-12-20 16:11:07 +0300 258) #if MPU_MATH_FN_LIMIT >= 2048
868b2b66 (kx 2024-12-20 16:11:07 +0300 259)     case NBR_2048 :
868b2b66 (kx 2024-12-20 16:11:07 +0300 260)       rc = (EMUSHORT *)&_ei_log__L_2048_[0][0];
868b2b66 (kx 2024-12-20 16:11:07 +0300 261)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300 262) #endif /* MPU_MATH_FN_LIMIT >= 2048 */
868b2b66 (kx 2024-12-20 16:11:07 +0300 263) #if MPU_MATH_FN_LIMIT >= 4096
868b2b66 (kx 2024-12-20 16:11:07 +0300 264)     case NBR_4096 :
868b2b66 (kx 2024-12-20 16:11:07 +0300 265)       rc = (EMUSHORT *)&_ei_log__L_4096_[0][0];
868b2b66 (kx 2024-12-20 16:11:07 +0300 266)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300 267) #endif /* MPU_MATH_FN_LIMIT >= 4096 */
868b2b66 (kx 2024-12-20 16:11:07 +0300 268) #if MPU_MATH_FN_LIMIT >= 8192
868b2b66 (kx 2024-12-20 16:11:07 +0300 269)     case NBR_8192 :
868b2b66 (kx 2024-12-20 16:11:07 +0300 270)       rc = (EMUSHORT *)&_ei_log__L_8192_[0][0];
868b2b66 (kx 2024-12-20 16:11:07 +0300 271)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300 272) #endif /* MPU_MATH_FN_LIMIT >= 8192 */
868b2b66 (kx 2024-12-20 16:11:07 +0300 273) #if MPU_MATH_FN_LIMIT >= 16384
868b2b66 (kx 2024-12-20 16:11:07 +0300 274)     case NBR_16384:
868b2b66 (kx 2024-12-20 16:11:07 +0300 275)       rc = (EMUSHORT *)&_ei_log__L_16384_[0][0];
868b2b66 (kx 2024-12-20 16:11:07 +0300 276)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300 277) #endif /* MPU_MATH_FN_LIMIT >= 16384 */
868b2b66 (kx 2024-12-20 16:11:07 +0300 278) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 279)     default:
868b2b66 (kx 2024-12-20 16:11:07 +0300 280)     {
868b2b66 (kx 2024-12-20 16:11:07 +0300 281)       /* error: Invalid size of operand(s) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 282)       __real_error_no = __R_ESIZE__;
868b2b66 (kx 2024-12-20 16:11:07 +0300 283)       __STIND; /* Set REAL ind-produsing operation Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 284)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300 285)     }
868b2b66 (kx 2024-12-20 16:11:07 +0300 286) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 287)   } /* End of switch( nb ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 288) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 289)   return( rc );
868b2b66 (kx 2024-12-20 16:11:07 +0300 290) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 291) } /* End of _get_log__L_ptr() */
868b2b66 (kx 2024-12-20 16:11:07 +0300 292) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 293) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 294) void ei_log__L( EMUSHORT *eiy, EMUSHORT *eix, int nb )
868b2b66 (kx 2024-12-20 16:11:07 +0300 295) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 296) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 297)  Description        : ei_log__L() Работает с
868b2b66 (kx 2024-12-20 16:11:07 +0300 298)                                   internal e-type data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300 299) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 300)                                        log( 1+x ) - 2S
868b2b66 (kx 2024-12-20 16:11:07 +0300 301)  Concepts           : RETURN in EIY = ----------------- 
868b2b66 (kx 2024-12-20 16:11:07 +0300 302)                                               S
868b2b66 (kx 2024-12-20 16:11:07 +0300 303)                                               x
868b2b66 (kx 2024-12-20 16:11:07 +0300 304)                       where EIX = S*S, S = -------,
868b2b66 (kx 2024-12-20 16:11:07 +0300 305)                                             2 + x
868b2b66 (kx 2024-12-20 16:11:07 +0300 306)                       0 <= EIX <= 0.0294372515228594143797... =
868b2b66 (kx 2024-12-20 16:11:07 +0300 307)                                   = (sqrt(2)/(2+sqrt(2)))^4.
868b2b66 (kx 2024-12-20 16:11:07 +0300 308) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 309)  METHOD             : Берем S = x/(2+x) и основываясь на том, что
868b2b66 (kx 2024-12-20 16:11:07 +0300 310) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 311)                             log(1+x) = log(1+S) - log(1-S) =
868b2b66 (kx 2024-12-20 16:11:07 +0300 312)                       = 2*S + (2/3)*S^3 + (2/5)*S^5 + ... = L
868b2b66 (kx 2024-12-20 16:11:07 +0300 313) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 314)                       сможем рассчитать величину (log(1+x)-2*S)/S
868b2b66 (kx 2024-12-20 16:11:07 +0300 315)                       как
868b2b66 (kx 2024-12-20 16:11:07 +0300 316)                                          L - 2*S
868b2b66 (kx 2024-12-20 16:11:07 +0300 317)                                         --------- =
868b2b66 (kx 2024-12-20 16:11:07 +0300 318)                                             S
868b2b66 (kx 2024-12-20 16:11:07 +0300 319) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 320)                          2*S + (2/3)*S^3 + (2/5)*S^5 + ... - 2*S
868b2b66 (kx 2024-12-20 16:11:07 +0300 321)                       = ----------------------------------------- =
868b2b66 (kx 2024-12-20 16:11:07 +0300 322)                                             S
868b2b66 (kx 2024-12-20 16:11:07 +0300 323) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 324)                       = (2/3)*S^2 + (2/5)*S^4 + (2/7)*S^6 + ... .
868b2b66 (kx 2024-12-20 16:11:07 +0300 325) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 326)                       Положив Z = S*S имеем
868b2b66 (kx 2024-12-20 16:11:07 +0300 327) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 328)                       log__L(Z) =
868b2b66 (kx 2024-12-20 16:11:07 +0300 329) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 330)                         = (2/3)*Z + (2/5)*Z^2 + (2/7)*Z^3 + ... =
868b2b66 (kx 2024-12-20 16:11:07 +0300 331) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 332)                         = L1*Z + L2*Z^2 + L3*Z^3 + L4*Z^4 + ... .
868b2b66 (kx 2024-12-20 16:11:07 +0300 333) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 334)                       Create a polinomial approximation to
868b2b66 (kx 2024-12-20 16:11:07 +0300 335)                          log__L(z) =
868b2b66 (kx 2024-12-20 16:11:07 +0300 336)                             = z*(L1 + z*(L2 + z*(L3 + ... )) ... ).
868b2b66 (kx 2024-12-20 16:11:07 +0300 337) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 338)  ACCURACY           : In the absence of rounding error,
868b2b66 (kx 2024-12-20 16:11:07 +0300 339)                       the appriximation has absolute error
868b2b66 (kx 2024-12-20 16:11:07 +0300 340)                       less than EPSILON [see: FLOATP.H].
868b2b66 (kx 2024-12-20 16:11:07 +0300 341) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 342)  NOTE               : The coefficient L's are obtained by
868b2b66 (kx 2024-12-20 16:11:07 +0300 343)                       a special Remez algorithm.
868b2b66 (kx 2024-12-20 16:11:07 +0300 344) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 345)             ===============================================
868b2b66 (kx 2024-12-20 16:11:07 +0300 346)             В INTERNET я нашел следующие алгоритмы:
868b2b66 (kx 2024-12-20 16:11:07 +0300 347) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 348)             409  cacm  355  356 14  5  May 1971 e2 A60
868b2b66 (kx 2024-12-20 16:11:07 +0300 349)             ------------------------------------------
868b2b66 (kx 2024-12-20 16:11:07 +0300 350)                H. Schmitt;
868b2b66 (kx 2024-12-20 16:11:07 +0300 351)                   Discrete {Chebychev} Curve Fit
868b2b66 (kx 2024-12-20 16:11:07 +0300 352)                   approximation;Chebyshev approximation;
868b2b66 (kx 2024-12-20 16:11:07 +0300 353)                   Chebyshev curve fitting;
868b2b66 (kx 2024-12-20 16:11:07 +0300 354)                  +Chebyshev polynomial;
868b2b66 (kx 2024-12-20 16:11:07 +0300 355)                   curve approximation;curve fitting;
868b2b66 (kx 2024-12-20 16:11:07 +0300 356)                   exchange algorithm;
868b2b66 (kx 2024-12-20 16:11:07 +0300 357)                  +polynomial approximation;Remez algorithm;
868b2b66 (kx 2024-12-20 16:11:07 +0300 358) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 359)             501  toms   95   97  2  1  March 1976 e2 F K2
868b2b66 (kx 2024-12-20 16:11:07 +0300 360)             ---------------------------------------------
868b2b66 (kx 2024-12-20 16:11:07 +0300 361)                J. C. Simpson;
868b2b66 (kx 2024-12-20 16:11:07 +0300 362)                   {FORTRAN} Translation of Algorithm 409
868b2b66 (kx 2024-12-20 16:11:07 +0300 363)                   Discrete {Chebyshev} Curve Fit
868b2b66 (kx 2024-12-20 16:11:07 +0300 364)                   approximation;polynomial approximation;
868b2b66 (kx 2024-12-20 16:11:07 +0300 365)                   exchange algorithm;
868b2b66 (kx 2024-12-20 16:11:07 +0300 366)                  +Chebyshev approximation;
868b2b66 (kx 2024-12-20 16:11:07 +0300 367)                   polynomial approximation;
868b2b66 (kx 2024-12-20 16:11:07 +0300 368)                   R,toms,95,4,1,March,1978,F. Futrell;
868b2b66 (kx 2024-12-20 16:11:07 +0300 369) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 370)             последний из которых я перевел на "С", затем
868b2b66 (kx 2024-12-20 16:11:07 +0300 371)             на язык операций повышенной разрядности.
868b2b66 (kx 2024-12-20 16:11:07 +0300 372) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 373)             ===============================================
868b2b66 (kx 2024-12-20 16:11:07 +0300 374)  
868b2b66 (kx 2024-12-20 16:11:07 +0300 375)  Use Global Variable:
868b2b66 (kx 2024-12-20 16:11:07 +0300 376) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 377)  Use Functions      : internal_np( nb );          | real.c
868b2b66 (kx 2024-12-20 16:11:07 +0300 378)                       ei_copy( eiy, eix, nb );    | real.c
868b2b66 (kx 2024-12-20 16:11:07 +0300 379)                       _gen_zero( eic, nb );       | real.c
868b2b66 (kx 2024-12-20 16:11:07 +0300 380)                       ei_add( eic,eia,eib,nb );   | real.c
868b2b66 (kx 2024-12-20 16:11:07 +0300 381)                       ei_mul( eic,eia,eib,nb );   | real.c
868b2b66 (kx 2024-12-20 16:11:07 +0300 382) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 383)  Parameters         : EMUSHORT *eiy; - указатель на
868b2b66 (kx 2024-12-20 16:11:07 +0300 384)                                        internal e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300 385)                                        data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300 386)                                        TARGET;
868b2b66 (kx 2024-12-20 16:11:07 +0300 387)                       EMUSHORT *eix; - указатель на
868b2b66 (kx 2024-12-20 16:11:07 +0300 388)                                        internal e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300 389)                                        data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300 390)                                        SOURCE;
868b2b66 (kx 2024-12-20 16:11:07 +0300 391)                       int nb;        - количество бит в
868b2b66 (kx 2024-12-20 16:11:07 +0300 392)                                        external e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300 393)                                        data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300 394) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 395)  Return             : [void]
868b2b66 (kx 2024-12-20 16:11:07 +0300 396) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 397)  ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 398) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 399)    EMUSHORT *x = NULL, *y = NULL;
868b2b66 (kx 2024-12-20 16:11:07 +0300 400)    EMUSHORT *p;
868b2b66 (kx 2024-12-20 16:11:07 +0300 401)    int       np;
868b2b66 (kx 2024-12-20 16:11:07 +0300 402)    int       i, n = _get_n_log( nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 403) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 404)    np = internal_np( nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 405) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 406)    /*** Allocate memory for x, y . *****************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 407)    x = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 408)    if( !x )
868b2b66 (kx 2024-12-20 16:11:07 +0300 409)    {
868b2b66 (kx 2024-12-20 16:11:07 +0300 410)      /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 411)      return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 412)    }
868b2b66 (kx 2024-12-20 16:11:07 +0300 413) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 414)    y = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 415)    if( !y )
868b2b66 (kx 2024-12-20 16:11:07 +0300 416)    {
868b2b66 (kx 2024-12-20 16:11:07 +0300 417)      /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 418) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 419)      /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 420)      __mpu_sbrk( -(int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 421)      /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 422) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 423)      return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 424)    }
868b2b66 (kx 2024-12-20 16:11:07 +0300 425)    /************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 426) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 427)    _gen_zero( y, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 428)    ei_copy( x, eix, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 429)    p = _get_log__L_ptr( nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 430)    for( i = 0; i < n; i++ )
868b2b66 (kx 2024-12-20 16:11:07 +0300 431)    {
868b2b66 (kx 2024-12-20 16:11:07 +0300 432)      ei_add( y, y, p, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 433)      ei_mul( y, y, x, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 434)      p += np;
868b2b66 (kx 2024-12-20 16:11:07 +0300 435)    }
868b2b66 (kx 2024-12-20 16:11:07 +0300 436) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 437)    ei_copy( eiy, y, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 438) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 439)    /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 440)    /* FREE y *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 441)    __mpu_sbrk( -(int)(2*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 442)    /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 443) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 444) } /* End of ei_log__L() */
868b2b66 (kx 2024-12-20 16:11:07 +0300 445) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 446) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 447) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 448)   Hide internal symbols:
868b2b66 (kx 2024-12-20 16:11:07 +0300 449)  ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 450) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 451) __mpu_hidden_decl(ei_log__L);
868b2b66 (kx 2024-12-20 16:11:07 +0300 452) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 453) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 454) /*
868b2b66 (kx 2024-12-20 16:11:07 +0300 455)   End of hide internal symbols.
868b2b66 (kx 2024-12-20 16:11:07 +0300 456)  ***************************************************************/