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) ***************************************************************/