868b2b66 (kx 2024-12-20 16:11:07 +0300 1)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 3) __ST_ATAN2.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) ATAN2 constants operations.
868b2b66 (kx 2024-12-20 16:11:07 +0300 7)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8) PART OF : MPU - library .
868b2b66 (kx 2024-12-20 16:11:07 +0300 9)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10) USAGE : Internal only .
868b2b66 (kx 2024-12-20 16:11:07 +0300 11)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12) NOTE : NONE .
868b2b66 (kx 2024-12-20 16:11:07 +0300 13)
868b2b66 (kx 2024-12-20 16:11:07 +0300 14) Copyright (C) 2000 - 2024 by Andrew V.Kosteltsev.
868b2b66 (kx 2024-12-20 16:11:07 +0300 15) All Rights Reserved.
868b2b66 (kx 2024-12-20 16:11:07 +0300 16) ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 17)
868b2b66 (kx 2024-12-20 16:11:07 +0300 18) #ifdef HAVE_CONFIG_H
868b2b66 (kx 2024-12-20 16:11:07 +0300 19) #include <config.h>
868b2b66 (kx 2024-12-20 16:11:07 +0300 20) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 21)
868b2b66 (kx 2024-12-20 16:11:07 +0300 22) #include <errno.h> /* errno(3) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 23) #include <string.h> /* strcpy(3) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 24) #include <strings.h> /* bzero(3) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 25) #include <stdlib.h>
868b2b66 (kx 2024-12-20 16:11:07 +0300 26)
868b2b66 (kx 2024-12-20 16:11:07 +0300 27) #include <libmpu.h>
868b2b66 (kx 2024-12-20 16:11:07 +0300 28) #include <mpu-context.h>
868b2b66 (kx 2024-12-20 16:11:07 +0300 29)
868b2b66 (kx 2024-12-20 16:11:07 +0300 30) #include <mpu-emutype.h>
868b2b66 (kx 2024-12-20 16:11:07 +0300 31) #include <mpu-integer.h>
868b2b66 (kx 2024-12-20 16:11:07 +0300 32) #include <mpu-real.h>
868b2b66 (kx 2024-12-20 16:11:07 +0300 33) #include <mpu-floatp.h>
868b2b66 (kx 2024-12-20 16:11:07 +0300 34)
868b2b66 (kx 2024-12-20 16:11:07 +0300 35) #include <mpu-char.h>
868b2b66 (kx 2024-12-20 16:11:07 +0300 36) #include <mpu-symbols.h>
868b2b66 (kx 2024-12-20 16:11:07 +0300 37)
868b2b66 (kx 2024-12-20 16:11:07 +0300 38) #include <mpu-math-errno.h>
868b2b66 (kx 2024-12-20 16:11:07 +0300 39) #include <mpu-mtherr.h>
868b2b66 (kx 2024-12-20 16:11:07 +0300 40)
868b2b66 (kx 2024-12-20 16:11:07 +0300 41)
868b2b66 (kx 2024-12-20 16:11:07 +0300 42) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 43) Кодировка имен файлов:
868b2b66 (kx 2024-12-20 16:11:07 +0300 44)
868b2b66 (kx 2024-12-20 16:11:07 +0300 45) Трехзначное десятичное число, представляющее количество
868b2b66 (kx 2024-12-20 16:11:07 +0300 46) 128-и битных слов, из которых состоят вещественные числа
868b2b66 (kx 2024-12-20 16:11:07 +0300 47) размещенные в массивах:
868b2b66 (kx 2024-12-20 16:11:07 +0300 48)
868b2b66 (kx 2024-12-20 16:11:07 +0300 49) размер чисел в битах кодировка
868b2b66 (kx 2024-12-20 16:11:07 +0300 50) -------------------- ---------
868b2b66 (kx 2024-12-20 16:11:07 +0300 51) 128 001
868b2b66 (kx 2024-12-20 16:11:07 +0300 52) 256 002
868b2b66 (kx 2024-12-20 16:11:07 +0300 53) 512 004
868b2b66 (kx 2024-12-20 16:11:07 +0300 54) 1024 008
868b2b66 (kx 2024-12-20 16:11:07 +0300 55) 2048 016
868b2b66 (kx 2024-12-20 16:11:07 +0300 56) 4096 032
868b2b66 (kx 2024-12-20 16:11:07 +0300 57) 8192 064
868b2b66 (kx 2024-12-20 16:11:07 +0300 58) 16384 128
868b2b66 (kx 2024-12-20 16:11:07 +0300 59) 32768 256
868b2b66 (kx 2024-12-20 16:11:07 +0300 60) 65536 512 (это предел);
868b2b66 (kx 2024-12-20 16:11:07 +0300 61)
868b2b66 (kx 2024-12-20 16:11:07 +0300 62) ПРИМЕРЫ:
868b2b66 (kx 2024-12-20 16:11:07 +0300 63) -------
868b2b66 (kx 2024-12-20 16:11:07 +0300 64) ei_atan2_001_emu32lsb.dfn - 128-бит,
868b2b66 (kx 2024-12-20 16:11:07 +0300 65) ei_atan2_512_emu32lsb.dfn - 65536-бит.
868b2b66 (kx 2024-12-20 16:11:07 +0300 66)
868b2b66 (kx 2024-12-20 16:11:07 +0300 67) ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 68)
868b2b66 (kx 2024-12-20 16:11:07 +0300 69) #if MPU_MATH_FN_LIMIT >= 128
868b2b66 (kx 2024-12-20 16:11:07 +0300 70) #if MPU_WORD_ORDER_BIG_ENDIAN == 0
868b2b66 (kx 2024-12-20 16:11:07 +0300 71) #include <math/atan2/emu00128/ei_atan2_001_emu32lsb.dfn>
868b2b66 (kx 2024-12-20 16:11:07 +0300 72) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 73) #include <math/atan2/emu00128/ei_atan2_001_emu32msb.dfn>
868b2b66 (kx 2024-12-20 16:11:07 +0300 74) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 75) #endif /* MPU_MATH_FN_LIMIT >= 128 */
868b2b66 (kx 2024-12-20 16:11:07 +0300 76)
868b2b66 (kx 2024-12-20 16:11:07 +0300 77) #if MPU_MATH_FN_LIMIT >= 256
868b2b66 (kx 2024-12-20 16:11:07 +0300 78) #if MPU_WORD_ORDER_BIG_ENDIAN == 0
868b2b66 (kx 2024-12-20 16:11:07 +0300 79) #include <math/atan2/emu00256/ei_atan2_002_emu32lsb.dfn>
868b2b66 (kx 2024-12-20 16:11:07 +0300 80) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 81) #include <math/atan2/emu00256/ei_atan2_002_emu32msb.dfn>
868b2b66 (kx 2024-12-20 16:11:07 +0300 82) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 83) #endif /* MPU_MATH_FN_LIMIT >= 256 */
868b2b66 (kx 2024-12-20 16:11:07 +0300 84)
868b2b66 (kx 2024-12-20 16:11:07 +0300 85) #if MPU_MATH_FN_LIMIT >= 512
868b2b66 (kx 2024-12-20 16:11:07 +0300 86) #if MPU_WORD_ORDER_BIG_ENDIAN == 0
868b2b66 (kx 2024-12-20 16:11:07 +0300 87) #include <math/atan2/emu00512/ei_atan2_004_emu32lsb.dfn>
868b2b66 (kx 2024-12-20 16:11:07 +0300 88) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 89) #include <math/atan2/emu00512/ei_atan2_004_emu32msb.dfn>
868b2b66 (kx 2024-12-20 16:11:07 +0300 90) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 91) #endif /* MPU_MATH_FN_LIMIT >= 512 */
868b2b66 (kx 2024-12-20 16:11:07 +0300 92)
868b2b66 (kx 2024-12-20 16:11:07 +0300 93) #if MPU_MATH_FN_LIMIT >= 1024
868b2b66 (kx 2024-12-20 16:11:07 +0300 94) #if MPU_WORD_ORDER_BIG_ENDIAN == 0
868b2b66 (kx 2024-12-20 16:11:07 +0300 95) #include <math/atan2/emu01024/ei_atan2_008_emu32lsb.dfn>
868b2b66 (kx 2024-12-20 16:11:07 +0300 96) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 97) #include <math/atan2/emu01024/ei_atan2_008_emu32msb.dfn>
868b2b66 (kx 2024-12-20 16:11:07 +0300 98) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 99) #endif /* MPU_MATH_FN_LIMIT >= 1024 */
868b2b66 (kx 2024-12-20 16:11:07 +0300 100)
868b2b66 (kx 2024-12-20 16:11:07 +0300 101) #if MPU_MATH_FN_LIMIT >= 2048
868b2b66 (kx 2024-12-20 16:11:07 +0300 102) #if MPU_WORD_ORDER_BIG_ENDIAN == 0
868b2b66 (kx 2024-12-20 16:11:07 +0300 103) #include <math/atan2/emu02048/ei_atan2_016_emu32lsb.dfn>
868b2b66 (kx 2024-12-20 16:11:07 +0300 104) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 105) #include <math/atan2/emu02048/ei_atan2_016_emu32msb.dfn>
868b2b66 (kx 2024-12-20 16:11:07 +0300 106) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 107) #endif /* MPU_MATH_FN_LIMIT >= 2048 */
868b2b66 (kx 2024-12-20 16:11:07 +0300 108)
868b2b66 (kx 2024-12-20 16:11:07 +0300 109) #if MPU_MATH_FN_LIMIT >= 4096
868b2b66 (kx 2024-12-20 16:11:07 +0300 110) #if MPU_WORD_ORDER_BIG_ENDIAN == 0
868b2b66 (kx 2024-12-20 16:11:07 +0300 111) #include <math/atan2/emu04096/ei_atan2_032_emu32lsb.dfn>
868b2b66 (kx 2024-12-20 16:11:07 +0300 112) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 113) #include <math/atan2/emu04096/ei_atan2_032_emu32msb.dfn>
868b2b66 (kx 2024-12-20 16:11:07 +0300 114) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 115) #endif /* MPU_MATH_FN_LIMIT >= 4096 */
868b2b66 (kx 2024-12-20 16:11:07 +0300 116)
868b2b66 (kx 2024-12-20 16:11:07 +0300 117) #if MPU_MATH_FN_LIMIT >= 8192
868b2b66 (kx 2024-12-20 16:11:07 +0300 118) #if MPU_WORD_ORDER_BIG_ENDIAN == 0
868b2b66 (kx 2024-12-20 16:11:07 +0300 119) #include <math/atan2/emu08192/ei_atan2_064_emu32lsb.dfn>
868b2b66 (kx 2024-12-20 16:11:07 +0300 120) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 121) #include <math/atan2/emu08192/ei_atan2_064_emu32msb.dfn>
868b2b66 (kx 2024-12-20 16:11:07 +0300 122) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 123) #endif /* MPU_MATH_FN_LIMIT >= 8192 */
868b2b66 (kx 2024-12-20 16:11:07 +0300 124)
868b2b66 (kx 2024-12-20 16:11:07 +0300 125) #if MPU_MATH_FN_LIMIT >= 16384
868b2b66 (kx 2024-12-20 16:11:07 +0300 126) #if MPU_WORD_ORDER_BIG_ENDIAN == 0
868b2b66 (kx 2024-12-20 16:11:07 +0300 127) #include <math/atan2/emu16384/ei_atan2_128_emu32lsb.dfn>
868b2b66 (kx 2024-12-20 16:11:07 +0300 128) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 129) #include <math/atan2/emu16384/ei_atan2_128_emu32msb.dfn>
868b2b66 (kx 2024-12-20 16:11:07 +0300 130) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 131) #endif /* MPU_MATH_FN_LIMIT >= 16384 */
868b2b66 (kx 2024-12-20 16:11:07 +0300 132)
868b2b66 (kx 2024-12-20 16:11:07 +0300 133) #if MPU_MATH_FN_LIMIT >= 32768
868b2b66 (kx 2024-12-20 16:11:07 +0300 134) #if MPU_WORD_ORDER_BIG_ENDIAN == 0
868b2b66 (kx 2024-12-20 16:11:07 +0300 135) #include <math/atan2/emu32768/ei_atan2_256_emu32lsb.dfn>
868b2b66 (kx 2024-12-20 16:11:07 +0300 136) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 137) #include <math/atan2/emu32768/ei_atan2_256_emu32msb.dfn>
868b2b66 (kx 2024-12-20 16:11:07 +0300 138) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 139) #endif /* MPU_MATH_FN_LIMIT >= 32768 */
868b2b66 (kx 2024-12-20 16:11:07 +0300 140)
868b2b66 (kx 2024-12-20 16:11:07 +0300 141) #if MPU_MATH_FN_LIMIT >= 65536
868b2b66 (kx 2024-12-20 16:11:07 +0300 142) #if MPU_WORD_ORDER_BIG_ENDIAN == 0
868b2b66 (kx 2024-12-20 16:11:07 +0300 143) #include <math/atan2/emu65536/ei_atan2_512_emu32lsb.dfn>
868b2b66 (kx 2024-12-20 16:11:07 +0300 144) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 145) #include <math/atan2/emu65536/ei_atan2_512_emu32msb.dfn>
868b2b66 (kx 2024-12-20 16:11:07 +0300 146) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 147) #endif /* MPU_MATH_FN_LIMIT >= 65536 */
868b2b66 (kx 2024-12-20 16:11:07 +0300 148)
868b2b66 (kx 2024-12-20 16:11:07 +0300 149)
868b2b66 (kx 2024-12-20 16:11:07 +0300 150) static int _get_n_atan2( int nb )
868b2b66 (kx 2024-12-20 16:11:07 +0300 151) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 152) int rc = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 153)
868b2b66 (kx 2024-12-20 16:11:07 +0300 154) if( nb < NBR_32 || nb > MPU_MATH_FN_LIMIT )
868b2b66 (kx 2024-12-20 16:11:07 +0300 155) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 156) /* error: Invalid size of operand(s) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 157) __real_error_no = __R_ESIZE__;
868b2b66 (kx 2024-12-20 16:11:07 +0300 158) __STIND; /* Set REAL ind-produsing operation Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 159) return( rc );
868b2b66 (kx 2024-12-20 16:11:07 +0300 160) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 161)
868b2b66 (kx 2024-12-20 16:11:07 +0300 162) switch( nb )
868b2b66 (kx 2024-12-20 16:11:07 +0300 163) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 164) #if MPU_MATH_FN_LIMIT >= 128
868b2b66 (kx 2024-12-20 16:11:07 +0300 165) case NBR_32 :
868b2b66 (kx 2024-12-20 16:11:07 +0300 166) case NBR_64 :
868b2b66 (kx 2024-12-20 16:11:07 +0300 167) case NBR_128 :
868b2b66 (kx 2024-12-20 16:11:07 +0300 168) rc = N_ATAN2_A128;
868b2b66 (kx 2024-12-20 16:11:07 +0300 169) break;
868b2b66 (kx 2024-12-20 16:11:07 +0300 170) #endif /* MPU_MATH_FN_LIMIT >= 128 */
868b2b66 (kx 2024-12-20 16:11:07 +0300 171) #if MPU_MATH_FN_LIMIT >= 256
868b2b66 (kx 2024-12-20 16:11:07 +0300 172) case NBR_256 :
868b2b66 (kx 2024-12-20 16:11:07 +0300 173) rc = N_ATAN2_A256;
868b2b66 (kx 2024-12-20 16:11:07 +0300 174) break;
868b2b66 (kx 2024-12-20 16:11:07 +0300 175) #endif /* MPU_MATH_FN_LIMIT >= 256 */
868b2b66 (kx 2024-12-20 16:11:07 +0300 176) #if MPU_MATH_FN_LIMIT >= 512
868b2b66 (kx 2024-12-20 16:11:07 +0300 177) case NBR_512 :
868b2b66 (kx 2024-12-20 16:11:07 +0300 178) rc = N_ATAN2_A512;
868b2b66 (kx 2024-12-20 16:11:07 +0300 179) break;
868b2b66 (kx 2024-12-20 16:11:07 +0300 180) #endif /* MPU_MATH_FN_LIMIT >= 512 */
868b2b66 (kx 2024-12-20 16:11:07 +0300 181) #if MPU_MATH_FN_LIMIT >= 1024
868b2b66 (kx 2024-12-20 16:11:07 +0300 182) case NBR_1024 :
868b2b66 (kx 2024-12-20 16:11:07 +0300 183) rc = N_ATAN2_A1024;
868b2b66 (kx 2024-12-20 16:11:07 +0300 184) break;
868b2b66 (kx 2024-12-20 16:11:07 +0300 185) #endif /* MPU_MATH_FN_LIMIT >= 1024 */
868b2b66 (kx 2024-12-20 16:11:07 +0300 186) #if MPU_MATH_FN_LIMIT >= 2048
868b2b66 (kx 2024-12-20 16:11:07 +0300 187) case NBR_2048 :
868b2b66 (kx 2024-12-20 16:11:07 +0300 188) rc = N_ATAN2_A2048;
868b2b66 (kx 2024-12-20 16:11:07 +0300 189) break;
868b2b66 (kx 2024-12-20 16:11:07 +0300 190) #endif /* MPU_MATH_FN_LIMIT >= 2048 */
868b2b66 (kx 2024-12-20 16:11:07 +0300 191) #if MPU_MATH_FN_LIMIT >= 4096
868b2b66 (kx 2024-12-20 16:11:07 +0300 192) case NBR_4096 :
868b2b66 (kx 2024-12-20 16:11:07 +0300 193) rc = N_ATAN2_A4096;
868b2b66 (kx 2024-12-20 16:11:07 +0300 194) break;
868b2b66 (kx 2024-12-20 16:11:07 +0300 195) #endif /* MPU_MATH_FN_LIMIT >= 4096 */
868b2b66 (kx 2024-12-20 16:11:07 +0300 196) #if MPU_MATH_FN_LIMIT >= 8192
868b2b66 (kx 2024-12-20 16:11:07 +0300 197) case NBR_8192 :
868b2b66 (kx 2024-12-20 16:11:07 +0300 198) rc = N_ATAN2_A8192;
868b2b66 (kx 2024-12-20 16:11:07 +0300 199) break;
868b2b66 (kx 2024-12-20 16:11:07 +0300 200) #endif /* MPU_MATH_FN_LIMIT >= 8192 */
868b2b66 (kx 2024-12-20 16:11:07 +0300 201) #if MPU_MATH_FN_LIMIT >= 16384
868b2b66 (kx 2024-12-20 16:11:07 +0300 202) case NBR_16384:
868b2b66 (kx 2024-12-20 16:11:07 +0300 203) rc = N_ATAN2_A16384;
868b2b66 (kx 2024-12-20 16:11:07 +0300 204) break;
868b2b66 (kx 2024-12-20 16:11:07 +0300 205) #endif /* MPU_MATH_FN_LIMIT >= 16384 */
868b2b66 (kx 2024-12-20 16:11:07 +0300 206)
868b2b66 (kx 2024-12-20 16:11:07 +0300 207) default:
868b2b66 (kx 2024-12-20 16:11:07 +0300 208) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 209) /* error: Invalid size of operand(s) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 210) __real_error_no = __R_ESIZE__;
868b2b66 (kx 2024-12-20 16:11:07 +0300 211) __STIND; /* Set REAL ind-produsing operation Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 212) break;
868b2b66 (kx 2024-12-20 16:11:07 +0300 213) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 214)
868b2b66 (kx 2024-12-20 16:11:07 +0300 215) } /* End of switch( nb ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 216)
868b2b66 (kx 2024-12-20 16:11:07 +0300 217) return( rc );
868b2b66 (kx 2024-12-20 16:11:07 +0300 218)
868b2b66 (kx 2024-12-20 16:11:07 +0300 219) } /* End of _get_n_atan2() */
868b2b66 (kx 2024-12-20 16:11:07 +0300 220)
868b2b66 (kx 2024-12-20 16:11:07 +0300 221)
868b2b66 (kx 2024-12-20 16:11:07 +0300 222) static EMUSHORT *_get_atan2__A_ptr( int nb )
868b2b66 (kx 2024-12-20 16:11:07 +0300 223) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 224) EMUSHORT *rc = (EMUSHORT *)NULL;
868b2b66 (kx 2024-12-20 16:11:07 +0300 225)
868b2b66 (kx 2024-12-20 16:11:07 +0300 226) if( nb < NBR_32 || nb > MPU_MATH_FN_LIMIT )
868b2b66 (kx 2024-12-20 16:11:07 +0300 227) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 228) /* error: Invalid size of operand(s) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 229) __real_error_no = __R_ESIZE__;
868b2b66 (kx 2024-12-20 16:11:07 +0300 230) __STIND; /* Set REAL ind-produsing operation Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 231) return( rc );
868b2b66 (kx 2024-12-20 16:11:07 +0300 232) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 233)
868b2b66 (kx 2024-12-20 16:11:07 +0300 234) switch( nb )
868b2b66 (kx 2024-12-20 16:11:07 +0300 235) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 236) #if MPU_MATH_FN_LIMIT >= 128
868b2b66 (kx 2024-12-20 16:11:07 +0300 237) case NBR_32 :
868b2b66 (kx 2024-12-20 16:11:07 +0300 238) case NBR_64 :
868b2b66 (kx 2024-12-20 16:11:07 +0300 239) case NBR_128 :
868b2b66 (kx 2024-12-20 16:11:07 +0300 240) rc = (EMUSHORT *)&_ei_atan2__A_128_[0][0];
868b2b66 (kx 2024-12-20 16:11:07 +0300 241) break;
868b2b66 (kx 2024-12-20 16:11:07 +0300 242) #endif /* MPU_MATH_FN_LIMIT >= 128 */
868b2b66 (kx 2024-12-20 16:11:07 +0300 243) #if MPU_MATH_FN_LIMIT >= 256
868b2b66 (kx 2024-12-20 16:11:07 +0300 244) case NBR_256 :
868b2b66 (kx 2024-12-20 16:11:07 +0300 245) rc = (EMUSHORT *)&_ei_atan2__A_256_[0][0];
868b2b66 (kx 2024-12-20 16:11:07 +0300 246) break;
868b2b66 (kx 2024-12-20 16:11:07 +0300 247) #endif /* MPU_MATH_FN_LIMIT >= 256 */
868b2b66 (kx 2024-12-20 16:11:07 +0300 248) #if MPU_MATH_FN_LIMIT >= 512
868b2b66 (kx 2024-12-20 16:11:07 +0300 249) case NBR_512 :
868b2b66 (kx 2024-12-20 16:11:07 +0300 250) rc = (EMUSHORT *)&_ei_atan2__A_512_[0][0];
868b2b66 (kx 2024-12-20 16:11:07 +0300 251) break;
868b2b66 (kx 2024-12-20 16:11:07 +0300 252) #endif /* MPU_MATH_FN_LIMIT >= 512 */
868b2b66 (kx 2024-12-20 16:11:07 +0300 253) #if MPU_MATH_FN_LIMIT >= 1024
868b2b66 (kx 2024-12-20 16:11:07 +0300 254) case NBR_1024 :
868b2b66 (kx 2024-12-20 16:11:07 +0300 255) rc = (EMUSHORT *)&_ei_atan2__A_1024_[0][0];
868b2b66 (kx 2024-12-20 16:11:07 +0300 256) break;
868b2b66 (kx 2024-12-20 16:11:07 +0300 257) #endif /* MPU_MATH_FN_LIMIT >= 1024 */
868b2b66 (kx 2024-12-20 16:11:07 +0300 258) #if MPU_MATH_FN_LIMIT >= 2048
868b2b66 (kx 2024-12-20 16:11:07 +0300 259) case NBR_2048 :
868b2b66 (kx 2024-12-20 16:11:07 +0300 260) rc = (EMUSHORT *)&_ei_atan2__A_2048_[0][0];
868b2b66 (kx 2024-12-20 16:11:07 +0300 261) break;
868b2b66 (kx 2024-12-20 16:11:07 +0300 262) #endif /* MPU_MATH_FN_LIMIT >= 2048 */
868b2b66 (kx 2024-12-20 16:11:07 +0300 263) #if MPU_MATH_FN_LIMIT >= 4096
868b2b66 (kx 2024-12-20 16:11:07 +0300 264) case NBR_4096 :
868b2b66 (kx 2024-12-20 16:11:07 +0300 265) rc = (EMUSHORT *)&_ei_atan2__A_4096_[0][0];
868b2b66 (kx 2024-12-20 16:11:07 +0300 266) break;
868b2b66 (kx 2024-12-20 16:11:07 +0300 267) #endif /* MPU_MATH_FN_LIMIT >= 4096 */
868b2b66 (kx 2024-12-20 16:11:07 +0300 268) #if MPU_MATH_FN_LIMIT >= 8192
868b2b66 (kx 2024-12-20 16:11:07 +0300 269) case NBR_8192 :
868b2b66 (kx 2024-12-20 16:11:07 +0300 270) rc = (EMUSHORT *)&_ei_atan2__A_8192_[0][0];
868b2b66 (kx 2024-12-20 16:11:07 +0300 271) break;
868b2b66 (kx 2024-12-20 16:11:07 +0300 272) #endif /* MPU_MATH_FN_LIMIT >= 8192 */
868b2b66 (kx 2024-12-20 16:11:07 +0300 273) #if MPU_MATH_FN_LIMIT >= 16384
868b2b66 (kx 2024-12-20 16:11:07 +0300 274) case NBR_16384:
868b2b66 (kx 2024-12-20 16:11:07 +0300 275) rc = (EMUSHORT *)&_ei_atan2__A_16384_[0][0];
868b2b66 (kx 2024-12-20 16:11:07 +0300 276) break;
868b2b66 (kx 2024-12-20 16:11:07 +0300 277) #endif /* MPU_MATH_FN_LIMIT >= 16384 */
868b2b66 (kx 2024-12-20 16:11:07 +0300 278)
868b2b66 (kx 2024-12-20 16:11:07 +0300 279) default:
868b2b66 (kx 2024-12-20 16:11:07 +0300 280) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 281) /* error: Invalid size of operand(s) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 282) __real_error_no = __R_ESIZE__;
868b2b66 (kx 2024-12-20 16:11:07 +0300 283) __STIND; /* Set REAL ind-produsing operation Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 284) break;
868b2b66 (kx 2024-12-20 16:11:07 +0300 285) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 286)
868b2b66 (kx 2024-12-20 16:11:07 +0300 287) } /* End of switch( nb ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 288)
868b2b66 (kx 2024-12-20 16:11:07 +0300 289) return( rc );
868b2b66 (kx 2024-12-20 16:11:07 +0300 290)
868b2b66 (kx 2024-12-20 16:11:07 +0300 291) } /* End of _get_atan2__A_ptr() */
868b2b66 (kx 2024-12-20 16:11:07 +0300 292)
868b2b66 (kx 2024-12-20 16:11:07 +0300 293)
868b2b66 (kx 2024-12-20 16:11:07 +0300 294) void ei_atan2__A( EMUSHORT *eiy, EMUSHORT *eix, int nb )
868b2b66 (kx 2024-12-20 16:11:07 +0300 295) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 296)
868b2b66 (kx 2024-12-20 16:11:07 +0300 297) Description : ei_atan2__A() Работает с
868b2b66 (kx 2024-12-20 16:11:07 +0300 298) internal e-type data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300 299)
868b2b66 (kx 2024-12-20 16:11:07 +0300 300) Concepts : SEE: ei_atan2() [polinom A].
868b2b66 (kx 2024-12-20 16:11:07 +0300 301)
868b2b66 (kx 2024-12-20 16:11:07 +0300 302) ACCURACY : In the absence of rounding error,
868b2b66 (kx 2024-12-20 16:11:07 +0300 303) the appriximation has absolute error
868b2b66 (kx 2024-12-20 16:11:07 +0300 304) less than EPSILON [see: FLOATP.H].
868b2b66 (kx 2024-12-20 16:11:07 +0300 305)
868b2b66 (kx 2024-12-20 16:11:07 +0300 306) NOTE : The coefficient C's are obtained by
868b2b66 (kx 2024-12-20 16:11:07 +0300 307) a special Remez algorithm.
868b2b66 (kx 2024-12-20 16:11:07 +0300 308)
868b2b66 (kx 2024-12-20 16:11:07 +0300 309) ===============================================
868b2b66 (kx 2024-12-20 16:11:07 +0300 310) В INTERNET я нашел следующие алгоритмы:
868b2b66 (kx 2024-12-20 16:11:07 +0300 311)
868b2b66 (kx 2024-12-20 16:11:07 +0300 312) 409 cacm 355 356 14 5 May 1971 e2 A60
868b2b66 (kx 2024-12-20 16:11:07 +0300 313) ------------------------------------------
868b2b66 (kx 2024-12-20 16:11:07 +0300 314) H. Schmitt;
868b2b66 (kx 2024-12-20 16:11:07 +0300 315) Discrete {Chebychev} Curve Fit
868b2b66 (kx 2024-12-20 16:11:07 +0300 316) approximation;Chebyshev approximation;
868b2b66 (kx 2024-12-20 16:11:07 +0300 317) Chebyshev curve fitting;
868b2b66 (kx 2024-12-20 16:11:07 +0300 318) +Chebyshev polynomial;
868b2b66 (kx 2024-12-20 16:11:07 +0300 319) curve approximation;curve fitting;
868b2b66 (kx 2024-12-20 16:11:07 +0300 320) exchange algorithm;
868b2b66 (kx 2024-12-20 16:11:07 +0300 321) +polynomial approximation;Remez algorithm;
868b2b66 (kx 2024-12-20 16:11:07 +0300 322)
868b2b66 (kx 2024-12-20 16:11:07 +0300 323) 501 toms 95 97 2 1 March 1976 e2 F K2
868b2b66 (kx 2024-12-20 16:11:07 +0300 324) ---------------------------------------------
868b2b66 (kx 2024-12-20 16:11:07 +0300 325) J. C. Simpson;
868b2b66 (kx 2024-12-20 16:11:07 +0300 326) {FORTRAN} Translation of Algorithm 409
868b2b66 (kx 2024-12-20 16:11:07 +0300 327) Discrete {Chebyshev} Curve Fit
868b2b66 (kx 2024-12-20 16:11:07 +0300 328) approximation;polynomial approximation;
868b2b66 (kx 2024-12-20 16:11:07 +0300 329) exchange algorithm;
868b2b66 (kx 2024-12-20 16:11:07 +0300 330) +Chebyshev approximation;
868b2b66 (kx 2024-12-20 16:11:07 +0300 331) polynomial approximation;
868b2b66 (kx 2024-12-20 16:11:07 +0300 332) R,toms,95,4,1,March,1978,F. Futrell;
868b2b66 (kx 2024-12-20 16:11:07 +0300 333)
868b2b66 (kx 2024-12-20 16:11:07 +0300 334) последний из которых я перевел на "С", затем
868b2b66 (kx 2024-12-20 16:11:07 +0300 335) на язык операций повышенной разрядности.
868b2b66 (kx 2024-12-20 16:11:07 +0300 336)
868b2b66 (kx 2024-12-20 16:11:07 +0300 337) ===============================================
868b2b66 (kx 2024-12-20 16:11:07 +0300 338)
868b2b66 (kx 2024-12-20 16:11:07 +0300 339) Use Global Variable:
868b2b66 (kx 2024-12-20 16:11:07 +0300 340)
868b2b66 (kx 2024-12-20 16:11:07 +0300 341) Use Functions : internal_np( nb ); | real.c
868b2b66 (kx 2024-12-20 16:11:07 +0300 342) ei_copy( eiy, eix, nb ); | real.c
868b2b66 (kx 2024-12-20 16:11:07 +0300 343) _gen_zero( eic, nb ); | real.c
868b2b66 (kx 2024-12-20 16:11:07 +0300 344) ei_add( eic,eia,eib,nb ); | real.c
868b2b66 (kx 2024-12-20 16:11:07 +0300 345) ei_mul( eic,eia,eib,nb ); | real.c
868b2b66 (kx 2024-12-20 16:11:07 +0300 346)
868b2b66 (kx 2024-12-20 16:11:07 +0300 347) Parameters : EMUSHORT *eiy; - указатель на
868b2b66 (kx 2024-12-20 16:11:07 +0300 348) internal e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300 349) data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300 350) TARGET;
868b2b66 (kx 2024-12-20 16:11:07 +0300 351) EMUSHORT *eix; - указатель на
868b2b66 (kx 2024-12-20 16:11:07 +0300 352) internal e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300 353) data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300 354) SOURCE;
868b2b66 (kx 2024-12-20 16:11:07 +0300 355) int nb; - количество бит в
868b2b66 (kx 2024-12-20 16:11:07 +0300 356) external e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300 357) data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300 358)
868b2b66 (kx 2024-12-20 16:11:07 +0300 359) Return : [void]
868b2b66 (kx 2024-12-20 16:11:07 +0300 360)
868b2b66 (kx 2024-12-20 16:11:07 +0300 361) ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 362) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 363) EMUSHORT *x = NULL, *y = NULL;
868b2b66 (kx 2024-12-20 16:11:07 +0300 364) EMUSHORT *p;
868b2b66 (kx 2024-12-20 16:11:07 +0300 365) int np;
868b2b66 (kx 2024-12-20 16:11:07 +0300 366) int i, n = _get_n_atan2( nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 367)
868b2b66 (kx 2024-12-20 16:11:07 +0300 368) np = internal_np( nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 369)
868b2b66 (kx 2024-12-20 16:11:07 +0300 370) /*** Allocate memory for x, y . *****************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 371) x = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 372) if( !x )
868b2b66 (kx 2024-12-20 16:11:07 +0300 373) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 374) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 375) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 376) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 377)
868b2b66 (kx 2024-12-20 16:11:07 +0300 378) y = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 379) if( !y )
868b2b66 (kx 2024-12-20 16:11:07 +0300 380) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 381) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 382)
868b2b66 (kx 2024-12-20 16:11:07 +0300 383) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 384) __mpu_sbrk( -(int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 385) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 386)
868b2b66 (kx 2024-12-20 16:11:07 +0300 387) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 388) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 389) /************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 390)
868b2b66 (kx 2024-12-20 16:11:07 +0300 391) _gen_zero( y, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 392) ei_copy( x, eix, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 393) p = _get_atan2__A_ptr( nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 394) for( i = 0; i < n; i++ )
868b2b66 (kx 2024-12-20 16:11:07 +0300 395) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 396) ei_add( y, y, p, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 397) ei_mul( y, y, x, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 398) p += np;
868b2b66 (kx 2024-12-20 16:11:07 +0300 399) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 400)
868b2b66 (kx 2024-12-20 16:11:07 +0300 401) ei_copy( eiy, y, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 402)
868b2b66 (kx 2024-12-20 16:11:07 +0300 403) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 404) /* FREE y *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 405) __mpu_sbrk( -(int)(2*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 406) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 407)
868b2b66 (kx 2024-12-20 16:11:07 +0300 408) } /* End of ei_atan2__A() */
868b2b66 (kx 2024-12-20 16:11:07 +0300 409)
868b2b66 (kx 2024-12-20 16:11:07 +0300 410)
868b2b66 (kx 2024-12-20 16:11:07 +0300 411) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 412) Hide internal symbols:
868b2b66 (kx 2024-12-20 16:11:07 +0300 413) ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 414)
868b2b66 (kx 2024-12-20 16:11:07 +0300 415) __mpu_hidden_decl(ei_atan2__A);
868b2b66 (kx 2024-12-20 16:11:07 +0300 416)
868b2b66 (kx 2024-12-20 16:11:07 +0300 417)
868b2b66 (kx 2024-12-20 16:11:07 +0300 418) /*
868b2b66 (kx 2024-12-20 16:11:07 +0300 419) End of hide internal symbols.
868b2b66 (kx 2024-12-20 16:11:07 +0300 420) ***************************************************************/