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_COSH.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)        COSH 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_cosh_001_emu32lsb.dfn -   128-бит,
868b2b66 (kx 2024-12-20 16:11:07 +0300  65)       ei_cosh_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/cosh/emu00128/ei_cosh_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/cosh/emu00128/ei_cosh_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/cosh/emu00256/ei_cosh_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/cosh/emu00256/ei_cosh_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/cosh/emu00512/ei_cosh_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/cosh/emu00512/ei_cosh_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/cosh/emu01024/ei_cosh_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/cosh/emu01024/ei_cosh_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/cosh/emu02048/ei_cosh_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/cosh/emu02048/ei_cosh_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/cosh/emu04096/ei_cosh_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/cosh/emu04096/ei_cosh_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/cosh/emu08192/ei_cosh_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/cosh/emu08192/ei_cosh_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/cosh/emu16384/ei_cosh_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/cosh/emu16384/ei_cosh_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/cosh/emu32768/ei_cosh_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/cosh/emu32768/ei_cosh_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/cosh/emu65536/ei_cosh_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/cosh/emu65536/ei_cosh_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_cosh( 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_COSH_C128;
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_COSH_C256;
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_COSH_C512;
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_COSH_C1024;
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_COSH_C2048;
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_COSH_C4096;
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_COSH_C8192;
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_COSH_C16384;
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_cosh() */
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_cosh__C_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_cosh__C_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_cosh__C_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_cosh__C_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_cosh__C_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_cosh__C_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_cosh__C_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_cosh__C_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_cosh__C_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_cosh__C_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_cosh__C( 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_cosh__C() Работает с
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)  Concepts           : SEE: ei_exp__E() [polinom Q].
868b2b66 (kx 2024-12-20 16:11:07 +0300 301) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 302)  ACCURACY           : In the absence of rounding error,
868b2b66 (kx 2024-12-20 16:11:07 +0300 303)                       the appriximation has absolute error
868b2b66 (kx 2024-12-20 16:11:07 +0300 304)                       less than EPSILON [see: FLOATP.H].
868b2b66 (kx 2024-12-20 16:11:07 +0300 305) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 306)  NOTE               : The coefficient C's are obtained by
868b2b66 (kx 2024-12-20 16:11:07 +0300 307)                       a special Remez algorithm.
868b2b66 (kx 2024-12-20 16:11:07 +0300 308) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 309)             ===============================================
868b2b66 (kx 2024-12-20 16:11:07 +0300 310)             В INTERNET я нашел следующие алгоритмы:
868b2b66 (kx 2024-12-20 16:11:07 +0300 311) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 312)             409  cacm  355  356 14  5  May 1971 e2 A60
868b2b66 (kx 2024-12-20 16:11:07 +0300 313)             ------------------------------------------
868b2b66 (kx 2024-12-20 16:11:07 +0300 314)                H. Schmitt;
868b2b66 (kx 2024-12-20 16:11:07 +0300 315)                   Discrete {Chebychev} Curve Fit
868b2b66 (kx 2024-12-20 16:11:07 +0300 316)                   approximation;Chebyshev approximation;
868b2b66 (kx 2024-12-20 16:11:07 +0300 317)                   Chebyshev curve fitting;
868b2b66 (kx 2024-12-20 16:11:07 +0300 318)                  +Chebyshev polynomial;
868b2b66 (kx 2024-12-20 16:11:07 +0300 319)                   curve approximation;curve fitting;
868b2b66 (kx 2024-12-20 16:11:07 +0300 320)                   exchange algorithm;
868b2b66 (kx 2024-12-20 16:11:07 +0300 321)                  +polynomial approximation;Remez algorithm;
868b2b66 (kx 2024-12-20 16:11:07 +0300 322) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 323)             501  toms   95   97  2  1  March 1976 e2 F K2
868b2b66 (kx 2024-12-20 16:11:07 +0300 324)             ---------------------------------------------
868b2b66 (kx 2024-12-20 16:11:07 +0300 325)                J. C. Simpson;
868b2b66 (kx 2024-12-20 16:11:07 +0300 326)                   {FORTRAN} Translation of Algorithm 409
868b2b66 (kx 2024-12-20 16:11:07 +0300 327)                   Discrete {Chebyshev} Curve Fit
868b2b66 (kx 2024-12-20 16:11:07 +0300 328)                   approximation;polynomial approximation;
868b2b66 (kx 2024-12-20 16:11:07 +0300 329)                   exchange algorithm;
868b2b66 (kx 2024-12-20 16:11:07 +0300 330)                  +Chebyshev approximation;
868b2b66 (kx 2024-12-20 16:11:07 +0300 331)                   polynomial approximation;
868b2b66 (kx 2024-12-20 16:11:07 +0300 332)                   R,toms,95,4,1,March,1978,F. Futrell;
868b2b66 (kx 2024-12-20 16:11:07 +0300 333) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 334)             последний из которых я перевел на "С", затем
868b2b66 (kx 2024-12-20 16:11:07 +0300 335)             на язык операций повышенной разрядности.
868b2b66 (kx 2024-12-20 16:11:07 +0300 336) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 337)             ===============================================
868b2b66 (kx 2024-12-20 16:11:07 +0300 338) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 339)  Use Global Variable:
868b2b66 (kx 2024-12-20 16:11:07 +0300 340) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 341)  Use Functions      : internal_np( nb );          | real.c
868b2b66 (kx 2024-12-20 16:11:07 +0300 342)                       ei_copy( eiy, eix, nb );    | real.c
868b2b66 (kx 2024-12-20 16:11:07 +0300 343)                       _gen_zero( eic, nb );       | real.c
868b2b66 (kx 2024-12-20 16:11:07 +0300 344)                       ei_add( eic,eia,eib,nb );   | real.c
868b2b66 (kx 2024-12-20 16:11:07 +0300 345)                       ei_mul( eic,eia,eib,nb );   | real.c
868b2b66 (kx 2024-12-20 16:11:07 +0300 346) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 347)  Parameters         : EMUSHORT *eiy; - указатель на
868b2b66 (kx 2024-12-20 16:11:07 +0300 348)                                        internal e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300 349)                                        data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300 350)                                        TARGET;
868b2b66 (kx 2024-12-20 16:11:07 +0300 351)                       EMUSHORT *eix; - указатель на
868b2b66 (kx 2024-12-20 16:11:07 +0300 352)                                        internal e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300 353)                                        data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300 354)                                        SOURCE;
868b2b66 (kx 2024-12-20 16:11:07 +0300 355)                       int nb;        - количество бит в
868b2b66 (kx 2024-12-20 16:11:07 +0300 356)                                        external e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300 357)                                        data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300 358) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 359)  Return             : [void]
868b2b66 (kx 2024-12-20 16:11:07 +0300 360) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 361)  ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 362) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 363)    EMUSHORT *x = NULL, *y = NULL;
868b2b66 (kx 2024-12-20 16:11:07 +0300 364)    EMUSHORT *p;
868b2b66 (kx 2024-12-20 16:11:07 +0300 365)    int       np;
868b2b66 (kx 2024-12-20 16:11:07 +0300 366)    int       i, n = _get_n_cosh( nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 367) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 368)    np = internal_np( nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 369) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 370)    /*** Allocate memory for x, y . *****************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 371)    x = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 372)    if( !x )
868b2b66 (kx 2024-12-20 16:11:07 +0300 373)    {
868b2b66 (kx 2024-12-20 16:11:07 +0300 374)      /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 375)      return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 376)    }
868b2b66 (kx 2024-12-20 16:11:07 +0300 377) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 378)    y = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 379)    if( !y )
868b2b66 (kx 2024-12-20 16:11:07 +0300 380)    {
868b2b66 (kx 2024-12-20 16:11:07 +0300 381)      /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 382) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 383)      /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 384)      __mpu_sbrk( -(int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 385)      /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 386) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 387)      return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 388)    }
868b2b66 (kx 2024-12-20 16:11:07 +0300 389)    /************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 390) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 391)    _gen_zero( y, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 392)    ei_copy( x, eix, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 393)    p = _get_cosh__C_ptr( nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 394)    for( i = 0; i < n; i++ )
868b2b66 (kx 2024-12-20 16:11:07 +0300 395)    {
868b2b66 (kx 2024-12-20 16:11:07 +0300 396)      ei_add( y, y, p, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 397)      ei_mul( y, y, x, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 398)      p += np;
868b2b66 (kx 2024-12-20 16:11:07 +0300 399)    }
868b2b66 (kx 2024-12-20 16:11:07 +0300 400) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 401)    ei_copy( eiy, y, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 402) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 403)    /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 404)    /* FREE y *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 405)    __mpu_sbrk( -(int)(2*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 406)    /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 407) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 408) } /* End of ei_cosh__C() */
868b2b66 (kx 2024-12-20 16:11:07 +0300 409) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 410) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 411) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 412)   Hide internal symbols:
868b2b66 (kx 2024-12-20 16:11:07 +0300 413)  ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 414) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 415) __mpu_hidden_decl(ei_cosh__C);
868b2b66 (kx 2024-12-20 16:11:07 +0300 416) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 417) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 418) /*
868b2b66 (kx 2024-12-20 16:11:07 +0300 419)   End of hide internal symbols.
868b2b66 (kx 2024-12-20 16:11:07 +0300 420)  ***************************************************************/