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_IOREAL.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)        REAL input/output 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) #include <mpu-ioreal.h>
868b2b66 (kx 2024-12-20 16:11:07 +0300   35) 
868b2b66 (kx 2024-12-20 16:11:07 +0300   36) #include <mpu-char.h>
868b2b66 (kx 2024-12-20 16:11:07 +0300   37) #include <mpu-symbols.h>
868b2b66 (kx 2024-12-20 16:11:07 +0300   38) 
868b2b66 (kx 2024-12-20 16:11:07 +0300   39) #include <mpu-math-errno.h>
868b2b66 (kx 2024-12-20 16:11:07 +0300   40) #include <mpu-mtherr.h>
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) #define NTEN_128      28
868b2b66 (kx 2024-12-20 16:11:07 +0300   44) #define NTEN_256      28
868b2b66 (kx 2024-12-20 16:11:07 +0300   45) 
868b2b66 (kx 2024-12-20 16:11:07 +0300   46) #define NTEN_512      60
868b2b66 (kx 2024-12-20 16:11:07 +0300   47) #define NTEN_1024     60
868b2b66 (kx 2024-12-20 16:11:07 +0300   48) 
868b2b66 (kx 2024-12-20 16:11:07 +0300   49) #define NTEN_2048    124
868b2b66 (kx 2024-12-20 16:11:07 +0300   50) #define NTEN_4096    124
868b2b66 (kx 2024-12-20 16:11:07 +0300   51) 
868b2b66 (kx 2024-12-20 16:11:07 +0300   52) #define NTEN_8192    252
868b2b66 (kx 2024-12-20 16:11:07 +0300   53) #define NTEN_16384   252
868b2b66 (kx 2024-12-20 16:11:07 +0300   54) 
868b2b66 (kx 2024-12-20 16:11:07 +0300   55) #define NTEN_32768   508
868b2b66 (kx 2024-12-20 16:11:07 +0300   56) #define NTEN_65536   508
868b2b66 (kx 2024-12-20 16:11:07 +0300   57) 
868b2b66 (kx 2024-12-20 16:11:07 +0300   58) #define NTEN_131072 1020
868b2b66 (kx 2024-12-20 16:11:07 +0300   59) 
868b2b66 (kx 2024-12-20 16:11:07 +0300   60) 
868b2b66 (kx 2024-12-20 16:11:07 +0300   61) static int _get_nten( int nb )
868b2b66 (kx 2024-12-20 16:11:07 +0300   62) {
868b2b66 (kx 2024-12-20 16:11:07 +0300   63)   int  rc = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300   64) 
868b2b66 (kx 2024-12-20 16:11:07 +0300   65)   if( nb < NBR_32 || nb > MPU_REAL_IO_LIMIT )
868b2b66 (kx 2024-12-20 16:11:07 +0300   66)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300   67)     /* error: Invalid size of operand(s) */
868b2b66 (kx 2024-12-20 16:11:07 +0300   68)     __real_error_no = __R_ESIZE__;
868b2b66 (kx 2024-12-20 16:11:07 +0300   69)     __STIND; /* Set REAL ind-produsing operation Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300   70)     return( rc );
868b2b66 (kx 2024-12-20 16:11:07 +0300   71)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300   72) 
868b2b66 (kx 2024-12-20 16:11:07 +0300   73)   switch( nb )
868b2b66 (kx 2024-12-20 16:11:07 +0300   74)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300   75)     case NBR_32   :
868b2b66 (kx 2024-12-20 16:11:07 +0300   76)     case NBR_64   :
868b2b66 (kx 2024-12-20 16:11:07 +0300   77)     case NBR_128  :
868b2b66 (kx 2024-12-20 16:11:07 +0300   78)        rc = NTEN_128;
868b2b66 (kx 2024-12-20 16:11:07 +0300   79)        break;
868b2b66 (kx 2024-12-20 16:11:07 +0300   80)     case NBR_256  :
868b2b66 (kx 2024-12-20 16:11:07 +0300   81)        rc = NTEN_256;
868b2b66 (kx 2024-12-20 16:11:07 +0300   82)        break;
868b2b66 (kx 2024-12-20 16:11:07 +0300   83)     case NBR_512  :
868b2b66 (kx 2024-12-20 16:11:07 +0300   84)        rc = NTEN_512;
868b2b66 (kx 2024-12-20 16:11:07 +0300   85)        break;
868b2b66 (kx 2024-12-20 16:11:07 +0300   86)     case NBR_1024 :
868b2b66 (kx 2024-12-20 16:11:07 +0300   87)        rc = NTEN_1024;
868b2b66 (kx 2024-12-20 16:11:07 +0300   88)        break;
868b2b66 (kx 2024-12-20 16:11:07 +0300   89)     case NBR_2048 :
868b2b66 (kx 2024-12-20 16:11:07 +0300   90)        rc = NTEN_2048;
868b2b66 (kx 2024-12-20 16:11:07 +0300   91)        break;
868b2b66 (kx 2024-12-20 16:11:07 +0300   92)     case NBR_4096 :
868b2b66 (kx 2024-12-20 16:11:07 +0300   93)        rc = NTEN_4096;
868b2b66 (kx 2024-12-20 16:11:07 +0300   94)        break;
868b2b66 (kx 2024-12-20 16:11:07 +0300   95)     case NBR_8192 :
868b2b66 (kx 2024-12-20 16:11:07 +0300   96)        rc = NTEN_8192;
868b2b66 (kx 2024-12-20 16:11:07 +0300   97)        break;
868b2b66 (kx 2024-12-20 16:11:07 +0300   98)     case NBR_16384:
868b2b66 (kx 2024-12-20 16:11:07 +0300   99)        rc = NTEN_16384;
868b2b66 (kx 2024-12-20 16:11:07 +0300  100)        break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  101)     case NBR_32768:
868b2b66 (kx 2024-12-20 16:11:07 +0300  102)        rc = NTEN_32768;
868b2b66 (kx 2024-12-20 16:11:07 +0300  103)        break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  104)     case NBR_65536:
868b2b66 (kx 2024-12-20 16:11:07 +0300  105)        rc = NTEN_65536;
868b2b66 (kx 2024-12-20 16:11:07 +0300  106)        break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  107) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  108)     default:
868b2b66 (kx 2024-12-20 16:11:07 +0300  109)     {
868b2b66 (kx 2024-12-20 16:11:07 +0300  110)        /* error: Invalid size of operand(s) */
868b2b66 (kx 2024-12-20 16:11:07 +0300  111)        __real_error_no = __R_ESIZE__;
868b2b66 (kx 2024-12-20 16:11:07 +0300  112)        __STIND; /* Set REAL ind-produsing operation Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300  113)        break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  114)     }
868b2b66 (kx 2024-12-20 16:11:07 +0300  115) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  116)   } /* End of switch( nb ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300  117) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  118)   return( rc );
868b2b66 (kx 2024-12-20 16:11:07 +0300  119) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  120) } /* End of _get_nten() */
868b2b66 (kx 2024-12-20 16:11:07 +0300  121) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  122) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  123) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300  124)   Кодировка имен файлов:
868b2b66 (kx 2024-12-20 16:11:07 +0300  125) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  126)   Трехзначное десятичное число, представляющее количество
868b2b66 (kx 2024-12-20 16:11:07 +0300  127)   128-и битных слов, из которых состоят вещественные числа
868b2b66 (kx 2024-12-20 16:11:07 +0300  128)   размещенные в массивах:
868b2b66 (kx 2024-12-20 16:11:07 +0300  129) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  130)     размер чисел в битах  кодировка
868b2b66 (kx 2024-12-20 16:11:07 +0300  131)     --------------------  ---------
868b2b66 (kx 2024-12-20 16:11:07 +0300  132)                      128  001
868b2b66 (kx 2024-12-20 16:11:07 +0300  133)                      256  002
868b2b66 (kx 2024-12-20 16:11:07 +0300  134)                      512  004
868b2b66 (kx 2024-12-20 16:11:07 +0300  135)                     1024  008
868b2b66 (kx 2024-12-20 16:11:07 +0300  136)                     2048  016
868b2b66 (kx 2024-12-20 16:11:07 +0300  137)                     4096  032
868b2b66 (kx 2024-12-20 16:11:07 +0300  138)                     8192  064
868b2b66 (kx 2024-12-20 16:11:07 +0300  139)                    16384  128
868b2b66 (kx 2024-12-20 16:11:07 +0300  140)                    32768  256
868b2b66 (kx 2024-12-20 16:11:07 +0300  141)                    65536  512 (это предел);
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)     -------
868b2b66 (kx 2024-12-20 16:11:07 +0300  145)       ei_mtens_001_emu32lsb.dfn -   128-бит,
868b2b66 (kx 2024-12-20 16:11:07 +0300  146)       ei_mtens_512_emu32lsb.dfn - 65536-бит.
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) #if MPU_REAL_IO_LIMIT >= 128
868b2b66 (kx 2024-12-20 16:11:07 +0300  151) #if MPU_WORD_ORDER_BIG_ENDIAN == 0
868b2b66 (kx 2024-12-20 16:11:07 +0300  152) #include <etens/emu00128/ei_mtens_001_emu32lsb.dfn>
868b2b66 (kx 2024-12-20 16:11:07 +0300  153) #include <etens/emu00128/ei_ptens_001_emu32lsb.dfn>
868b2b66 (kx 2024-12-20 16:11:07 +0300  154) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300  155) #include <etens/emu00128/ei_mtens_001_emu32msb.dfn>
868b2b66 (kx 2024-12-20 16:11:07 +0300  156) #include <etens/emu00128/ei_ptens_001_emu32msb.dfn>
868b2b66 (kx 2024-12-20 16:11:07 +0300  157) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  158) #endif /* MPU_REAL_IO_LIMIT >= 128 */
868b2b66 (kx 2024-12-20 16:11:07 +0300  159) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  160) #if MPU_REAL_IO_LIMIT >= 256
868b2b66 (kx 2024-12-20 16:11:07 +0300  161) #if MPU_WORD_ORDER_BIG_ENDIAN == 0
868b2b66 (kx 2024-12-20 16:11:07 +0300  162) #include <etens/emu00256/ei_mtens_002_emu32lsb.dfn>
868b2b66 (kx 2024-12-20 16:11:07 +0300  163) #include <etens/emu00256/ei_ptens_002_emu32lsb.dfn>
868b2b66 (kx 2024-12-20 16:11:07 +0300  164) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300  165) #include <etens/emu00256/ei_mtens_002_emu32msb.dfn>
868b2b66 (kx 2024-12-20 16:11:07 +0300  166) #include <etens/emu00256/ei_ptens_002_emu32msb.dfn>
868b2b66 (kx 2024-12-20 16:11:07 +0300  167) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  168) #endif /* MPU_REAL_IO_LIMIT >= 256 */
868b2b66 (kx 2024-12-20 16:11:07 +0300  169) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  170) #if MPU_REAL_IO_LIMIT >= 512
868b2b66 (kx 2024-12-20 16:11:07 +0300  171) #if MPU_WORD_ORDER_BIG_ENDIAN == 0
868b2b66 (kx 2024-12-20 16:11:07 +0300  172) #include <etens/emu00512/ei_mtens_004_emu32lsb.dfn>
868b2b66 (kx 2024-12-20 16:11:07 +0300  173) #include <etens/emu00512/ei_ptens_004_emu32lsb.dfn>
868b2b66 (kx 2024-12-20 16:11:07 +0300  174) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300  175) #include <etens/emu00512/ei_mtens_004_emu32msb.dfn>
868b2b66 (kx 2024-12-20 16:11:07 +0300  176) #include <etens/emu00512/ei_ptens_004_emu32msb.dfn>
868b2b66 (kx 2024-12-20 16:11:07 +0300  177) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  178) #endif /* MPU_REAL_IO_LIMIT >= 512 */
868b2b66 (kx 2024-12-20 16:11:07 +0300  179) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  180) #if MPU_REAL_IO_LIMIT >= 1024
868b2b66 (kx 2024-12-20 16:11:07 +0300  181) #if MPU_WORD_ORDER_BIG_ENDIAN == 0
868b2b66 (kx 2024-12-20 16:11:07 +0300  182) #include <etens/emu01024/ei_mtens_008_emu32lsb.dfn>
868b2b66 (kx 2024-12-20 16:11:07 +0300  183) #include <etens/emu01024/ei_ptens_008_emu32lsb.dfn>
868b2b66 (kx 2024-12-20 16:11:07 +0300  184) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300  185) #include <etens/emu01024/ei_mtens_008_emu32msb.dfn>
868b2b66 (kx 2024-12-20 16:11:07 +0300  186) #include <etens/emu01024/ei_ptens_008_emu32msb.dfn>
868b2b66 (kx 2024-12-20 16:11:07 +0300  187) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  188) #endif /* MPU_REAL_IO_LIMIT >= 1024 */
868b2b66 (kx 2024-12-20 16:11:07 +0300  189) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  190) #if MPU_REAL_IO_LIMIT >= 2048
868b2b66 (kx 2024-12-20 16:11:07 +0300  191) #if MPU_WORD_ORDER_BIG_ENDIAN == 0
868b2b66 (kx 2024-12-20 16:11:07 +0300  192) #include <etens/emu02048/ei_mtens_016_emu32lsb.dfn>
868b2b66 (kx 2024-12-20 16:11:07 +0300  193) #include <etens/emu02048/ei_ptens_016_emu32lsb.dfn>
868b2b66 (kx 2024-12-20 16:11:07 +0300  194) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300  195) #include <etens/emu02048/ei_mtens_016_emu32msb.dfn>
868b2b66 (kx 2024-12-20 16:11:07 +0300  196) #include <etens/emu02048/ei_ptens_016_emu32msb.dfn>
868b2b66 (kx 2024-12-20 16:11:07 +0300  197) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  198) #endif /* MPU_REAL_IO_LIMIT >= 2048 */
868b2b66 (kx 2024-12-20 16:11:07 +0300  199) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  200) #if MPU_REAL_IO_LIMIT >= 4096
868b2b66 (kx 2024-12-20 16:11:07 +0300  201) #if MPU_WORD_ORDER_BIG_ENDIAN == 0
868b2b66 (kx 2024-12-20 16:11:07 +0300  202) #include <etens/emu04096/ei_mtens_032_emu32lsb.dfn>
868b2b66 (kx 2024-12-20 16:11:07 +0300  203) #include <etens/emu04096/ei_ptens_032_emu32lsb.dfn>
868b2b66 (kx 2024-12-20 16:11:07 +0300  204) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300  205) #include <etens/emu04096/ei_mtens_032_emu32msb.dfn>
868b2b66 (kx 2024-12-20 16:11:07 +0300  206) #include <etens/emu04096/ei_ptens_032_emu32msb.dfn>
868b2b66 (kx 2024-12-20 16:11:07 +0300  207) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  208) #endif /* MPU_REAL_IO_LIMIT >= 4096 */
868b2b66 (kx 2024-12-20 16:11:07 +0300  209) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  210) #if MPU_REAL_IO_LIMIT >= 8192
868b2b66 (kx 2024-12-20 16:11:07 +0300  211) #if MPU_WORD_ORDER_BIG_ENDIAN == 0
868b2b66 (kx 2024-12-20 16:11:07 +0300  212) #include <etens/emu08192/ei_mtens_064_emu32lsb.dfn>
868b2b66 (kx 2024-12-20 16:11:07 +0300  213) #include <etens/emu08192/ei_ptens_064_emu32lsb.dfn>
868b2b66 (kx 2024-12-20 16:11:07 +0300  214) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300  215) #include <etens/emu08192/ei_mtens_064_emu32msb.dfn>
868b2b66 (kx 2024-12-20 16:11:07 +0300  216) #include <etens/emu08192/ei_ptens_064_emu32msb.dfn>
868b2b66 (kx 2024-12-20 16:11:07 +0300  217) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  218) #endif /* MPU_REAL_IO_LIMIT >= 8192 */
868b2b66 (kx 2024-12-20 16:11:07 +0300  219) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  220) #if MPU_REAL_IO_LIMIT >= 16384
868b2b66 (kx 2024-12-20 16:11:07 +0300  221) #if MPU_WORD_ORDER_BIG_ENDIAN == 0
868b2b66 (kx 2024-12-20 16:11:07 +0300  222) #include <etens/emu16384/ei_mtens_128_emu32lsb.dfn>
868b2b66 (kx 2024-12-20 16:11:07 +0300  223) #include <etens/emu16384/ei_ptens_128_emu32lsb.dfn>
868b2b66 (kx 2024-12-20 16:11:07 +0300  224) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300  225) #include <etens/emu16384/ei_mtens_128_emu32msb.dfn>
868b2b66 (kx 2024-12-20 16:11:07 +0300  226) #include <etens/emu16384/ei_ptens_128_emu32msb.dfn>
868b2b66 (kx 2024-12-20 16:11:07 +0300  227) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  228) #endif /* MPU_REAL_IO_LIMIT >= 16384 */
868b2b66 (kx 2024-12-20 16:11:07 +0300  229) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  230) #if MPU_REAL_IO_LIMIT >= 32768
868b2b66 (kx 2024-12-20 16:11:07 +0300  231) #if MPU_WORD_ORDER_BIG_ENDIAN == 0
868b2b66 (kx 2024-12-20 16:11:07 +0300  232) #include <etens/emu32768/ei_mtens_256_emu32lsb.dfn>
868b2b66 (kx 2024-12-20 16:11:07 +0300  233) #include <etens/emu32768/ei_ptens_256_emu32lsb.dfn>
868b2b66 (kx 2024-12-20 16:11:07 +0300  234) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300  235) #include <etens/emu32768/ei_mtens_256_emu32msb.dfn>
868b2b66 (kx 2024-12-20 16:11:07 +0300  236) #include <etens/emu32768/ei_ptens_256_emu32msb.dfn>
868b2b66 (kx 2024-12-20 16:11:07 +0300  237) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  238) #endif /* MPU_REAL_IO_LIMIT >= 32768 */
868b2b66 (kx 2024-12-20 16:11:07 +0300  239) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  240) #if MPU_REAL_IO_LIMIT >= 65536
868b2b66 (kx 2024-12-20 16:11:07 +0300  241) #if MPU_WORD_ORDER_BIG_ENDIAN == 0
868b2b66 (kx 2024-12-20 16:11:07 +0300  242) #include <etens/emu65536/ei_mtens_512_emu32lsb.dfn>
868b2b66 (kx 2024-12-20 16:11:07 +0300  243) #include <etens/emu65536/ei_ptens_512_emu32lsb.dfn>
868b2b66 (kx 2024-12-20 16:11:07 +0300  244) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300  245) #include <etens/emu65536/ei_mtens_512_emu32msb.dfn>
868b2b66 (kx 2024-12-20 16:11:07 +0300  246) #include <etens/emu65536/ei_ptens_512_emu32msb.dfn>
868b2b66 (kx 2024-12-20 16:11:07 +0300  247) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  248) #endif /* MPU_REAL_IO_LIMIT >= 65536 */
868b2b66 (kx 2024-12-20 16:11:07 +0300  249) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  250) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  251) static EMUSHORT *_get_tens_ptr( int nb )
868b2b66 (kx 2024-12-20 16:11:07 +0300  252) {
868b2b66 (kx 2024-12-20 16:11:07 +0300  253)   EMUSHORT *rc = (EMUSHORT *)NULL;
868b2b66 (kx 2024-12-20 16:11:07 +0300  254) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  255)   if( nb < NBR_32 || nb > MPU_REAL_IO_LIMIT )
868b2b66 (kx 2024-12-20 16:11:07 +0300  256)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  257)     /* error: Invalid size of operand(s) */
868b2b66 (kx 2024-12-20 16:11:07 +0300  258)     __real_error_no = __R_ESIZE__;
868b2b66 (kx 2024-12-20 16:11:07 +0300  259)     __STIND; /* Set REAL ind-produsing operation Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300  260)     return( rc );
868b2b66 (kx 2024-12-20 16:11:07 +0300  261)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300  262) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  263)   switch( nb )
868b2b66 (kx 2024-12-20 16:11:07 +0300  264)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  265) #if MPU_REAL_IO_LIMIT >= 128
868b2b66 (kx 2024-12-20 16:11:07 +0300  266)     case NBR_32   :
868b2b66 (kx 2024-12-20 16:11:07 +0300  267)     case NBR_64   :
868b2b66 (kx 2024-12-20 16:11:07 +0300  268)     case NBR_128  :
868b2b66 (kx 2024-12-20 16:11:07 +0300  269)       rc =   (EMUSHORT *)&_ei_tens_128_[0][0];
868b2b66 (kx 2024-12-20 16:11:07 +0300  270)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  271) #endif /* MPU_REAL_IO_LIMIT >= 128 */
868b2b66 (kx 2024-12-20 16:11:07 +0300  272) #if MPU_REAL_IO_LIMIT >= 256
868b2b66 (kx 2024-12-20 16:11:07 +0300  273)     case NBR_256  :
868b2b66 (kx 2024-12-20 16:11:07 +0300  274)       rc =   (EMUSHORT *)&_ei_tens_256_[0][0];
868b2b66 (kx 2024-12-20 16:11:07 +0300  275)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  276) #endif /* MPU_REAL_IO_LIMIT >= 256 */
868b2b66 (kx 2024-12-20 16:11:07 +0300  277) #if MPU_REAL_IO_LIMIT >= 512
868b2b66 (kx 2024-12-20 16:11:07 +0300  278)     case NBR_512  :
868b2b66 (kx 2024-12-20 16:11:07 +0300  279)       rc =   (EMUSHORT *)&_ei_tens_512_[0][0];
868b2b66 (kx 2024-12-20 16:11:07 +0300  280)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  281) #endif /* MPU_REAL_IO_LIMIT >= 512 */
868b2b66 (kx 2024-12-20 16:11:07 +0300  282) #if MPU_REAL_IO_LIMIT >= 1024
868b2b66 (kx 2024-12-20 16:11:07 +0300  283)     case NBR_1024 :
868b2b66 (kx 2024-12-20 16:11:07 +0300  284)       rc =  (EMUSHORT *)&_ei_tens_1024_[0][0];
868b2b66 (kx 2024-12-20 16:11:07 +0300  285)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  286) #endif /* MPU_REAL_IO_LIMIT >= 1024 */
868b2b66 (kx 2024-12-20 16:11:07 +0300  287) #if MPU_REAL_IO_LIMIT >= 2048
868b2b66 (kx 2024-12-20 16:11:07 +0300  288)     case NBR_2048 :
868b2b66 (kx 2024-12-20 16:11:07 +0300  289)       rc =  (EMUSHORT *)&_ei_tens_2048_[0][0];
868b2b66 (kx 2024-12-20 16:11:07 +0300  290)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  291) #endif /* MPU_REAL_IO_LIMIT >= 2048 */
868b2b66 (kx 2024-12-20 16:11:07 +0300  292) #if MPU_REAL_IO_LIMIT >= 4096
868b2b66 (kx 2024-12-20 16:11:07 +0300  293)     case NBR_4096 :
868b2b66 (kx 2024-12-20 16:11:07 +0300  294)       rc =  (EMUSHORT *)&_ei_tens_4096_[0][0];
868b2b66 (kx 2024-12-20 16:11:07 +0300  295)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  296) #endif /* MPU_REAL_IO_LIMIT >= 4096 */
868b2b66 (kx 2024-12-20 16:11:07 +0300  297) #if MPU_REAL_IO_LIMIT >= 8192
868b2b66 (kx 2024-12-20 16:11:07 +0300  298)     case NBR_8192 :
868b2b66 (kx 2024-12-20 16:11:07 +0300  299)       rc =  (EMUSHORT *)&_ei_tens_8192_[0][0];
868b2b66 (kx 2024-12-20 16:11:07 +0300  300)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  301) #endif /* MPU_REAL_IO_LIMIT >= 8192 */
868b2b66 (kx 2024-12-20 16:11:07 +0300  302) #if MPU_REAL_IO_LIMIT >= 16384
868b2b66 (kx 2024-12-20 16:11:07 +0300  303)     case NBR_16384:
868b2b66 (kx 2024-12-20 16:11:07 +0300  304)       rc = (EMUSHORT *)&_ei_tens_16384_[0][0];
868b2b66 (kx 2024-12-20 16:11:07 +0300  305)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  306) #endif /* MPU_REAL_IO_LIMIT >= 16384 */
868b2b66 (kx 2024-12-20 16:11:07 +0300  307) #if MPU_REAL_IO_LIMIT >= 32768
868b2b66 (kx 2024-12-20 16:11:07 +0300  308)     case NBR_32768:
868b2b66 (kx 2024-12-20 16:11:07 +0300  309)       rc = (EMUSHORT *)&_ei_tens_32768_[0][0];
868b2b66 (kx 2024-12-20 16:11:07 +0300  310)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  311) #endif /* MPU_REAL_IO_LIMIT >= 32768 */
868b2b66 (kx 2024-12-20 16:11:07 +0300  312) #if MPU_REAL_IO_LIMIT >= 65536
868b2b66 (kx 2024-12-20 16:11:07 +0300  313)     case NBR_65536:
868b2b66 (kx 2024-12-20 16:11:07 +0300  314)       rc = (EMUSHORT *)&_ei_tens_65536_[0][0];
868b2b66 (kx 2024-12-20 16:11:07 +0300  315)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  316) #endif /* MPU_REAL_IO_LIMIT >= 65536 */
868b2b66 (kx 2024-12-20 16:11:07 +0300  317) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  318)     default:
868b2b66 (kx 2024-12-20 16:11:07 +0300  319)     {
868b2b66 (kx 2024-12-20 16:11:07 +0300  320)       /* error: Invalid size of operand(s) */
868b2b66 (kx 2024-12-20 16:11:07 +0300  321)       __real_error_no = __R_ESIZE__;
868b2b66 (kx 2024-12-20 16:11:07 +0300  322)       __STIND; /* Set REAL ind-produsing operation Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300  323)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  324)     }
868b2b66 (kx 2024-12-20 16:11:07 +0300  325) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  326)   } /* End of switch( nb ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300  327) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  328)   return( rc );
868b2b66 (kx 2024-12-20 16:11:07 +0300  329) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  330) } /* End of _get_tens_ptr() */
868b2b66 (kx 2024-12-20 16:11:07 +0300  331) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  332) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  333) static EMUSHORT *_get_mtens_ptr( int nb )
868b2b66 (kx 2024-12-20 16:11:07 +0300  334) {
868b2b66 (kx 2024-12-20 16:11:07 +0300  335)   EMUSHORT *rc = (EMUSHORT *)NULL;
868b2b66 (kx 2024-12-20 16:11:07 +0300  336) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  337)   if( nb < NBR_32 || nb > MPU_REAL_IO_LIMIT )
868b2b66 (kx 2024-12-20 16:11:07 +0300  338)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  339)     /* error: Invalid size of operand(s) */
868b2b66 (kx 2024-12-20 16:11:07 +0300  340)     __real_error_no = __R_ESIZE__;
868b2b66 (kx 2024-12-20 16:11:07 +0300  341)     __STIND; /* Set REAL ind-produsing operation Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300  342)     return( rc );
868b2b66 (kx 2024-12-20 16:11:07 +0300  343)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300  344) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  345)   switch( nb )
868b2b66 (kx 2024-12-20 16:11:07 +0300  346)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  347) #if MPU_REAL_IO_LIMIT >= 128
868b2b66 (kx 2024-12-20 16:11:07 +0300  348)     case NBR_32   :
868b2b66 (kx 2024-12-20 16:11:07 +0300  349)     case NBR_64   :
868b2b66 (kx 2024-12-20 16:11:07 +0300  350)     case NBR_128  :
868b2b66 (kx 2024-12-20 16:11:07 +0300  351)       rc =   (EMUSHORT *)&_ei_mtens_128_[0][0];
868b2b66 (kx 2024-12-20 16:11:07 +0300  352)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  353) #endif /* MPU_REAL_IO_LIMIT >= 128 */
868b2b66 (kx 2024-12-20 16:11:07 +0300  354) #if MPU_REAL_IO_LIMIT >= 256
868b2b66 (kx 2024-12-20 16:11:07 +0300  355)     case NBR_256  :
868b2b66 (kx 2024-12-20 16:11:07 +0300  356)       rc =   (EMUSHORT *)&_ei_mtens_256_[0][0];
868b2b66 (kx 2024-12-20 16:11:07 +0300  357)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  358) #endif /* MPU_REAL_IO_LIMIT >= 256 */
868b2b66 (kx 2024-12-20 16:11:07 +0300  359) #if MPU_REAL_IO_LIMIT >= 512
868b2b66 (kx 2024-12-20 16:11:07 +0300  360)     case NBR_512  :
868b2b66 (kx 2024-12-20 16:11:07 +0300  361)       rc =   (EMUSHORT *)&_ei_mtens_512_[0][0];
868b2b66 (kx 2024-12-20 16:11:07 +0300  362)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  363) #endif /* MPU_REAL_IO_LIMIT >= 512 */
868b2b66 (kx 2024-12-20 16:11:07 +0300  364) #if MPU_REAL_IO_LIMIT >= 1024
868b2b66 (kx 2024-12-20 16:11:07 +0300  365)     case NBR_1024 :
868b2b66 (kx 2024-12-20 16:11:07 +0300  366)       rc =  (EMUSHORT *)&_ei_mtens_1024_[0][0];
868b2b66 (kx 2024-12-20 16:11:07 +0300  367)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  368) #endif /* MPU_REAL_IO_LIMIT >= 1024 */
868b2b66 (kx 2024-12-20 16:11:07 +0300  369) #if MPU_REAL_IO_LIMIT >= 2048
868b2b66 (kx 2024-12-20 16:11:07 +0300  370)     case NBR_2048 :
868b2b66 (kx 2024-12-20 16:11:07 +0300  371)       rc =  (EMUSHORT *)&_ei_mtens_2048_[0][0];
868b2b66 (kx 2024-12-20 16:11:07 +0300  372)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  373) #endif /* MPU_REAL_IO_LIMIT >= 2048 */
868b2b66 (kx 2024-12-20 16:11:07 +0300  374) #if MPU_REAL_IO_LIMIT >= 4096
868b2b66 (kx 2024-12-20 16:11:07 +0300  375)     case NBR_4096 :
868b2b66 (kx 2024-12-20 16:11:07 +0300  376)       rc =  (EMUSHORT *)&_ei_mtens_4096_[0][0];
868b2b66 (kx 2024-12-20 16:11:07 +0300  377)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  378) #endif /* MPU_REAL_IO_LIMIT >= 4096 */
868b2b66 (kx 2024-12-20 16:11:07 +0300  379) #if MPU_REAL_IO_LIMIT >= 8192
868b2b66 (kx 2024-12-20 16:11:07 +0300  380)     case NBR_8192 :
868b2b66 (kx 2024-12-20 16:11:07 +0300  381)       rc =  (EMUSHORT *)&_ei_mtens_8192_[0][0];
868b2b66 (kx 2024-12-20 16:11:07 +0300  382)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  383) #endif /* MPU_REAL_IO_LIMIT >= 8192 */
868b2b66 (kx 2024-12-20 16:11:07 +0300  384) #if MPU_REAL_IO_LIMIT >= 16384
868b2b66 (kx 2024-12-20 16:11:07 +0300  385)     case NBR_16384:
868b2b66 (kx 2024-12-20 16:11:07 +0300  386)       rc = (EMUSHORT *)&_ei_mtens_16384_[0][0];
868b2b66 (kx 2024-12-20 16:11:07 +0300  387)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  388) #endif /* MPU_REAL_IO_LIMIT >= 16384 */
868b2b66 (kx 2024-12-20 16:11:07 +0300  389) #if MPU_REAL_IO_LIMIT >= 32768
868b2b66 (kx 2024-12-20 16:11:07 +0300  390)     case NBR_32768:
868b2b66 (kx 2024-12-20 16:11:07 +0300  391)       rc = (EMUSHORT *)&_ei_mtens_32768_[0][0];
868b2b66 (kx 2024-12-20 16:11:07 +0300  392)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  393) #endif /* MPU_REAL_IO_LIMIT >= 32768 */
868b2b66 (kx 2024-12-20 16:11:07 +0300  394) #if MPU_REAL_IO_LIMIT >= 65536
868b2b66 (kx 2024-12-20 16:11:07 +0300  395)     case NBR_65536:
868b2b66 (kx 2024-12-20 16:11:07 +0300  396)       rc = (EMUSHORT *)&_ei_mtens_65536_[0][0];
868b2b66 (kx 2024-12-20 16:11:07 +0300  397)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  398) #endif /* MPU_REAL_IO_LIMIT >= 65536 */
868b2b66 (kx 2024-12-20 16:11:07 +0300  399) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  400)     default:
868b2b66 (kx 2024-12-20 16:11:07 +0300  401)     {
868b2b66 (kx 2024-12-20 16:11:07 +0300  402)       /* error: Invalid size of operand(s) */
868b2b66 (kx 2024-12-20 16:11:07 +0300  403)       __real_error_no = __R_ESIZE__;
868b2b66 (kx 2024-12-20 16:11:07 +0300  404)       __STIND; /* Set REAL ind-produsing operation Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300  405)       break;
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 switch( nb ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300  409) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  410)   return( rc );
868b2b66 (kx 2024-12-20 16:11:07 +0300  411) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  412) } /* End of _get_mtens_ptr() */
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) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300  416)   SEE: __MPU_FLOATP.H for definitions REAL_xxxxxx__MAX_STRING
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) #define MAX_STRING_SIZE(n)   REAL_##n##_MAX_STRING
868b2b66 (kx 2024-12-20 16:11:07 +0300  420) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  421) #if MPU_REAL_IO_LIMIT == 32
868b2b66 (kx 2024-12-20 16:11:07 +0300  422) #define REAL_MAX_STRING_SIZE    MAX_STRING_SIZE(32)
868b2b66 (kx 2024-12-20 16:11:07 +0300  423) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300  424) #if MPU_REAL_IO_LIMIT == 64
868b2b66 (kx 2024-12-20 16:11:07 +0300  425) #define REAL_MAX_STRING_SIZE    MAX_STRING_SIZE(64)
868b2b66 (kx 2024-12-20 16:11:07 +0300  426) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300  427) #if MPU_REAL_IO_LIMIT == 128
868b2b66 (kx 2024-12-20 16:11:07 +0300  428) #define REAL_MAX_STRING_SIZE    MAX_STRING_SIZE(128)
868b2b66 (kx 2024-12-20 16:11:07 +0300  429) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300  430) #if MPU_REAL_IO_LIMIT == 256
868b2b66 (kx 2024-12-20 16:11:07 +0300  431) #define REAL_MAX_STRING_SIZE    MAX_STRING_SIZE(256)
868b2b66 (kx 2024-12-20 16:11:07 +0300  432) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300  433) #if MPU_REAL_IO_LIMIT == 512
868b2b66 (kx 2024-12-20 16:11:07 +0300  434) #define REAL_MAX_STRING_SIZE    MAX_STRING_SIZE(512)
868b2b66 (kx 2024-12-20 16:11:07 +0300  435) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300  436) #if MPU_REAL_IO_LIMIT == 1024
868b2b66 (kx 2024-12-20 16:11:07 +0300  437) #define REAL_MAX_STRING_SIZE    MAX_STRING_SIZE(1024)
868b2b66 (kx 2024-12-20 16:11:07 +0300  438) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300  439) #if MPU_REAL_IO_LIMIT == 2048
868b2b66 (kx 2024-12-20 16:11:07 +0300  440) #define REAL_MAX_STRING_SIZE    MAX_STRING_SIZE(2048)
868b2b66 (kx 2024-12-20 16:11:07 +0300  441) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300  442) #if MPU_REAL_IO_LIMIT == 4096
868b2b66 (kx 2024-12-20 16:11:07 +0300  443) #define REAL_MAX_STRING_SIZE    MAX_STRING_SIZE(4096)
868b2b66 (kx 2024-12-20 16:11:07 +0300  444) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300  445) #if MPU_REAL_IO_LIMIT == 8192
868b2b66 (kx 2024-12-20 16:11:07 +0300  446) #define REAL_MAX_STRING_SIZE    MAX_STRING_SIZE(8192)
868b2b66 (kx 2024-12-20 16:11:07 +0300  447) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300  448) #if MPU_REAL_IO_LIMIT == 16384
868b2b66 (kx 2024-12-20 16:11:07 +0300  449) #define REAL_MAX_STRING_SIZE    MAX_STRING_SIZE(16384)
868b2b66 (kx 2024-12-20 16:11:07 +0300  450) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300  451) #if MPU_REAL_IO_LIMIT == 32768
868b2b66 (kx 2024-12-20 16:11:07 +0300  452) #define REAL_MAX_STRING_SIZE    MAX_STRING_SIZE(32768)
868b2b66 (kx 2024-12-20 16:11:07 +0300  453) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300  454) #if MPU_REAL_IO_LIMIT == 65536
868b2b66 (kx 2024-12-20 16:11:07 +0300  455) #define REAL_MAX_STRING_SIZE    MAX_STRING_SIZE(65536)
868b2b66 (kx 2024-12-20 16:11:07 +0300  456) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300  457) #if MPU_REAL_IO_LIMIT == 131072
868b2b66 (kx 2024-12-20 16:11:07 +0300  458) #define REAL_MAX_STRING_SIZE    MAX_STRING_SIZE(131072)
868b2b66 (kx 2024-12-20 16:11:07 +0300  459) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300  460) #error mpu-ioreal.c: Failed value of MPU_REAL_IO_LIMIT (use: 32,64, ..., 131072)
868b2b66 (kx 2024-12-20 16:11:07 +0300  461) #endif /* MPU_REAL_IO_LIMIT == 131072 */
868b2b66 (kx 2024-12-20 16:11:07 +0300  462) #endif /* MPU_REAL_IO_LIMIT ==  65536 */
868b2b66 (kx 2024-12-20 16:11:07 +0300  463) #endif /* MPU_REAL_IO_LIMIT ==  32768 */
868b2b66 (kx 2024-12-20 16:11:07 +0300  464) #endif /* MPU_REAL_IO_LIMIT ==  16384 */
868b2b66 (kx 2024-12-20 16:11:07 +0300  465) #endif /* MPU_REAL_IO_LIMIT ==   8192 */
868b2b66 (kx 2024-12-20 16:11:07 +0300  466) #endif /* MPU_REAL_IO_LIMIT ==   4096 */
868b2b66 (kx 2024-12-20 16:11:07 +0300  467) #endif /* MPU_REAL_IO_LIMIT ==   2048 */
868b2b66 (kx 2024-12-20 16:11:07 +0300  468) #endif /* MPU_REAL_IO_LIMIT ==   1024 */
868b2b66 (kx 2024-12-20 16:11:07 +0300  469) #endif /* MPU_REAL_IO_LIMIT ==    512 */
868b2b66 (kx 2024-12-20 16:11:07 +0300  470) #endif /* MPU_REAL_IO_LIMIT ==    256 */
868b2b66 (kx 2024-12-20 16:11:07 +0300  471) #endif /* MPU_REAL_IO_LIMIT ==    128 */
868b2b66 (kx 2024-12-20 16:11:07 +0300  472) #endif /* MPU_REAL_IO_LIMIT ==     64 */
868b2b66 (kx 2024-12-20 16:11:07 +0300  473) #endif /* MPU_REAL_IO_LIMIT ==     32 */
868b2b66 (kx 2024-12-20 16:11:07 +0300  474) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  475) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  476) void ei_real_to_ascii( __mpu_char8_t *string, EMUSHORT *ei, int ndigs, int exp_delim, int exp_digs, int gen_plus, int nb )
868b2b66 (kx 2024-12-20 16:11:07 +0300  477) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300  478) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  479)  Description        : ei_real_to_ascii() Работает с
868b2b66 (kx 2024-12-20 16:11:07 +0300  480)                                          internal e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300  481)                                          data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300  482) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  483)  Concepts           : Convert internal e-type EI to ASCII
868b2b66 (kx 2024-12-20 16:11:07 +0300  484)                       STRING with NDIGS digits after the
868b2b66 (kx 2024-12-20 16:11:07 +0300  485)                       decimal point.
868b2b66 (kx 2024-12-20 16:11:07 +0300  486)                       EXP_DELIM is char to delimited Exponent
868b2b66 (kx 2024-12-20 16:11:07 +0300  487)                       in the output STRING, for example,
868b2b66 (kx 2024-12-20 16:11:07 +0300  488)                       1.j+27.
868b2b66 (kx 2024-12-20 16:11:07 +0300  489) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  490)  Use Global Variable:
868b2b66 (kx 2024-12-20 16:11:07 +0300  491) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  492)  Use Functions      :
868b2b66 (kx 2024-12-20 16:11:07 +0300  493)                       iitoa_np();                 | mpu-integer.c
868b2b66 (kx 2024-12-20 16:11:07 +0300  494)                       internal_np( nb );          | mpu-real.c
868b2b66 (kx 2024-12-20 16:11:07 +0300  495)                       internal_ne( nb );          | mpu-real.c
868b2b66 (kx 2024-12-20 16:11:07 +0300  496)                       internal_ns( nb );          | mpu-real.c
868b2b66 (kx 2024-12-20 16:11:07 +0300  497) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  498)  Parameters         :
868b2b66 (kx 2024-12-20 16:11:07 +0300  499)                       __mpu_char8_t *string; - output string;
868b2b66 (kx 2024-12-20 16:11:07 +0300  500)                       EMUSHORT          *ei; - указатель на
868b2b66 (kx 2024-12-20 16:11:07 +0300  501)                                                internal e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300  502)                                                data struct;
868b2b66 (kx 2024-12-20 16:11:07 +0300  503)                       int             ndigs; - количество цифр
868b2b66 (kx 2024-12-20 16:11:07 +0300  504)                                                после десятичной
868b2b66 (kx 2024-12-20 16:11:07 +0300  505)                                                точки;
868b2b66 (kx 2024-12-20 16:11:07 +0300  506)                       int         exp_delim; - символ отделяющий
868b2b66 (kx 2024-12-20 16:11:07 +0300  507)                                                ЭКСРОНЕНТУ;
868b2b66 (kx 2024-12-20 16:11:07 +0300  508)                       int          exp_digs; - количество цифр
868b2b66 (kx 2024-12-20 16:11:07 +0300  509)                                                экспоненты;
868b2b66 (kx 2024-12-20 16:11:07 +0300  510)                       NOTE ====================================
868b2b66 (kx 2024-12-20 16:11:07 +0300  511)                            В том случае, когда( exp_digs > 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300  512)                            {
868b2b66 (kx 2024-12-20 16:11:07 +0300  513)                              Если реальное количество цифр
868b2b66 (kx 2024-12-20 16:11:07 +0300  514)                              меньше exp_digs, то экспонента
868b2b66 (kx 2024-12-20 16:11:07 +0300  515)                              будет дополнена старшими
868b2b66 (kx 2024-12-20 16:11:07 +0300  516)                              незначащими нулями.
868b2b66 (kx 2024-12-20 16:11:07 +0300  517)                              Если реальное количество цифр
868b2b66 (kx 2024-12-20 16:11:07 +0300  518)                              больше exp_digs, то экспонента
868b2b66 (kx 2024-12-20 16:11:07 +0300  519)                              изменена не будет.
868b2b66 (kx 2024-12-20 16:11:07 +0300  520)                            }
868b2b66 (kx 2024-12-20 16:11:07 +0300  521)                       =========================================
868b2b66 (kx 2024-12-20 16:11:07 +0300  522) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  523)                       int          gen_plus; - принудительная
868b2b66 (kx 2024-12-20 16:11:07 +0300  524)                                                генерация знака
868b2b66 (kx 2024-12-20 16:11:07 +0300  525)                                                плюс перед
868b2b66 (kx 2024-12-20 16:11:07 +0300  526)                                                положтельным
868b2b66 (kx 2024-12-20 16:11:07 +0300  527)                                                числом;
868b2b66 (kx 2024-12-20 16:11:07 +0300  528)                       NOTE ====================================
868b2b66 (kx 2024-12-20 16:11:07 +0300  529)                            В случае, когда( gen_plus != 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300  530)                            {
868b2b66 (kx 2024-12-20 16:11:07 +0300  531)                              При переводе положительного
868b2b66 (kx 2024-12-20 16:11:07 +0300  532)                              числа в строку происходит
868b2b66 (kx 2024-12-20 16:11:07 +0300  533)                              принудительная запись знака 
868b2b66 (kx 2024-12-20 16:11:07 +0300  534)                              плюс перед числом в строке.
868b2b66 (kx 2024-12-20 16:11:07 +0300  535)                            }
868b2b66 (kx 2024-12-20 16:11:07 +0300  536)                            иначе
868b2b66 (kx 2024-12-20 16:11:07 +0300  537)                            {
868b2b66 (kx 2024-12-20 16:11:07 +0300  538)                              Положительное число печатается
868b2b66 (kx 2024-12-20 16:11:07 +0300  539)                              как обычно (т.е. без знака).
868b2b66 (kx 2024-12-20 16:11:07 +0300  540)                            }
868b2b66 (kx 2024-12-20 16:11:07 +0300  541)                       =========================================
868b2b66 (kx 2024-12-20 16:11:07 +0300  542) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  543)                       int                nb; - количество бит в
868b2b66 (kx 2024-12-20 16:11:07 +0300  544)                                                external e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300  545)                                                data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300  546) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  547)  Return             : [void]
868b2b66 (kx 2024-12-20 16:11:07 +0300  548) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  549)  ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  550) {
868b2b66 (kx 2024-12-20 16:11:07 +0300  551)   EMUSHORT          *n = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300  552)                     *m = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300  553)                 *expon = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300  554)                 *exone = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300  555)                   *inc = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300  556) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  557)                 *equot = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300  558)                   *tmp = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300  559)                   *ten = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300  560)                     *y = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300  561)                     *t = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300  562)                     *u = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300  563)                     *w = NULL;
868b2b66 (kx 2024-12-20 16:11:07 +0300  564)   EMUSHORT      *p, *r;
868b2b66 (kx 2024-12-20 16:11:07 +0300  565)   EMUSHORT       sign;
868b2b66 (kx 2024-12-20 16:11:07 +0300  566)   __mpu_int32_t  j, digit;
868b2b66 (kx 2024-12-20 16:11:07 +0300  567)   int            rndsave, n_ten;
868b2b66 (kx 2024-12-20 16:11:07 +0300  568)   int            jc, k;
868b2b66 (kx 2024-12-20 16:11:07 +0300  569)   __mpu_char8_t *s, *ss, *t_string = NULL;
868b2b66 (kx 2024-12-20 16:11:07 +0300  570)   int            np, ne, ns, i, ln, n_dec;
868b2b66 (kx 2024-12-20 16:11:07 +0300  571) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  572) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  573)   errno = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300  574) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  575)   if( nb < NBR_32 || nb > MPU_REAL_IO_LIMIT )
868b2b66 (kx 2024-12-20 16:11:07 +0300  576)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  577)     /* error: Invalid size of operand(s) */
868b2b66 (kx 2024-12-20 16:11:07 +0300  578)     __real_error_no = __R_ESIZE__;
868b2b66 (kx 2024-12-20 16:11:07 +0300  579)     __STIND; /* Set REAL ind-produsing operation Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300  580)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300  581)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300  582) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  583)   t_string = (__mpu_char8_t *)malloc(REAL_MAX_STRING_SIZE+1);
868b2b66 (kx 2024-12-20 16:11:07 +0300  584)   if( !t_string )
868b2b66 (kx 2024-12-20 16:11:07 +0300  585)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  586)     /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300  587)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300  588)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300  589) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  590)   rndsave = rndprc;
868b2b66 (kx 2024-12-20 16:11:07 +0300  591)   ss  = string;
868b2b66 (kx 2024-12-20 16:11:07 +0300  592)   s   = t_string;
868b2b66 (kx 2024-12-20 16:11:07 +0300  593)   *ss = '\0';
868b2b66 (kx 2024-12-20 16:11:07 +0300  594)   ln = _get_max_string( nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300  595)   for( i = 0; i < ln; i++ ) s[i] = '\0'; /* or bzero( s, ln ); */
868b2b66 (kx 2024-12-20 16:11:07 +0300  596) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  597)   np = internal_np( nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300  598)   ne = internal_ne( nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300  599)   ns = internal_ns( nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300  600) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  601) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  602)   /*** Allocate memory for n, m, expon, exone, inc . **********/
868b2b66 (kx 2024-12-20 16:11:07 +0300  603)   n = (EMUSHORT *)__mpu_sbrk( (int)((ne+1)*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300  604)   if( !n )
868b2b66 (kx 2024-12-20 16:11:07 +0300  605)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  606)     /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300  607) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  608)     /* FREE t_string **********/
868b2b66 (kx 2024-12-20 16:11:07 +0300  609)     free( t_string );
868b2b66 (kx 2024-12-20 16:11:07 +0300  610)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  611) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  612)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300  613)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300  614) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  615)   m = (EMUSHORT *)__mpu_sbrk( (int)((ne+1)*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300  616)   if( !m )
868b2b66 (kx 2024-12-20 16:11:07 +0300  617)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  618)     /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300  619) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  620)     /* FREE t_string **********/
868b2b66 (kx 2024-12-20 16:11:07 +0300  621)     free( t_string );
868b2b66 (kx 2024-12-20 16:11:07 +0300  622)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  623) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  624)     /* FREE n *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  625)     __mpu_sbrk( -(int)((ne+1)*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300  626)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  627) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  628)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300  629)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300  630) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  631)   expon = (EMUSHORT *)__mpu_sbrk( (int)((ne+1)*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300  632)   if( !expon )
868b2b66 (kx 2024-12-20 16:11:07 +0300  633)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  634)     /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300  635) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  636)     /* FREE t_string **********/
868b2b66 (kx 2024-12-20 16:11:07 +0300  637)     free( t_string );
868b2b66 (kx 2024-12-20 16:11:07 +0300  638)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  639) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  640)     /* FREE n *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  641)     /* FREE m *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  642)     __mpu_sbrk( -(int)(2*(ne+1)*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300  643)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  644) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  645)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300  646)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300  647) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  648)   exone = (EMUSHORT *)__mpu_sbrk( (int)((ne+1)*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300  649)   if( !exone )
868b2b66 (kx 2024-12-20 16:11:07 +0300  650)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  651)     /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300  652) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  653)     /* FREE t_string **********/
868b2b66 (kx 2024-12-20 16:11:07 +0300  654)     free( t_string );
868b2b66 (kx 2024-12-20 16:11:07 +0300  655)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  656) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  657)     /* FREE n *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  658)     /* FREE m *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  659)     /* FREE expon *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  660)     __mpu_sbrk( -(int)(3*(ne+1)*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300  661)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  662) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  663)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300  664)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300  665) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  666)   inc = (EMUSHORT *)__mpu_sbrk( (int)((ne+1)*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300  667)   if( !inc )
868b2b66 (kx 2024-12-20 16:11:07 +0300  668)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  669)     /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300  670) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  671)     /* FREE t_string **********/
868b2b66 (kx 2024-12-20 16:11:07 +0300  672)     free( t_string );
868b2b66 (kx 2024-12-20 16:11:07 +0300  673)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  674) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  675)     /* FREE n *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  676)     /* FREE m *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  677)     /* FREE expon *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  678)     /* FREE exone *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  679)     __mpu_sbrk( -(int)(4*(ne+1)*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300  680)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  681) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  682)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300  683)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300  684)   /************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  685) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  686)   /*** Allocate memory for equot, tmp, ten, y, t, u, w . ******/
868b2b66 (kx 2024-12-20 16:11:07 +0300  687)   equot = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300  688)   if( !equot )
868b2b66 (kx 2024-12-20 16:11:07 +0300  689)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  690)     /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300  691) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  692)     /* FREE t_string **********/
868b2b66 (kx 2024-12-20 16:11:07 +0300  693)     free( t_string );
868b2b66 (kx 2024-12-20 16:11:07 +0300  694)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  695) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  696)     /* FREE n *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  697)     /* FREE m *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  698)     /* FREE expon *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  699)     /* FREE exone *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  700)     /* FREE inc ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  701)     __mpu_sbrk( -(int)(5*(ne+1)*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300  702)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  703) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  704)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300  705)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300  706) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  707)   tmp = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300  708)   if( !tmp )
868b2b66 (kx 2024-12-20 16:11:07 +0300  709)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  710)     /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300  711) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  712)     /* FREE t_string **********/
868b2b66 (kx 2024-12-20 16:11:07 +0300  713)     free( t_string );
868b2b66 (kx 2024-12-20 16:11:07 +0300  714)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  715) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  716)     /* FREE n *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  717)     /* FREE m *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  718)     /* FREE expon *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  719)     /* FREE exone *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  720)     /* FREE inc ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  721)     __mpu_sbrk( -(int)(5*(ne+1)*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300  722)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  723) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  724)     /* FREE equot *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  725)     __mpu_sbrk( -(int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300  726)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  727) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  728)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300  729)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300  730) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  731)   ten = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300  732)   if( !ten )
868b2b66 (kx 2024-12-20 16:11:07 +0300  733)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  734)     /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300  735) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  736)     /* FREE t_string **********/
868b2b66 (kx 2024-12-20 16:11:07 +0300  737)     free( t_string );
868b2b66 (kx 2024-12-20 16:11:07 +0300  738)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  739) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  740)     /* FREE n *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  741)     /* FREE m *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  742)     /* FREE expon *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  743)     /* FREE exone *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  744)     /* FREE inc ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  745)     __mpu_sbrk( -(int)(5*(ne+1)*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300  746)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  747) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  748)     /* FREE equot *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  749)     /* FREE tmp ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  750)     __mpu_sbrk( -(int)(2*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300  751)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  752) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  753)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300  754)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300  755) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  756)   y = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300  757)   if( !y )
868b2b66 (kx 2024-12-20 16:11:07 +0300  758)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  759)     /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300  760) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  761)     /* FREE t_string **********/
868b2b66 (kx 2024-12-20 16:11:07 +0300  762)     free( t_string );
868b2b66 (kx 2024-12-20 16:11:07 +0300  763)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  764) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  765)     /* FREE n *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  766)     /* FREE m *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  767)     /* FREE expon *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  768)     /* FREE exone *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  769)     /* FREE inc ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  770)     __mpu_sbrk( -(int)(5*(ne+1)*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300  771)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  772) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  773)     /* FREE equot *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  774)     /* FREE tmp ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  775)     /* FREE ten ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  776)     __mpu_sbrk( -(int)(3*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300  777)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  778) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  779)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300  780)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300  781) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  782)   t = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300  783)   if( !t )
868b2b66 (kx 2024-12-20 16:11:07 +0300  784)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  785)     /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300  786) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  787)     /* FREE t_string **********/
868b2b66 (kx 2024-12-20 16:11:07 +0300  788)     free( t_string );
868b2b66 (kx 2024-12-20 16:11:07 +0300  789)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  790) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  791)     /* FREE n *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  792)     /* FREE m *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  793)     /* FREE expon *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  794)     /* FREE exone *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  795)     /* FREE inc ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  796)     __mpu_sbrk( -(int)(5*(ne+1)*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300  797)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  798) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  799)     /* FREE equot *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  800)     /* FREE tmp ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  801)     /* FREE ten ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  802)     /* FREE y *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  803)     __mpu_sbrk( -(int)(4*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300  804)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  805) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  806)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300  807)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300  808) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  809)   u = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300  810)   if( !u )
868b2b66 (kx 2024-12-20 16:11:07 +0300  811)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  812)     /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300  813) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  814)     /* FREE t_string **********/
868b2b66 (kx 2024-12-20 16:11:07 +0300  815)     free( t_string );
868b2b66 (kx 2024-12-20 16:11:07 +0300  816)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  817) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  818)     /* FREE n *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  819)     /* FREE m *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  820)     /* FREE expon *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  821)     /* FREE exone *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  822)     /* FREE inc ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  823)     __mpu_sbrk( -(int)(5*(ne+1)*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300  824)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  825) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  826)     /* FREE equot *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  827)     /* FREE tmp ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  828)     /* FREE ten ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  829)     /* FREE y *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  830)     /* FREE t *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  831)     __mpu_sbrk( -(int)(5*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300  832)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  833) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  834)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300  835)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300  836) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  837)   w = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300  838)   if( !w )
868b2b66 (kx 2024-12-20 16:11:07 +0300  839)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  840)     /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300  841) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  842)     /* FREE t_string **********/
868b2b66 (kx 2024-12-20 16:11:07 +0300  843)     free( t_string );
868b2b66 (kx 2024-12-20 16:11:07 +0300  844)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  845) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  846)     /* FREE n *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  847)     /* FREE m *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  848)     /* FREE expon *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  849)     /* FREE exone *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  850)     /* FREE inc ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  851)     __mpu_sbrk( -(int)(5*(ne+1)*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300  852)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  853) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  854)     /* FREE equot *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  855)     /* FREE tmp ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  856)     /* FREE ten ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  857)     /* FREE y *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  858)     /* FREE t *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  859)     /* FREE u *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  860)     __mpu_sbrk( -(int)(6*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300  861)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  862) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  863)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300  864)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300  865)   /************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  866) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  867) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  868) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  869)   n_dec = _get_ndec( nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300  870)   n_ten = _get_nten( nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300  871) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  872)   if( nb > NBR_64 )
868b2b66 (kx 2024-12-20 16:11:07 +0300  873)     n_dec -= 1; /* Необходимо для правильного округления мантиссы */
868b2b66 (kx 2024-12-20 16:11:07 +0300  874) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  875)   if( ei_isind( ei, nb ) )
868b2b66 (kx 2024-12-20 16:11:07 +0300  876)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  877)     strncpy( t_string, " -ind", 6 ); /* " -1.#IND00"; */
868b2b66 (kx 2024-12-20 16:11:07 +0300  878) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  879)     if( exp_delim == 'r' || exp_delim == 'R' )
868b2b66 (kx 2024-12-20 16:11:07 +0300  880)     {
868b2b66 (kx 2024-12-20 16:11:07 +0300  881)       strcat( t_string, "_r" );
868b2b66 (kx 2024-12-20 16:11:07 +0300  882)     }
868b2b66 (kx 2024-12-20 16:11:07 +0300  883)     else if( exp_delim == 'j' || exp_delim == 'J' )
868b2b66 (kx 2024-12-20 16:11:07 +0300  884)     {
868b2b66 (kx 2024-12-20 16:11:07 +0300  885)       strcat( t_string, "_j" );
868b2b66 (kx 2024-12-20 16:11:07 +0300  886)     }
868b2b66 (kx 2024-12-20 16:11:07 +0300  887)     goto bxit;
868b2b66 (kx 2024-12-20 16:11:07 +0300  888)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300  889) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  890)   if( ei_isnans( ei, nb ) )
868b2b66 (kx 2024-12-20 16:11:07 +0300  891)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  892)     if( ei_isneg( ei, nb ) ) strncpy( t_string, " -", 3 );
868b2b66 (kx 2024-12-20 16:11:07 +0300  893)     else if( gen_plus )      strncpy( t_string, " +", 3 );
868b2b66 (kx 2024-12-20 16:11:07 +0300  894)          else                strncpy( t_string, " ",  2 ); /* + */
868b2b66 (kx 2024-12-20 16:11:07 +0300  895)     strcat( t_string, "NaN" ); /* "1.#QNAN0"; */
868b2b66 (kx 2024-12-20 16:11:07 +0300  896) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  897)     if( exp_delim == 'r' || exp_delim == 'R' )
868b2b66 (kx 2024-12-20 16:11:07 +0300  898)     {
868b2b66 (kx 2024-12-20 16:11:07 +0300  899)       strcat( t_string, "_r" );
868b2b66 (kx 2024-12-20 16:11:07 +0300  900)     }
868b2b66 (kx 2024-12-20 16:11:07 +0300  901)     else if( exp_delim == 'j' || exp_delim == 'J' )
868b2b66 (kx 2024-12-20 16:11:07 +0300  902)     {
868b2b66 (kx 2024-12-20 16:11:07 +0300  903)       strcat( t_string, "_j" );
868b2b66 (kx 2024-12-20 16:11:07 +0300  904)     }
868b2b66 (kx 2024-12-20 16:11:07 +0300  905)     goto bxit;
868b2b66 (kx 2024-12-20 16:11:07 +0300  906)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300  907) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  908)   rndprc = (int)NSBITS(nb); /* Set to full precision */
868b2b66 (kx 2024-12-20 16:11:07 +0300  909)   ei_copy( y, ei, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300  910) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  911)   /* Save Sign */
868b2b66 (kx 2024-12-20 16:11:07 +0300  912) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300  913)   if( y[0] )
868b2b66 (kx 2024-12-20 16:11:07 +0300  914) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300  915)   if( y[ns + ne + 2] )
868b2b66 (kx 2024-12-20 16:11:07 +0300  916) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  917)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  918)     sign = MASK_ALL_BITS;
868b2b66 (kx 2024-12-20 16:11:07 +0300  919) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300  920)     y[0]           = (EMUSHORT)0; /* Clear sign */
868b2b66 (kx 2024-12-20 16:11:07 +0300  921) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300  922)     y[ns + ne + 2] = (EMUSHORT)0; /* Clear sign */
868b2b66 (kx 2024-12-20 16:11:07 +0300  923) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  924)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300  925)   else
868b2b66 (kx 2024-12-20 16:11:07 +0300  926)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  927)     sign =  (EMUSHORT)0;
868b2b66 (kx 2024-12-20 16:11:07 +0300  928)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300  929) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  930)   /* expon = 0 */
868b2b66 (kx 2024-12-20 16:11:07 +0300  931)   for( i = 0; i < ne+1; i++ ) expon[i] = (EMUSHORT)0;
868b2b66 (kx 2024-12-20 16:11:07 +0300  932) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  933)   /* ten = 1.0E1 */
868b2b66 (kx 2024-12-20 16:11:07 +0300  934)   _gen_ten( ten, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300  935) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  936)   /* t = 1.0E0 */
868b2b66 (kx 2024-12-20 16:11:07 +0300  937)   _gen_one( t, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300  938) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  939)   /* Gen EXONE */
868b2b66 (kx 2024-12-20 16:11:07 +0300  940) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300  941)   /* hight part */
868b2b66 (kx 2024-12-20 16:11:07 +0300  942)   p = exone;
868b2b66 (kx 2024-12-20 16:11:07 +0300  943)   *p++ = (EMUSHORT)0;
868b2b66 (kx 2024-12-20 16:11:07 +0300  944)   *p++ = HIGHT_EXONE; /* 0x3fff... */
868b2b66 (kx 2024-12-20 16:11:07 +0300  945)   for( i = 0; i < ne - 1; i++ ) *p++ = MASK_ALL_BITS;
868b2b66 (kx 2024-12-20 16:11:07 +0300  946) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300  947)   /* hight part */
868b2b66 (kx 2024-12-20 16:11:07 +0300  948)   p = exone + ne;
868b2b66 (kx 2024-12-20 16:11:07 +0300  949)   *p-- = (EMUSHORT)0;
868b2b66 (kx 2024-12-20 16:11:07 +0300  950)   *p-- = HIGHT_EXONE;
868b2b66 (kx 2024-12-20 16:11:07 +0300  951)   for( i = 0; i < ne - 1; i++ ) *p-- = MASK_ALL_BITS;
868b2b66 (kx 2024-12-20 16:11:07 +0300  952) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  953) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  954) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  955)   /**************************
868b2b66 (kx 2024-12-20 16:11:07 +0300  956)     Test for zero Exponent
868b2b66 (kx 2024-12-20 16:11:07 +0300  957)    **************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  958)   /* Copy Exponents */
868b2b66 (kx 2024-12-20 16:11:07 +0300  959) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300  960)   ei_cpye_unpack( inc, &y[1],    ne+1, ne );
868b2b66 (kx 2024-12-20 16:11:07 +0300  961) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300  962)   ei_cpye_unpack( inc, &y[ns+2], ne+1, ne );
868b2b66 (kx 2024-12-20 16:11:07 +0300  963) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  964)   if( ei_cmp0e( inc, ne+1 ) == 0 ) /* Exponent == 0 */
868b2b66 (kx 2024-12-20 16:11:07 +0300  965)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  966) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300  967)     for( i = ne+2; i < np-1; i++ )
868b2b66 (kx 2024-12-20 16:11:07 +0300  968) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300  969)     for( i = 1; i < ns+1; i++ )
868b2b66 (kx 2024-12-20 16:11:07 +0300  970) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  971)     {
868b2b66 (kx 2024-12-20 16:11:07 +0300  972)       if( y[i] != (EMUSHORT)0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300  973)         goto tnzero; /* Denormalized number */
868b2b66 (kx 2024-12-20 16:11:07 +0300  974)     }
868b2b66 (kx 2024-12-20 16:11:07 +0300  975)     goto isone;        /* Valid all zeros */
868b2b66 (kx 2024-12-20 16:11:07 +0300  976)   } /* End if( Exponent == 0 ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300  977) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  978) tnzero:
868b2b66 (kx 2024-12-20 16:11:07 +0300  979) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  980)   /*********************
868b2b66 (kx 2024-12-20 16:11:07 +0300  981)     Test for infinity
868b2b66 (kx 2024-12-20 16:11:07 +0300  982)    *********************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  983)   if( ei_isinfin( y, nb ) )
868b2b66 (kx 2024-12-20 16:11:07 +0300  984)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  985)     if( sign )          strncpy( t_string, " -inf", 6 ); /* " -1.#INF00"; */
868b2b66 (kx 2024-12-20 16:11:07 +0300  986)     else if( gen_plus ) strncpy( t_string, " +inf", 6 ); /* " +1.#INF00"; */
868b2b66 (kx 2024-12-20 16:11:07 +0300  987)          else           strncpy( t_string, " inf",  5 );  /* " 1.#INF00"; */
868b2b66 (kx 2024-12-20 16:11:07 +0300  988) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  989)     if( exp_delim == 'r' || exp_delim == 'R' )
868b2b66 (kx 2024-12-20 16:11:07 +0300  990)     {
868b2b66 (kx 2024-12-20 16:11:07 +0300  991)       strcat( t_string, "_r" );
868b2b66 (kx 2024-12-20 16:11:07 +0300  992)     }
868b2b66 (kx 2024-12-20 16:11:07 +0300  993)     else if( exp_delim == 'j' || exp_delim == 'J' )
868b2b66 (kx 2024-12-20 16:11:07 +0300  994)     {
868b2b66 (kx 2024-12-20 16:11:07 +0300  995)       strcat( t_string, "_j" );
868b2b66 (kx 2024-12-20 16:11:07 +0300  996)     }
868b2b66 (kx 2024-12-20 16:11:07 +0300  997)     goto bxit;
868b2b66 (kx 2024-12-20 16:11:07 +0300  998) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  999)   } /* End of Infin */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1000) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 1001)   /**********************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 1002)     Test for Exponent nonzero but Significand denormalized.
868b2b66 (kx 2024-12-20 16:11:07 +0300 1003)     This is an ERROR condition.
868b2b66 (kx 2024-12-20 16:11:07 +0300 1004)    **********************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1005)   if( (ei_cmp0e( inc, ne+1 ) != 0) &&
868b2b66 (kx 2024-12-20 16:11:07 +0300 1006) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 1007)      ((y[ne+2] & MASK_SIGN) == 0) )
868b2b66 (kx 2024-12-20 16:11:07 +0300 1008) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 1009)      ((y[ns]   & MASK_SIGN) == 0) )
868b2b66 (kx 2024-12-20 16:11:07 +0300 1010) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 1011)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 1012)     /* "domain error" */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1013)     errno = __mpu_math_errnotab[__DOMAIN__];
868b2b66 (kx 2024-12-20 16:11:07 +0300 1014)     __STDOM; /* Set REAL Domain Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1015)     strncpy( t_string, "NaN", 4 ); /* "1.#QNAN0"; */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1016) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 1017)     if( exp_delim == 'r' || exp_delim == 'R' )
868b2b66 (kx 2024-12-20 16:11:07 +0300 1018)     {
868b2b66 (kx 2024-12-20 16:11:07 +0300 1019)       strcat( t_string, "_r" );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1020)     }
868b2b66 (kx 2024-12-20 16:11:07 +0300 1021)     else if( exp_delim == 'j' || exp_delim == 'J' )
868b2b66 (kx 2024-12-20 16:11:07 +0300 1022)     {
868b2b66 (kx 2024-12-20 16:11:07 +0300 1023)       strcat( t_string, "_j" );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1024)     }
868b2b66 (kx 2024-12-20 16:11:07 +0300 1025)     goto bxit;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1026)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300 1027) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 1028)   /******************
868b2b66 (kx 2024-12-20 16:11:07 +0300 1029)     Compare to 1.0
868b2b66 (kx 2024-12-20 16:11:07 +0300 1030)    ******************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1031)   jc = ei_cmp( t, y, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1032)   if( jc == 0 ) goto isone;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1033) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 1034)   if( jc == -2 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 1035)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 1036)     /* abort() */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1037)     strncpy( string, " -ind", 6 ); /* " -1.#IND00"; */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1038) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 1039)     if( exp_delim == 'r' || exp_delim == 'R' )
868b2b66 (kx 2024-12-20 16:11:07 +0300 1040)     {
868b2b66 (kx 2024-12-20 16:11:07 +0300 1041)       strcat( t_string, "_r" );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1042)     }
868b2b66 (kx 2024-12-20 16:11:07 +0300 1043)     else if( exp_delim == 'j' || exp_delim == 'J' )
868b2b66 (kx 2024-12-20 16:11:07 +0300 1044)     {
868b2b66 (kx 2024-12-20 16:11:07 +0300 1045)       strcat( t_string, "_j" );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1046)     }
868b2b66 (kx 2024-12-20 16:11:07 +0300 1047)     /* abort() */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1048)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300 1049) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 1050)   if( jc < 0 ) /* Number is greater than 1 (y > 1.0) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1051)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 1052)     ei_copy( u, y, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1053) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 1054)     /* u[Exponent] = EXONE + NSBITS - 1 */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1055)     j = (EMUSHORT)NSBITS(nb);
868b2b66 (kx 2024-12-20 16:11:07 +0300 1056)     j -= 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1057)     ei_cvte_unpack( inc, (EMUSHORT *)&j, ne+1, 1 );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1058)     ei_adde( inc, exone, inc, ne+1 );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1059)     /* Copy Exponents */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1060) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 1061)     ei_cpye_pack( &u[1],    inc,  ne, ne+1 );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1062) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 1063)     ei_cpye_pack( &u[ns+2], inc,  ne, ne+1 );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1064) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 1065) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 1066)     p = _get_tens_ptr( nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1067) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 1068)     /* if( BITS_PER_EMUSHORT == 16 ) { *p = 10**16; } */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1069)     /* if( BITS_PER_EMUSHORT == 32 ) { *p = 10**32; } */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1070)     /* if( BITS_PER_EMUSHORT == 64 ) { *p = 10**64; } */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1071)     p += np*(n_ten-POW2); /* -POW2 see: mpu-emutype.h */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1072) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 1073)     j = BITS_PER_EMUSHORT;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1074)     ei_cvte_unpack( m, (EMUSHORT *)&j, ne+1, 1 ); /* m = BITS_PER_EMUSHORT; */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1075) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 1076)     do
868b2b66 (kx 2024-12-20 16:11:07 +0300 1077)     {
868b2b66 (kx 2024-12-20 16:11:07 +0300 1078)       ei_div( t, u, p, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1079)       ei_floor( w, t, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1080) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 1081)       for( i = ne+2; i < np-1; i++ )
868b2b66 (kx 2024-12-20 16:11:07 +0300 1082) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 1083)       for( i = 1; i < ns+1; i++ )
868b2b66 (kx 2024-12-20 16:11:07 +0300 1084) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 1085)       {
868b2b66 (kx 2024-12-20 16:11:07 +0300 1086)         if( t[i] != w[i] ) goto noint;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1087)       }
868b2b66 (kx 2024-12-20 16:11:07 +0300 1088)       ei_copy( u, t, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1089)       ei_adde( expon, expon, m, ne+1 );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1090) noint:
868b2b66 (kx 2024-12-20 16:11:07 +0300 1091)       p += np;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1092)       ei_shrn( m, m, (unsigned)1, ne+1 ); /* m >>= 1 */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1093) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 1094)     } while( ei_cmp0e( m, ne+1 ) != 0 );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1095) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 1096)     /* Rescale from integer Significand */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1097) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 1098)     ei_cpye_unpack( m, &y[1],    ne+1, ne );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1099) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 1100)     ei_cpye_unpack( m, &y[ns+2], ne+1, ne );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1101) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 1102) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 1103) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 1104)     ei_cpye_unpack( n, &u[1],    ne+1, ne );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1105) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 1106)     ei_cpye_unpack( n, &u[ns+2], ne+1, ne );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1107) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 1108) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 1109)     /* inc еще равно EXONE + NSBITS - 1 */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1110)     ei_sube( m, m, inc, ne+1 );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1111)     ei_adde( n, n, m, ne+1 );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1112) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 1113) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 1114)     ei_cpye_pack( &u[1],    n,  ne, ne+1 );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1115) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 1116)     ei_cpye_pack( &u[ns+2], n,  ne, ne+1 );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1117) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 1118)     /* т.е. u[exp] += y[exp] -(unsigned)(EXONE + NBITS - 1) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1119) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 1120)     ei_copy( y, u, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1121) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 1122)     /* Find power of 10 */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1123)     /* t = 1.0E0 */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1124)     _gen_one( t, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1125) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 1126)     /* m = MAXP */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1127)     for( i = 0; i < ne+1; i++ ) m[i] = (EMUSHORT)0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1128) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 1129)     m[1]    = HIGHT_EXMAX_P;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1130) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 1131)     m[ne-1] = HIGHT_EXMAX_P;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1132) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 1133) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 1134)     p = _get_tens_ptr( nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1135)     /* An unordered compare result shouldn't happen here */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1136)     while( ei_cmp( ten, u, nb ) <= 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 1137)     {
868b2b66 (kx 2024-12-20 16:11:07 +0300 1138)       if( ei_cmp( p, u, nb ) <= 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 1139)       {
868b2b66 (kx 2024-12-20 16:11:07 +0300 1140)         ei_div( u, u, p, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1141)         ei_mul( t, t, p, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1142)         ei_adde( expon, expon, m, ne+1 );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1143) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 1144)       } /* End if( p <= u ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1145) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 1146)       ei_shrn( m, m, (unsigned)1, ne+1 ); /* m >>= 1 */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1147)       if( ei_cmp0e( m, ne+1 ) == 0 ) break;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1148)       p += np;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1149) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 1150)     } /* End of while( ten <= u ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1151) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 1152)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300 1153)   else        /* Number is less than 1 (y < 1.0) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1154)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 1155) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 1156)     /* tmp = 1.0E0 */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1157)     _gen_one( tmp, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1158) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 1159)     /* Pad Significand with trailing decimal zeros */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1160)     /* Test for zero Exponent */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1161)     /* Copy Exponents */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1162) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 1163)     ei_cpye_unpack( inc, &y[1],    ne+1, ne );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1164) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 1165)     ei_cpye_unpack( inc, &y[ns+2], ne+1, ne );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1166) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 1167)     if( ei_cmp0e( inc, ne+1 ) == 0 ) /* Exponent == 0 */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1168)     {
868b2b66 (kx 2024-12-20 16:11:07 +0300 1169) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 1170)       while( (y[ne+2] & MASK_SIGN) == 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 1171) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 1172)       while( (y[ns]   & MASK_SIGN) == 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 1173) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 1174)       {
868b2b66 (kx 2024-12-20 16:11:07 +0300 1175)         ei_mul( y, y, ten, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1176)         ei_dece( expon, expon, ne+1 ); /* expon -= 1; */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1177)       }
868b2b66 (kx 2024-12-20 16:11:07 +0300 1178)     }
868b2b66 (kx 2024-12-20 16:11:07 +0300 1179)     else /* Exponent != 0 */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1180)     {
868b2b66 (kx 2024-12-20 16:11:07 +0300 1181)       ei_copy( w, y, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1182)       for( i = 0; i < n_dec + 1; i++ )
868b2b66 (kx 2024-12-20 16:11:07 +0300 1183)       {
868b2b66 (kx 2024-12-20 16:11:07 +0300 1184) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 1185)         if( (w[ne+ns+2] & 0x7) != 0 ) /* lgw */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1186) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 1187)         if( (w[0]       & 0x7) != 0 ) /* lgw */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1188) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 1189)            break;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1190) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 1191)         /* multiply by 10 */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1192)         ei_copyzlgw( u, w, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1193)         ei_shdown( u, (unsigned)2, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1194)         ei_addm( u, w, u, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1195) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 1196)         j = 3; /* Exponent += 3 */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1197)         ei_cvte_unpack( inc, (EMUSHORT *)&j, ne, 1 );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1198) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 1199)         ei_adde( &u[1],    &u[1],    inc, ne );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1200) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 1201)         ei_adde( &u[ns+2], &u[ns+2], inc, ne );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1202) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 1203) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 1204) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 1205)         while( u[ne+1] != (EMUSHORT)0 ) /* hgw != 0 */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1206) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 1207)         while( u[ns+1] != (EMUSHORT)0 ) /* hgw != 0 */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1208) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 1209)         {
868b2b66 (kx 2024-12-20 16:11:07 +0300 1210)            ei_shdown( u, (unsigned)1, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1211)            /* Exponent += 1 */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1212) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 1213)            ei_ince( &u[1],    &u[1],    ne );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1214) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 1215)            ei_ince( &u[ns+2], &u[ns+2], ne );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1216) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 1217)         }
868b2b66 (kx 2024-12-20 16:11:07 +0300 1218) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 1219)         if( u[ne+ns+2] != (EMUSHORT)0 ) /* lgw != 0 */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1220) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 1221)         if( u[0]       != (EMUSHORT)0 ) /* lgw != 0 */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1222) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 1223)            break;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1224) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 1225) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 1226)         if( ei_cmpe( &tmp[1],    &u[1],    ne ) <= 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 1227) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 1228)         if( ei_cmpe( &tmp[ns+2], &u[ns+2], ne ) <= 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 1229) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 1230)            break;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1231) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 1232)         ei_copyzlgw( w, u, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1233)         ei_dece( expon, expon, ne+1 ); /* expon -= 1; */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1234) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 1235)       } /* End for( i < n_dec ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1236) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 1237)       ei_copy( y, w, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1238) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 1239)     } /* Enf if( y[Exponent] == 0 ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1240) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 1241)     /* m = - MAXP */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1242)     for( i = 0; i < ne+1; i++ ) m[i] = (EMUSHORT)0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1243) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 1244)     m[1]    = HIGHT_EXMAX_P;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1245) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 1246)     m[ne-1] = HIGHT_EXMAX_P;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1247) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 1248) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 1249)     p = _get_mtens_ptr( nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1250)     r = _get_tens_ptr( nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1251) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 1252)     ei_copy( w, y, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1253)     ei_copy( t, tmp, nb ); /* t = 1.0 */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1254) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 1255)     while( ei_cmp( tmp, w, nb ) > 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 1256)     {
868b2b66 (kx 2024-12-20 16:11:07 +0300 1257)       if( ei_cmp( p, w, nb ) >= 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 1258)       {
868b2b66 (kx 2024-12-20 16:11:07 +0300 1259)         ei_mul( w, w, r, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1260)         ei_mul( t, t, r, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1261)         ei_sube( expon, expon, m, ne+1 ); /* expon -= m; */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1262)       }
868b2b66 (kx 2024-12-20 16:11:07 +0300 1263)       ei_shrn( m, m, (unsigned)1, ne+1 ); /* m /= 2; */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1264) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 1265)       if( ei_cmp0e( m, ne+1 ) == 0 ) break;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1266) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 1267)       p += np;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1268)       r += np;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1269)     }
868b2b66 (kx 2024-12-20 16:11:07 +0300 1270) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 1271)     ei_div( t, tmp, t, nb ); /* t = 1.0 / t; */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1272) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 1273)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300 1274) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 1275) isone:
868b2b66 (kx 2024-12-20 16:11:07 +0300 1276) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 1277)   /* Find the first (leading) digit */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1278)   ei_copy( w, t, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1279)   ei_copyzlgw( t, w, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1280)   ei_copy( w, y, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1281)   ei_copyzlgw( y, w, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1282) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 1283)   ei_remain( y, equot, y, t, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1284) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 1285) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 1286)   digit = equot[ne+ns+2]; /* lgw */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1287) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 1288)   digit = equot[0];       /* lgw */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1289) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 1290) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 1291)   /* tmp = 0E0 */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1292)   _gen_zero( tmp, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1293) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 1294)   while( (digit == 0) && (ei_cmp( y, tmp, nb ) != 0) )
868b2b66 (kx 2024-12-20 16:11:07 +0300 1295)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 1296)     ei_shup( y, (unsigned)1, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1297)     ei_copyzlgw( u, y, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1298)     ei_shup( u, (unsigned)2, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1299)     ei_addm( y, y, u, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1300)     ei_remain( y, equot, y, t, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1301) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 1302)     digit = equot[ne+ns+2]; /* lgw */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1303) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 1304)     digit = equot[0];       /* lgw */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1305) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 1306)     ei_dece( expon, expon, ne+1 ); /* expon -= 1; */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1307)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300 1308) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 1309)   s = t_string;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1310) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 1311)   if( sign ) *s++ = '-';
868b2b66 (kx 2024-12-20 16:11:07 +0300 1312)   else if( gen_plus )   *s++ = '+';
868b2b66 (kx 2024-12-20 16:11:07 +0300 1313)        else             *s++ = ' ';
868b2b66 (kx 2024-12-20 16:11:07 +0300 1314) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 1315)   /* Examine number of digits requested by caller */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1316)   if( ndigs < 0 )     ndigs = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1317)   if( ndigs > n_dec ) ndigs = (int)n_dec;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1318) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 1319)   if( digit == 10 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 1320)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 1321)     *s++ = '1';
868b2b66 (kx 2024-12-20 16:11:07 +0300 1322)     *s++ = '.';
868b2b66 (kx 2024-12-20 16:11:07 +0300 1323)     if( ndigs > 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 1324)     {
868b2b66 (kx 2024-12-20 16:11:07 +0300 1325)       *s++ = '0';
868b2b66 (kx 2024-12-20 16:11:07 +0300 1326)       ndigs -= 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1327)     }
868b2b66 (kx 2024-12-20 16:11:07 +0300 1328)     ei_ince( expon, expon, ne+1 ); /* expon += 1; */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1329)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300 1330)   else
868b2b66 (kx 2024-12-20 16:11:07 +0300 1331)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 1332)     *s++ = (__mpu_char8_t)digit + '0';
868b2b66 (kx 2024-12-20 16:11:07 +0300 1333)     *s++ = '.';
868b2b66 (kx 2024-12-20 16:11:07 +0300 1334)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300 1335) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 1336)   /* Generate digits after the decimal point */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1337)   for( k = 0; k <= ndigs; k++ )
868b2b66 (kx 2024-12-20 16:11:07 +0300 1338)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 1339)     ei_shup( y, (unsigned)1, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1340)     ei_copyzlgw( u, y, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1341)     ei_shup( u, (unsigned)2, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1342)     ei_addm( y, u, y, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1343)     ei_remain( y, equot, y, t, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1344) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 1345)     *s++ = (__mpu_char8_t)equot[ne+ns+2] + '0'; /* lgw */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1346) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 1347)     *s++ = (__mpu_char8_t)equot[0]       + '0'; /* lgw */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1348) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 1349)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300 1350) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 1351) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 1352)   digit = equot[ne+ns+2]; /* lgw */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1353) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 1354)   digit = equot[0];       /* lgw */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1355) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 1356) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 1357)   --s;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1358)   ss = s;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1359) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 1360)   /* Round off the ASCII string */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1361)   if( digit > 4 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 1362)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 1363)     /* Test for critical rounding case in ASCII output */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1364)     if( digit == 5 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 1365)     {
868b2b66 (kx 2024-12-20 16:11:07 +0300 1366)       ei_copy( t, y, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1367)       if( ei_cmp( t, tmp, nb ) != 0 ) goto roun;  /* round to nearest */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1368)       if( (*(s - 1) & 1) == 0 )       goto doexp; /* round to even */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1369) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 1370)     } /* End if( digit == 5 ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1371) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 1372)     /* Round up and propagate carry-outs */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1373) roun:
868b2b66 (kx 2024-12-20 16:11:07 +0300 1374)     --s;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1375)     k = *s & 0x7f;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1376)     /* Carry out to most significant digit? */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1377)     if( k == '.' )
868b2b66 (kx 2024-12-20 16:11:07 +0300 1378)     {
868b2b66 (kx 2024-12-20 16:11:07 +0300 1379)       --s;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1380)       k = *s;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1381)       k += 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1382)       *s = (__mpu_char8_t)k;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1383) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 1384)       /* Most significant digit carries to 10? */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1385)       if( k > '9' )
868b2b66 (kx 2024-12-20 16:11:07 +0300 1386)       {
868b2b66 (kx 2024-12-20 16:11:07 +0300 1387)         ei_ince( expon, expon, ne+1 ); /* expon += 1; */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1388)         *s = '1';
868b2b66 (kx 2024-12-20 16:11:07 +0300 1389)       }
868b2b66 (kx 2024-12-20 16:11:07 +0300 1390)       goto doexp;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1391)     }
868b2b66 (kx 2024-12-20 16:11:07 +0300 1392) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 1393)     /* Round up and carry out from less significant digits */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1394)     k += 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1395)     *s = (__mpu_char8_t)k;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1396)     if( k > '9' )
868b2b66 (kx 2024-12-20 16:11:07 +0300 1397)     {
868b2b66 (kx 2024-12-20 16:11:07 +0300 1398)       *s = '0';
868b2b66 (kx 2024-12-20 16:11:07 +0300 1399)       goto roun;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1400)     }
868b2b66 (kx 2024-12-20 16:11:07 +0300 1401) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 1402)   } /* Enf if( digit > 4 ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1403) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 1404) doexp:
868b2b66 (kx 2024-12-20 16:11:07 +0300 1405)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 1406)     __mpu_char8_t  sexp[512];
868b2b66 (kx 2024-12-20 16:11:07 +0300 1407)     __mpu_char8_t  sexd[4];
868b2b66 (kx 2024-12-20 16:11:07 +0300 1408) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 1409)     /* Не изменяет флаги: CF, AF, PF, ZF, SF, OF, RF. */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1410)     iitoa_np( sexp,
868b2b66 (kx 2024-12-20 16:11:07 +0300 1411)               expon,
868b2b66 (kx 2024-12-20 16:11:07 +0300 1412)               10, /* radix */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1413)               0,  /* upper flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1414)               ne+1 );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1415)     if( exp_digs > 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 1416)     {
868b2b66 (kx 2024-12-20 16:11:07 +0300 1417)       /*************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 1418)         Если это необходимо, недостающие цифры Exponent
868b2b66 (kx 2024-12-20 16:11:07 +0300 1419)         будут поставлены как старшие незначащие нули.
868b2b66 (kx 2024-12-20 16:11:07 +0300 1420)        *************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1421)       __mpu_char8_t  stmp[512], *ptr;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1422)       int            i, len;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1423) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 1424)       ptr = sexp;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1425)       if( *ptr == '-' ) ptr++; /* skip sign */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1426) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 1427)       len = strlen( ptr );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1428)       if( len < exp_digs )
868b2b66 (kx 2024-12-20 16:11:07 +0300 1429)       {
868b2b66 (kx 2024-12-20 16:11:07 +0300 1430)         strcpy( stmp, ptr );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1431)         len = exp_digs - len;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1432)         for( i = 0; i < len; i++ ) *ptr++ = '0';
868b2b66 (kx 2024-12-20 16:11:07 +0300 1433)         *ptr = '\0';
868b2b66 (kx 2024-12-20 16:11:07 +0300 1434)         strcat( sexp, stmp );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1435) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 1436)       } /* End if( len < exp_digs ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1437) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 1438)     } /* End if( exp_digs > 0 ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1439) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 1440)     if( ei_cmp0e( expon, ne+1 ) >= 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 1441)     {
868b2b66 (kx 2024-12-20 16:11:07 +0300 1442)       /* Don't use sprintf() */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1443)       sexd[0] = (__mpu_char8_t)exp_delim;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1444)       sexd[1] = '+';
868b2b66 (kx 2024-12-20 16:11:07 +0300 1445)       sexd[2] = '\0';
868b2b66 (kx 2024-12-20 16:11:07 +0300 1446)     }
868b2b66 (kx 2024-12-20 16:11:07 +0300 1447)     else
868b2b66 (kx 2024-12-20 16:11:07 +0300 1448)     {
868b2b66 (kx 2024-12-20 16:11:07 +0300 1449)       /* Don't use sprintf() */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1450)       sexd[0] = (__mpu_char8_t)exp_delim;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1451)       sexd[1] = '\0';
868b2b66 (kx 2024-12-20 16:11:07 +0300 1452)     }
868b2b66 (kx 2024-12-20 16:11:07 +0300 1453) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 1454)     strcpy( ss, sexd ); /* exp_delim */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1455)     strcat( ss, sexp );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1456)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300 1457) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 1458) bxit:
868b2b66 (kx 2024-12-20 16:11:07 +0300 1459)   rndprc = rndsave;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1460)   /* Copy out the working string */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1461)   s  = string;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1462)   ss = t_string;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1463)   while( *ss == ' ' ) ++ss; /* Strip possible leading space */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1464)   while( (*s++ = *ss++) != '\0' )
868b2b66 (kx 2024-12-20 16:11:07 +0300 1465)     ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1466) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 1467)   /* FREE t_string **********/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1468)   free( t_string );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1469)   /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1470) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 1471)   /* FREE n *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1472)   /* FREE m *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1473)   /* FREE expon *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1474)   /* FREE exone *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1475)   /* FREE inc ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1476)   __mpu_sbrk( -(int)(5*(ne+1)*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1477)   /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1478) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 1479)   /* FREE equot *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1480)   /* FREE tmp ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1481)   /* FREE ten ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1482)   /* FREE y *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1483)   /* FREE t *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1484)   /* FREE u *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1485)   /* FREE w *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1486)   __mpu_sbrk( -(int)(7*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1487)   /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1488) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 1489) } /* End of ei_real_to_ascii() */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1490) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 1491) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 1492) int ei_ascii_to_real( EMUSHORT *ei, __mpu_char8_t *ss, int nb )
868b2b66 (kx 2024-12-20 16:11:07 +0300 1493) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 1494) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 1495)  Description        : ei_ascii_to_real() Работает с
868b2b66 (kx 2024-12-20 16:11:07 +0300 1496)                                          internal e-type data
868b2b66 (kx 2024-12-20 16:11:07 +0300 1497)                                          struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300 1498) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 1499)  Concepts           : Convert ASCII string SS to internal
868b2b66 (kx 2024-12-20 16:11:07 +0300 1500)                       e-type EI.
868b2b66 (kx 2024-12-20 16:11:07 +0300 1501) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 1502)                       Return Code:
868b2b66 (kx 2024-12-20 16:11:07 +0300 1503)                       -1 (ASCII_TO_REAL_ERROR)  - read error;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1504)                        0 (LONGHAND_REAL_NUMBER) - прочитано простое
868b2b66 (kx 2024-12-20 16:11:07 +0300 1505)                                                   число (типа 1e1);
868b2b66 (kx 2024-12-20 16:11:07 +0300 1506)                        1 (REAL_PART_OF_COMPLEX) - прочитана
868b2b66 (kx 2024-12-20 16:11:07 +0300 1507)                                                   вещественная часть
868b2b66 (kx 2024-12-20 16:11:07 +0300 1508)                                                   комплексного числа
868b2b66 (kx 2024-12-20 16:11:07 +0300 1509)                                                   (типа 1r1);
868b2b66 (kx 2024-12-20 16:11:07 +0300 1510)                        2 (IMAGINARY_OF_COMPLEX) - прочитана мнимая
868b2b66 (kx 2024-12-20 16:11:07 +0300 1511)                                                   часть комплексного
868b2b66 (kx 2024-12-20 16:11:07 +0300 1512)                                                   числа
868b2b66 (kx 2024-12-20 16:11:07 +0300 1513)                                                   (типа 1j1);
868b2b66 (kx 2024-12-20 16:11:07 +0300 1514)                       NOTE:
868b2b66 (kx 2024-12-20 16:11:07 +0300 1515)                       ====
868b2b66 (kx 2024-12-20 16:11:07 +0300 1516)                         Количество цифр, после десятичной точки,
868b2b66 (kx 2024-12-20 16:11:07 +0300 1517)                         не должно превышать величины
868b2b66 (kx 2024-12-20 16:11:07 +0300 1518)                         REAL_nnnn_MDEC_DIG + 1 (см.: mpu-floatp.h).
868b2b66 (kx 2024-12-20 16:11:07 +0300 1519) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 1520)  Use Global Variable:
868b2b66 (kx 2024-12-20 16:11:07 +0300 1521) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 1522)  Use Functions      :
868b2b66 (kx 2024-12-20 16:11:07 +0300 1523)                       internal_np( nb );          | mpu-real.c
868b2b66 (kx 2024-12-20 16:11:07 +0300 1524)                       internal_ne( nb );          | mpu-real.c
868b2b66 (kx 2024-12-20 16:11:07 +0300 1525)                       internal_ns( nb );          | mpu-real.c
868b2b66 (kx 2024-12-20 16:11:07 +0300 1526) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 1527)  Parameters         :
868b2b66 (kx 2024-12-20 16:11:07 +0300 1528)                       EMUSHORT          *ei; - указатель на
868b2b66 (kx 2024-12-20 16:11:07 +0300 1529)                                                internal e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300 1530)                                                data struct;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1531)                       __mpu_char8_t     *ss; - input string;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1532)                       int                nb; - количество бит в
868b2b66 (kx 2024-12-20 16:11:07 +0300 1533)                                                external e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300 1534)                                                data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300 1535) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 1536)  Return             : int                rc; - Return Code.
868b2b66 (kx 2024-12-20 16:11:07 +0300 1537) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 1538)                       if( exp_delim == ('e' || 'E') ) rc =  0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1539)                       if( exp_delim == ('r' || 'R') ) rc =  1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1540)                       if( exp_delim == ('j' || 'J') ) rc =  2;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1541) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 1542)                       error:                          rc = -1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1543) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 1544)  ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1545) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 1546)   EMUSHORT       *nexp = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 1547)                  *lexp = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 1548)                  *dexp = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 1549)                   *exp = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 1550)                 *exone = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 1551)                   *inc = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 1552) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 1553)                    *yy = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 1554)                    *xt = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 1555)                    *tt = NULL;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1556)   EMUSHORT       nsign, *p, *min_dexp, *max_dexp;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1557)   __mpu_int32_t  j, jc;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1558)   int            k, trail, c, rndsave, n_ten;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1559)   int            esign, decflag, signflag, prec, lost;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1560)   __mpu_char8_t *s, *sp, *lstr = NULL;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1561)   int            rc     = ASCII_TO_REAL_ERROR,
868b2b66 (kx 2024-12-20 16:11:07 +0300 1562)                  type_r = LONGHAND_REAL_NUMBER;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1563)   int            np, ne, ns, i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1564) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 1565) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 1566)   errno = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1567) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 1568)   if( nb < NBR_32 || nb > MPU_REAL_IO_LIMIT )
868b2b66 (kx 2024-12-20 16:11:07 +0300 1569)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 1570)     /* error: Invalid size of operand(s) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1571)     __real_error_no = __R_ESIZE__;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1572)     __STIND; /* Set REAL ind-produsing operation Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1573)     return( rc );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1574)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300 1575) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 1576)   /* Copy the input string */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1577)   lstr = (__mpu_char8_t *)malloc( strlen( ss ) + 1 );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1578)   if( !lstr )
868b2b66 (kx 2024-12-20 16:11:07 +0300 1579)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 1580)     /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1581)     return( rc );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1582)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300 1583)   s = ss;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1584)   while( *s == ' ' ) ++s; /* Skip leading spaces */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1585)   sp = lstr;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1586)   while( (*sp++ = *s++) != '\0' )
868b2b66 (kx 2024-12-20 16:11:07 +0300 1587)     ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1588)   s = lstr;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1589) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 1590)   np = internal_np( nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1591)   ne = internal_ne( nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1592)   ns = internal_ns( nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1593) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 1594)   /*** Allocate memory for nexp, lexp, dexp, exp,
868b2b66 (kx 2024-12-20 16:11:07 +0300 1595)                         exone, inc . ***********************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1596)   nexp = (EMUSHORT *)__mpu_sbrk( (int)((ne+1)*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1597)   if( !nexp )
868b2b66 (kx 2024-12-20 16:11:07 +0300 1598)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 1599)     /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1600) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 1601)     /* FREE lstr **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1602)     free( lstr );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1603)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1604) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 1605)     return( rc );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1606)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300 1607) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 1608)   lexp = (EMUSHORT *)__mpu_sbrk( (int)((ne+1)*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1609)   if( !lexp )
868b2b66 (kx 2024-12-20 16:11:07 +0300 1610)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 1611)     /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1612) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 1613)     /* FREE lstr **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1614)     free( lstr );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1615)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1616) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 1617)     /* FREE nexp **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1618)     __mpu_sbrk( -(int)((ne+1)*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1619)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1620) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 1621)     return( rc );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1622)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300 1623) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 1624)   dexp = (EMUSHORT *)__mpu_sbrk( (int)((ne+1)*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1625)   if( !dexp )
868b2b66 (kx 2024-12-20 16:11:07 +0300 1626)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 1627)     /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1628) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 1629)     /* FREE lstr **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1630)     free( lstr );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1631)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1632) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 1633)     /* FREE nexp **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1634)     /* FREE lexp **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1635)     __mpu_sbrk( -(int)(2*(ne+1)*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1636)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1637) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 1638)     return( rc );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1639)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300 1640) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 1641)   exp = (EMUSHORT *)__mpu_sbrk( (int)((ne+1)*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1642)   if( !exp )
868b2b66 (kx 2024-12-20 16:11:07 +0300 1643)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 1644)     /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1645) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 1646)     /* FREE lstr **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1647)     free( lstr );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1648)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1649) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 1650)     /* FREE nexp **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1651)     /* FREE lexp **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1652)     /* FREE dexp **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1653)     __mpu_sbrk( -(int)(3*(ne+1)*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1654)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1655) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 1656)     return( rc );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1657)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300 1658) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 1659)   exone = (EMUSHORT *)__mpu_sbrk( (int)((ne+1)*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1660)   if( !exone )
868b2b66 (kx 2024-12-20 16:11:07 +0300 1661)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 1662)     /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1663) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 1664)     /* FREE lstr **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1665)     free( lstr );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1666)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1667) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 1668)     /* FREE nexp **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1669)     /* FREE lexp **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1670)     /* FREE dexp **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1671)     /* FREE exp ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1672)     __mpu_sbrk( -(int)(4*(ne+1)*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1673)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1674) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 1675)     return( rc );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1676)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300 1677) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 1678)   inc = (EMUSHORT *)__mpu_sbrk( (int)((ne+1)*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1679)   if( !inc )
868b2b66 (kx 2024-12-20 16:11:07 +0300 1680)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 1681)     /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1682) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 1683)     /* FREE lstr **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1684)     free( lstr );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1685)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1686) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 1687)     /* FREE nexp **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1688)     /* FREE lexp **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1689)     /* FREE dexp **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1690)     /* FREE exp ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1691)     /* FREE exone *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1692)     __mpu_sbrk( -(int)(5*(ne+1)*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1693)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1694) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 1695)     return( rc );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1696)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300 1697)   /************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1698) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 1699)   /*** Allocate memory for yy, xt, tt . ***********************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1700)   yy = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1701)   if( !yy )
868b2b66 (kx 2024-12-20 16:11:07 +0300 1702)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 1703)     /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1704) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 1705)     /* FREE lstr **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1706)     free( lstr );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1707)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1708) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 1709)     /* FREE nexp **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1710)     /* FREE lexp **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1711)     /* FREE dexp **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1712)     /* FREE exp ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1713)     /* FREE exone *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1714)     /* FREE inc ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1715)     __mpu_sbrk( -(int)(6*(ne+1)*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1716)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1717) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 1718)     return( rc );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1719)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300 1720) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 1721)   xt = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1722)   if( !xt )
868b2b66 (kx 2024-12-20 16:11:07 +0300 1723)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 1724)     /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1725) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 1726)     /* FREE lstr **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1727)     free( lstr );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1728)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1729) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 1730)     /* FREE nexp **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1731)     /* FREE lexp **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1732)     /* FREE dexp **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1733)     /* FREE exp ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1734)     /* FREE exone *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1735)     /* FREE inc ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1736)     __mpu_sbrk( -(int)(6*(ne+1)*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1737)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1738) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 1739)     /* FREE yy ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1740)     __mpu_sbrk( -(int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1741)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1742) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 1743)     return( rc );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1744)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300 1745) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 1746)   tt = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1747)   if( !tt )
868b2b66 (kx 2024-12-20 16:11:07 +0300 1748)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 1749)     /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1750) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 1751)     /* FREE lstr **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1752)     free( lstr );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1753)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1754) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 1755)     /* FREE nexp **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1756)     /* FREE lexp **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1757)     /* FREE dexp **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1758)     /* FREE exp ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1759)     /* FREE exone *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1760)     /* FREE inc ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1761)     __mpu_sbrk( -(int)(6*(ne+1)*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1762)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1763) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 1764)     /* FREE yy ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1765)     /* FREE xt ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1766)     __mpu_sbrk( -(int)(2*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1767)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1768) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 1769)     return( rc );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1770)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300 1771)   /************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1772) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 1773)   /* Gen EXONE */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1774) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 1775)   /* hight part */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1776)   p = exone;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1777)   *p++ = (EMUSHORT)0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1778)   *p++ = HIGHT_EXONE; /* 0x3fff... */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1779)   for( i = 0; i < ne - 1; i++ ) *p++ = MASK_ALL_BITS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1780) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 1781)   /* hight part */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1782)   p = exone + ne;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1783)   *p-- = (EMUSHORT)0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1784)   *p-- = HIGHT_EXONE;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1785)   for( i = 0; i < ne - 1; i++ ) *p-- = MASK_ALL_BITS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1786) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 1787) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 1788) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 1789)   rndsave = rndprc;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1790)   if( nb == NBR_32 )      rndprc = 24;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1791)   else if( nb == NBR_64 ) rndprc = 53;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1792)        else               rndprc = (int)NSBITS( nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1793) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 1794)   lost     = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1795)   nsign    = (EMUSHORT)0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1796)   decflag  = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1797)   signflag = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1798)   prec     = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1799)   for( i = 0; i < ne+1; i++ ) nexp[i] = (EMUSHORT)0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1800)   for( i = 0; i < ne+1; i++ )  exp[i] = (EMUSHORT)0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1801)   ei_cleaz( yy, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1802)   trail    = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1803) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 1804) nextcom:
868b2b66 (kx 2024-12-20 16:11:07 +0300 1805)   k = *s - '0';
868b2b66 (kx 2024-12-20 16:11:07 +0300 1806)   if( (k >= 0) && (k <= 9) )
868b2b66 (kx 2024-12-20 16:11:07 +0300 1807)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 1808)     /* Ignore leading zeros */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1809)     if( (prec == 0) && (decflag == 0) && (k == 0) ) goto donchar;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1810) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 1811)     /* Identify and strip trailing zeros after the decimal point */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1812)     if( (trail == 0) && (decflag != 0) )
868b2b66 (kx 2024-12-20 16:11:07 +0300 1813)     {
868b2b66 (kx 2024-12-20 16:11:07 +0300 1814)       sp = s;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1815)       while( (*sp >= '0') && (*sp <= '9') ) ++sp;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1816) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 1817)       /* check for syntax error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1818)       c = *sp & 0x7f; /* Only ASCII code */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1819)       if( (c != 'e')  && (c != 'E')  &&
868b2b66 (kx 2024-12-20 16:11:07 +0300 1820)           (c != 'r')  && (c != 'R')  &&
868b2b66 (kx 2024-12-20 16:11:07 +0300 1821)           (c != 'j')  && (c != 'J')  &&
868b2b66 (kx 2024-12-20 16:11:07 +0300 1822)           (c != '\n') && (c != '\r') &&
868b2b66 (kx 2024-12-20 16:11:07 +0300 1823)           (c != '\t') && (c != '\v') &&
868b2b66 (kx 2024-12-20 16:11:07 +0300 1824)           (c != '\0') &&
868b2b66 (kx 2024-12-20 16:11:07 +0300 1825)           (c != ' ')  && (c != ',') ) goto errors;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1826)       --sp;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1827)       while( *sp == '0' ) *sp-- = 'z';
868b2b66 (kx 2024-12-20 16:11:07 +0300 1828)       trail = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1829)       if( *s == 'z' ) goto donchar;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1830) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 1831)     } /* End if( trail == 0) && (decflag != 0) ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1832) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 1833)     /**************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 1834)       Продолжая пока не будет что-то записано в hgw, 
868b2b66 (kx 2024-12-20 16:11:07 +0300 1835)       мы гарантируем, что биты округления после нормализации
868b2b66 (kx 2024-12-20 16:11:07 +0300 1836)       будут выше lgw.
868b2b66 (kx 2024-12-20 16:11:07 +0300 1837)      **************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1838) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 1839)     if( yy[ne+1] == (EMUSHORT)0 ) /* hgw == 0 */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1840) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 1841)     if( yy[ns+1] == (EMUSHORT)0 ) /* hgw == 0 */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1842) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 1843)     {
868b2b66 (kx 2024-12-20 16:11:07 +0300 1844)       /* Count digits after decimal point */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1845)       if( decflag ) ei_ince( nexp, nexp, ne+1 );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1846) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 1847)       /* Multiply current number to 10 */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1848)       ei_shup( yy, (unsigned)1, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1849)       ei_copyzlgw( xt, yy, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1850)       ei_shup( xt, (unsigned)2, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1851)       ei_addm( yy, xt, yy, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1852)       ei_cleaz( xt, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1853) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 1854)       xt[ne+ns+1] = (EMUSHORT)k; /* low part of Significand */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1855) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 1856)       xt[1]       = (EMUSHORT)k; /* low part of Significand */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1857) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 1858)       ei_addm( yy, xt, yy, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1859)     }
868b2b66 (kx 2024-12-20 16:11:07 +0300 1860)     else /* ( hgw != 0 ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1861)     {
868b2b66 (kx 2024-12-20 16:11:07 +0300 1862)       /* Marc any lost non-zero digit */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1863)       lost |= k;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1864)       /* Count lost digits before the decimal point */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1865)       if( decflag == 0 ) ei_dece( nexp, nexp, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1866) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 1867)     } /* End if( hgw == 0 ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1868) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 1869)     prec += 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1870)     goto donchar;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1871) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 1872)   } /* End if( (k >= 0) && (k <= 9) ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1873) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 1874)   switch( *s )
868b2b66 (kx 2024-12-20 16:11:07 +0300 1875)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 1876)     case 'z':
868b2b66 (kx 2024-12-20 16:11:07 +0300 1877)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1878) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 1879)     case 'e':
868b2b66 (kx 2024-12-20 16:11:07 +0300 1880)     case 'E':
868b2b66 (kx 2024-12-20 16:11:07 +0300 1881)       goto exponent;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1882)     case 'r':
868b2b66 (kx 2024-12-20 16:11:07 +0300 1883)     case 'R':
868b2b66 (kx 2024-12-20 16:11:07 +0300 1884)       type_r = REAL_PART_OF_COMPLEX;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1885)       goto exponent;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1886)     case 'j':
868b2b66 (kx 2024-12-20 16:11:07 +0300 1887)     case 'J':
868b2b66 (kx 2024-12-20 16:11:07 +0300 1888)       type_r = IMAGINARY_OF_COMPLEX;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1889)       goto exponent;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1890) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 1891)     case '.': /* decimal point */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1892)       if( decflag ) goto errors;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1893)       ++decflag;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1894)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1895) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 1896)     case '-':
868b2b66 (kx 2024-12-20 16:11:07 +0300 1897)       nsign = MASK_ALL_BITS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1898)       if( signflag ) goto errors;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1899)       /* Здесь можно пропустить пробелы между знаком и числом: */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1900)       while( s[1] == ' '  ||
868b2b66 (kx 2024-12-20 16:11:07 +0300 1901)              s[1] == '\n' ||
868b2b66 (kx 2024-12-20 16:11:07 +0300 1902)              s[1] == '\r' ||
868b2b66 (kx 2024-12-20 16:11:07 +0300 1903)              s[1] == '\t' ||
868b2b66 (kx 2024-12-20 16:11:07 +0300 1904)              s[1] == '\v'    ) ++s;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1905)       ++signflag;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1906)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1907) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 1908)     case '+':
868b2b66 (kx 2024-12-20 16:11:07 +0300 1909)       if( signflag ) goto errors;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1910)       /* Здесь можно пропустить пробелы между знаком и числом: */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1911)       while( s[1] == ' '  ||
868b2b66 (kx 2024-12-20 16:11:07 +0300 1912)              s[1] == '\n' ||
868b2b66 (kx 2024-12-20 16:11:07 +0300 1913)              s[1] == '\r' ||
868b2b66 (kx 2024-12-20 16:11:07 +0300 1914)              s[1] == '\t' ||
868b2b66 (kx 2024-12-20 16:11:07 +0300 1915)              s[1] == '\v'    ) ++s;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1916)       ++signflag;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1917)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1918) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 1919)     case ',':
868b2b66 (kx 2024-12-20 16:11:07 +0300 1920)     case ' ':
868b2b66 (kx 2024-12-20 16:11:07 +0300 1921)     case '\0':
868b2b66 (kx 2024-12-20 16:11:07 +0300 1922)     case '\n':
868b2b66 (kx 2024-12-20 16:11:07 +0300 1923)     case '\r':
868b2b66 (kx 2024-12-20 16:11:07 +0300 1924)     case '\t':
868b2b66 (kx 2024-12-20 16:11:07 +0300 1925)     case '\v':
868b2b66 (kx 2024-12-20 16:11:07 +0300 1926)       goto daldone;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1927) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 1928)     case 'i':
868b2b66 (kx 2024-12-20 16:11:07 +0300 1929)     case 'I':
868b2b66 (kx 2024-12-20 16:11:07 +0300 1930)       /* ind ****************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1931)       if( (s[1] == 'n' || s[1] == 'N') &&
868b2b66 (kx 2024-12-20 16:11:07 +0300 1932)           (s[2] == 'd' || s[2] == 'D')   )
868b2b66 (kx 2024-12-20 16:11:07 +0300 1933)       {
868b2b66 (kx 2024-12-20 16:11:07 +0300 1934)         if( s[3] == '_' )
868b2b66 (kx 2024-12-20 16:11:07 +0300 1935)         {
868b2b66 (kx 2024-12-20 16:11:07 +0300 1936)           switch( s[4] )
868b2b66 (kx 2024-12-20 16:11:07 +0300 1937)           {
868b2b66 (kx 2024-12-20 16:11:07 +0300 1938)             case 'r':
868b2b66 (kx 2024-12-20 16:11:07 +0300 1939)             case 'R':
868b2b66 (kx 2024-12-20 16:11:07 +0300 1940)               type_r = REAL_PART_OF_COMPLEX;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1941)               break;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1942)             case 'j':
868b2b66 (kx 2024-12-20 16:11:07 +0300 1943)             case 'J':
868b2b66 (kx 2024-12-20 16:11:07 +0300 1944)               type_r = IMAGINARY_OF_COMPLEX;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1945)               break;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1946)             case 'e':
868b2b66 (kx 2024-12-20 16:11:07 +0300 1947)             case 'E':
868b2b66 (kx 2024-12-20 16:11:07 +0300 1948)               type_r = LONGHAND_REAL_NUMBER;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1949)               break;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1950)             default:
868b2b66 (kx 2024-12-20 16:11:07 +0300 1951)               break;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1952)           }
868b2b66 (kx 2024-12-20 16:11:07 +0300 1953)         }
868b2b66 (kx 2024-12-20 16:11:07 +0300 1954)         /* ind */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1955)         ei_ind( yy, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1956)         rndprc = rndsave;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1957)         goto ind_exit;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1958)       }
868b2b66 (kx 2024-12-20 16:11:07 +0300 1959)       /* inf ****************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1960)       else if( (s[1] == 'n' || s[1] == 'N') &&
868b2b66 (kx 2024-12-20 16:11:07 +0300 1961)                (s[2] == 'f' || s[2] == 'F')   )
868b2b66 (kx 2024-12-20 16:11:07 +0300 1962)       {
868b2b66 (kx 2024-12-20 16:11:07 +0300 1963)         if( s[3] == '_' )
868b2b66 (kx 2024-12-20 16:11:07 +0300 1964)         {
868b2b66 (kx 2024-12-20 16:11:07 +0300 1965)           switch( s[4] )
868b2b66 (kx 2024-12-20 16:11:07 +0300 1966)           {
868b2b66 (kx 2024-12-20 16:11:07 +0300 1967)             case 'r':
868b2b66 (kx 2024-12-20 16:11:07 +0300 1968)             case 'R':
868b2b66 (kx 2024-12-20 16:11:07 +0300 1969)               type_r = REAL_PART_OF_COMPLEX;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1970)               break;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1971)             case 'j':
868b2b66 (kx 2024-12-20 16:11:07 +0300 1972)             case 'J':
868b2b66 (kx 2024-12-20 16:11:07 +0300 1973)               type_r = IMAGINARY_OF_COMPLEX;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1974)               break;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1975)             case 'e':
868b2b66 (kx 2024-12-20 16:11:07 +0300 1976)             case 'E':
868b2b66 (kx 2024-12-20 16:11:07 +0300 1977)               type_r = LONGHAND_REAL_NUMBER;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1978)               break;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1979)             default:
868b2b66 (kx 2024-12-20 16:11:07 +0300 1980)               break;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1981)           }
868b2b66 (kx 2024-12-20 16:11:07 +0300 1982)         }
868b2b66 (kx 2024-12-20 16:11:07 +0300 1983)         /* inf */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1984)         goto infinite;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1985)       }
868b2b66 (kx 2024-12-20 16:11:07 +0300 1986)       else
868b2b66 (kx 2024-12-20 16:11:07 +0300 1987)       /**********************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1988)         goto errors;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1989) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 1990)     case 'n':
868b2b66 (kx 2024-12-20 16:11:07 +0300 1991)     case 'N':
868b2b66 (kx 2024-12-20 16:11:07 +0300 1992)       /* NaN ****************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1993)       if( (s[1] == 'a' || s[1] == 'A') &&
868b2b66 (kx 2024-12-20 16:11:07 +0300 1994)           (s[2] == 'n' || s[2] == 'N') )
868b2b66 (kx 2024-12-20 16:11:07 +0300 1995)       {
868b2b66 (kx 2024-12-20 16:11:07 +0300 1996)         if( s[3] == '_' )
868b2b66 (kx 2024-12-20 16:11:07 +0300 1997)         {
868b2b66 (kx 2024-12-20 16:11:07 +0300 1998)           switch( s[4] )
868b2b66 (kx 2024-12-20 16:11:07 +0300 1999)           {
868b2b66 (kx 2024-12-20 16:11:07 +0300 2000)             case 'r':
868b2b66 (kx 2024-12-20 16:11:07 +0300 2001)             case 'R':
868b2b66 (kx 2024-12-20 16:11:07 +0300 2002)               type_r = REAL_PART_OF_COMPLEX;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2003)               break;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2004)             case 'j':
868b2b66 (kx 2024-12-20 16:11:07 +0300 2005)             case 'J':
868b2b66 (kx 2024-12-20 16:11:07 +0300 2006)               type_r = IMAGINARY_OF_COMPLEX;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2007)               break;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2008)             case 'e':
868b2b66 (kx 2024-12-20 16:11:07 +0300 2009)             case 'E':
868b2b66 (kx 2024-12-20 16:11:07 +0300 2010)               type_r = LONGHAND_REAL_NUMBER;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2011)               break;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2012)             default:
868b2b66 (kx 2024-12-20 16:11:07 +0300 2013)               break;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2014)           }
868b2b66 (kx 2024-12-20 16:11:07 +0300 2015)         }
868b2b66 (kx 2024-12-20 16:11:07 +0300 2016)         /* nan */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2017)         ei_nan( yy, (unsigned)nsign, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 2018)         rndprc = rndsave;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2019)         goto ind_exit;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2020)       }
868b2b66 (kx 2024-12-20 16:11:07 +0300 2021)       else
868b2b66 (kx 2024-12-20 16:11:07 +0300 2022)       /**********************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2023)         goto errors;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2024) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 2025)     default:
868b2b66 (kx 2024-12-20 16:11:07 +0300 2026) errors:
868b2b66 (kx 2024-12-20 16:11:07 +0300 2027)       type_r = ASCII_TO_REAL_ERROR;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2028)       ei_nan( yy, (unsigned)0, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 2029)       goto aexit;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2030) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 2031)   } /* End of switch( *s ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2032) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 2033) donchar:
868b2b66 (kx 2024-12-20 16:11:07 +0300 2034)   ++s;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2035)   goto nextcom;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2036) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 2037)   /*************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 2038)     Exponent interpretation
868b2b66 (kx 2024-12-20 16:11:07 +0300 2039)    *************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2040) exponent:
868b2b66 (kx 2024-12-20 16:11:07 +0300 2041) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 2042)   max_dexp = _get_maxdecexp_ptr( nb ); /* size ne+1 always */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2043)   min_dexp = _get_mindecexp_ptr( nb ); /* size ne+1 always */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2044)   ei_cpye_unpack( dexp, min_dexp, ne+1, ne+1 );
868b2b66 (kx 2024-12-20 16:11:07 +0300 2045)   ei_nege( dexp, dexp, ne+1 ); /* dexp == -(MINDECEXP) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2046) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 2047)   esign = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2048)   ++s;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2049) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 2050)   /* Check for + or - */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2051)   if( *s == '-' )
868b2b66 (kx 2024-12-20 16:11:07 +0300 2052)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 2053)     esign = -1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2054)     ++s;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2055)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300 2056)   if( *s == '+' ) ++s;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2057) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 2058)   while( (*s >= '0') && (*s <= '9') )
868b2b66 (kx 2024-12-20 16:11:07 +0300 2059)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 2060)     /* exp *= 10; */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2061)     ei_shln( exp, exp, (unsigned)1, ne+1 );
868b2b66 (kx 2024-12-20 16:11:07 +0300 2062)     ei_shln( inc, exp, (unsigned)2, ne+1 );
868b2b66 (kx 2024-12-20 16:11:07 +0300 2063)     ei_adde( exp, inc, exp, ne+1 );
868b2b66 (kx 2024-12-20 16:11:07 +0300 2064) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 2065)     /* exp += *s++ - '0'; */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2066)     j = *s++ - '0';
868b2b66 (kx 2024-12-20 16:11:07 +0300 2067)     ei_cvte_unpack( inc, (EMUSHORT *)&j, ne+1, 1 );
868b2b66 (kx 2024-12-20 16:11:07 +0300 2068)     ei_adde( exp, exp, inc, ne+1 );
868b2b66 (kx 2024-12-20 16:11:07 +0300 2069) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 2070)     if( ei_cmpe( exp, dexp, ne+1 ) > 0 ) /* exp > -(MINDECEXP) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2071)     {
868b2b66 (kx 2024-12-20 16:11:07 +0300 2072)       if( esign < 0 ) goto zero;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2073)       else            goto infinite;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2074)     }
868b2b66 (kx 2024-12-20 16:11:07 +0300 2075) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 2076)   } /* End of while( is_digit(*s) ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2077) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 2078) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 2079)   if( esign < 0 ) ei_nege( exp, exp, ne+1 ); /* exp = -exp */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2080) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 2081)   if( ei_cmpe( exp, max_dexp, ne+1 ) > 0 ) /* exp > (MAXDECEXP) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2082)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 2083) infinite:
868b2b66 (kx 2024-12-20 16:11:07 +0300 2084)     ei_infin( yy, (unsigned)nsign, nb ); /* Infinity */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2085)     goto aexit;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2086)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300 2087) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 2088)   if( ei_cmpe( exp, min_dexp, ne+1 ) < 0 ) /* exp < (MINDECEXP) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2089)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 2090) zero:
868b2b66 (kx 2024-12-20 16:11:07 +0300 2091)     ei_signull( yy, (unsigned)nsign, nb ); /* signed NULL */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2092)     goto aexit;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2093)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300 2094) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 2095) daldone:
868b2b66 (kx 2024-12-20 16:11:07 +0300 2096) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 2097)   ei_sube( nexp, exp, nexp, ne+1 );
868b2b66 (kx 2024-12-20 16:11:07 +0300 2098) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 2099)   /* Pad trailing zeros to minimize power of 10, per IEEE spec. */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2100)   while( (ei_cmp0e( nexp, ne+1 ) > 0) &&
868b2b66 (kx 2024-12-20 16:11:07 +0300 2101) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 2102)        (yy[ne+1] == (EMUSHORT)0) ) /* hgw == 0 */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2103) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 2104)        (yy[ns+1] == (EMUSHORT)0) ) /* hgw == 0 */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2105) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 2106)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 2107)     ei_copyzlgw( xt, yy, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 2108)     ei_shup( xt, (unsigned)2, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 2109)     ei_addm( xt, yy, xt, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 2110)     ei_shup( xt, (unsigned)1, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 2111) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 2112)     if( xt[ne+1] != (EMUSHORT)0 ) break; /* hgw != 0 */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2113) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 2114)     if( xt[ns+1] != (EMUSHORT)0 ) break; /* hgw != 0 */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2115) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 2116)     ei_dece( nexp, nexp, ne+1 ); /* nexp -= 1; */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2117)     ei_copyzlgw( yy, xt, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 2118) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 2119)   } /* End of while( (nexp > 0) && (hgw == 0) ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2120) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 2121)   if( (jc = ei_normalize( yy, nb )) > (__mpu_int32_t)NSBITS(nb) )
868b2b66 (kx 2024-12-20 16:11:07 +0300 2122)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 2123)     ei_cleaz( yy, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 2124)     type_r = rc; /* количество цифр после точки превышает размер мантиссы */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2125)     goto aexit;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2126)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300 2127) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 2128)   /* lexp = (EXONE - 1 + NSBITS(nb)) - jc */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2129)   ei_dece( lexp, exone, ne+1 );
868b2b66 (kx 2024-12-20 16:11:07 +0300 2130)   j = NSBITS( nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 2131)   ei_cvte_unpack(  inc,  (EMUSHORT *)&j, ne+1, 1 );
868b2b66 (kx 2024-12-20 16:11:07 +0300 2132)   ei_cvte_unpack( dexp, (EMUSHORT *)&jc, ne+1, 1 );
868b2b66 (kx 2024-12-20 16:11:07 +0300 2133)   ei_adde( lexp, lexp,  inc, ne+1 );
868b2b66 (kx 2024-12-20 16:11:07 +0300 2134)   ei_sube( lexp, lexp, dexp, ne+1 );
868b2b66 (kx 2024-12-20 16:11:07 +0300 2135) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 2136)   /*
868b2b66 (kx 2024-12-20 16:11:07 +0300 2137)     Здесь главное, чтобы параметр int rcontrol не был равен 0,
868b2b66 (kx 2024-12-20 16:11:07 +0300 2138)     для того чтобы функция ei_mdenorm() использовала, ранее
868b2b66 (kx 2024-12-20 16:11:07 +0300 2139)     установленное значение RNDPRC
868b2b66 (kx 2024-12-20 16:11:07 +0300 2140)    */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2141)   ei_mdenorm( yy, lost, 0, lexp, NSBITS_DEFAULT, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 2142) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 2143) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 2144)   /******************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 2145)     Convert GO ON
868b2b66 (kx 2024-12-20 16:11:07 +0300 2146)    ******************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2147) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 2148)   /* dexp = MAXP */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2149)   for( i = 0; i < ne+1; i++ ) dexp[i] = (EMUSHORT)0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2150) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 2151)   dexp[1]    = HIGHT_EXMAX_P;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2152) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 2153)   dexp[ne-1] = HIGHT_EXMAX_P;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2154) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 2155) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 2156)   n_ten = _get_nten( nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 2157) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 2158)   p = _get_tens_ptr( nb ); /* *p = 10**MAXP */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2159) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 2160)   /* Copy Exponents */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2161) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 2162)   ei_cpye_unpack( lexp, &yy[1],    ne+1, ne );
868b2b66 (kx 2024-12-20 16:11:07 +0300 2163) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 2164)   ei_cpye_unpack( lexp, &yy[ns+2], ne+1, ne );
868b2b66 (kx 2024-12-20 16:11:07 +0300 2165) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 2166) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 2167)   if( ei_cmp0e( nexp, ne+1 ) == 0 ) /* nexp == 0 */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2168)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 2169)     j = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2170)     goto expdone;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2171) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 2172)   } /* End if( nexp == 0 ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2173) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 2174)   esign = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2175)   if( ei_cmp0e( nexp, ne+1 )  < 0 ) /* nexp  < 0 */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2176)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 2177)     ei_nege( nexp, nexp, ne+1 );
868b2b66 (kx 2024-12-20 16:11:07 +0300 2178)     esign = -1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2179)     if( ei_cmpe( nexp, dexp, ne+1 ) > 0 ) /* nexp > MAXP */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2180)     {
868b2b66 (kx 2024-12-20 16:11:07 +0300 2181)       /* Punt. Can't handle this without 2 divides */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2182)       ei_copy( tt, p, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 2183)       /* Copy Exponents */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2184) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 2185)       ei_cpye_unpack( inc, &tt[1],    ne+1, ne );
868b2b66 (kx 2024-12-20 16:11:07 +0300 2186) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 2187)       ei_cpye_unpack( inc, &tt[ns+2], ne+1, ne );
868b2b66 (kx 2024-12-20 16:11:07 +0300 2188) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 2189)       ei_sube( lexp, lexp, inc, ne+1 );
868b2b66 (kx 2024-12-20 16:11:07 +0300 2190)       j = ei_divm( yy, yy, tt, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 2191)       ei_adde( lexp, lexp, exone, ne+1 );
868b2b66 (kx 2024-12-20 16:11:07 +0300 2192)       ei_sube( nexp, nexp, dexp, ne+1 );
868b2b66 (kx 2024-12-20 16:11:07 +0300 2193)     }
868b2b66 (kx 2024-12-20 16:11:07 +0300 2194) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 2195)   } /* End if( nexp < 0 ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2196)  
868b2b66 (kx 2024-12-20 16:11:07 +0300 2197)   p = _get_tens_ptr( nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 2198)   p += np*n_ten;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2199) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 2200)   /* xt = 1.0E0 */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2201)   _gen_one( xt, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 2202) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 2203)   for( i = 0; i < ne+1; i++ )  exp[i] = (EMUSHORT)0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2204) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 2205)   exp[ne] = (EMUSHORT)1; /* exp = 1 */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2206) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 2207)   exp[0]  = (EMUSHORT)1; /* exp = 1 */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2208) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 2209) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 2210)   do
868b2b66 (kx 2024-12-20 16:11:07 +0300 2211)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 2212)     ei_ande( inc, exp, nexp, ne+1 );
868b2b66 (kx 2024-12-20 16:11:07 +0300 2213)     if( ei_cmp0e( inc, ne+1 ) ) /* if( exp & nexp ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2214)       ei_mul( xt, xt, p, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 2215)     p -= np;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2216)     ei_adde( exp, exp, exp, ne+1 );
868b2b66 (kx 2024-12-20 16:11:07 +0300 2217) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 2218)   } while( ei_cmpe( exp, dexp, ne+1 ) <= 0 ); /* exp <= MAXP */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2219) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 2220)   ei_copy( tt, xt, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 2221) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 2222)   /* Copy Exponent of TT */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2223) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 2224)   ei_cpye_unpack( inc, &tt[1],    ne+1, ne );
868b2b66 (kx 2024-12-20 16:11:07 +0300 2225) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 2226)   ei_cpye_unpack( inc, &tt[ns+2], ne+1, ne );
868b2b66 (kx 2024-12-20 16:11:07 +0300 2227) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 2228)   if( esign < 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 2229)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 2230)     ei_sube( lexp, lexp, inc, ne+1 );
868b2b66 (kx 2024-12-20 16:11:07 +0300 2231)     j = ei_divm( yy, yy, tt, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 2232)     ei_adde( lexp, lexp, exone, ne+1 );
868b2b66 (kx 2024-12-20 16:11:07 +0300 2233)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300 2234)   else
868b2b66 (kx 2024-12-20 16:11:07 +0300 2235)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 2236)     ei_adde( lexp, lexp, inc, ne+1 );
868b2b66 (kx 2024-12-20 16:11:07 +0300 2237)     j = ei_mulm( yy, yy, tt, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 2238)     ei_sube( lexp, lexp, exone, ne+1 );
868b2b66 (kx 2024-12-20 16:11:07 +0300 2239)     ei_ince( lexp, lexp, ne+1 ); /* lexp -= EXONE -1; */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2240)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300 2241) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 2242) expdone:
868b2b66 (kx 2024-12-20 16:11:07 +0300 2243) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 2244)   /*
868b2b66 (kx 2024-12-20 16:11:07 +0300 2245)     Здесь главное, чтобы параметр int rcontrol не был равен 0,
868b2b66 (kx 2024-12-20 16:11:07 +0300 2246)     для того чтобы функция ei_mdenorm() использовала, ранее
868b2b66 (kx 2024-12-20 16:11:07 +0300 2247)     установленное значение RNDPRC
868b2b66 (kx 2024-12-20 16:11:07 +0300 2248)    */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2249)   ei_mdenorm( yy, (int)j, 0, lexp, NSBITS_DEFAULT, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 2250) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 2251) aexit:
868b2b66 (kx 2024-12-20 16:11:07 +0300 2252) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 2253)   rndprc = rndsave;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2254) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 2255)   yy[0]       = nsign; /* copy Sign */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2256) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 2257)   yy[ne+ns+2] = nsign; /* copy Sign */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2258) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 2259) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 2260) ind_exit:
868b2b66 (kx 2024-12-20 16:11:07 +0300 2261)   ei_copy( ei, yy, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 2262) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 2263)   /* FREE lstr **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2264)   free( lstr );
868b2b66 (kx 2024-12-20 16:11:07 +0300 2265)   /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2266) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 2267)   /* FREE nexp **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2268)   /* FREE lexp **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2269)   /* FREE dexp **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2270)   /* FREE exp ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2271)   /* FREE exone *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2272)   /* FREE inc ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2273)   __mpu_sbrk( -(int)(6*(ne+1)*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 2274)   /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2275) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 2276)   /* FREE yy ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2277)   /* FREE xt ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2278)   /* FREE tt ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2279)   __mpu_sbrk( -(int)(3*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 2280)   /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2281) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 2282)   rc = type_r;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2283)   return( rc );
868b2b66 (kx 2024-12-20 16:11:07 +0300 2284) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 2285) } /* End of ei_ascii_to_real() */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2286) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 2287) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 2288) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 2289)   Hide internal symbols:
868b2b66 (kx 2024-12-20 16:11:07 +0300 2290)  ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2291) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 2292) __mpu_hidden_decl(ei_real_to_ascii);
868b2b66 (kx 2024-12-20 16:11:07 +0300 2293) __mpu_hidden_decl(ei_ascii_to_real);
868b2b66 (kx 2024-12-20 16:11:07 +0300 2294) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 2295) /*
868b2b66 (kx 2024-12-20 16:11:07 +0300 2296)   End of hide internal symbols.
868b2b66 (kx 2024-12-20 16:11:07 +0300 2297)  ***************************************************************/