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_MATH.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 MATH 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) #include <mpu-m-const.h>
868b2b66 (kx 2024-12-20 16:11:07 +0300 36) #include <mpu-math.h>
868b2b66 (kx 2024-12-20 16:11:07 +0300 37)
868b2b66 (kx 2024-12-20 16:11:07 +0300 38) #include <mpu-char.h>
868b2b66 (kx 2024-12-20 16:11:07 +0300 39) #include <mpu-symbols.h>
868b2b66 (kx 2024-12-20 16:11:07 +0300 40)
868b2b66 (kx 2024-12-20 16:11:07 +0300 41) #include <mpu-math-errno.h>
868b2b66 (kx 2024-12-20 16:11:07 +0300 42) #include <mpu-mtherr.h>
868b2b66 (kx 2024-12-20 16:11:07 +0300 43)
868b2b66 (kx 2024-12-20 16:11:07 +0300 44) #include <st-cos.h>
868b2b66 (kx 2024-12-20 16:11:07 +0300 45) #include <st-sin.h>
868b2b66 (kx 2024-12-20 16:11:07 +0300 46) #include <st-cosh.h>
868b2b66 (kx 2024-12-20 16:11:07 +0300 47) #include <st-sinh.h>
868b2b66 (kx 2024-12-20 16:11:07 +0300 48) #include <st-atan2.h>
868b2b66 (kx 2024-12-20 16:11:07 +0300 49) #include <st-exp.h>
868b2b66 (kx 2024-12-20 16:11:07 +0300 50) #include <st-log.h>
868b2b66 (kx 2024-12-20 16:11:07 +0300 51) #include <st-ln.h>
868b2b66 (kx 2024-12-20 16:11:07 +0300 52) #include <st-service.h>
868b2b66 (kx 2024-12-20 16:11:07 +0300 53) #include <st-logtable.h>
868b2b66 (kx 2024-12-20 16:11:07 +0300 54)
868b2b66 (kx 2024-12-20 16:11:07 +0300 55)
868b2b66 (kx 2024-12-20 16:11:07 +0300 56) static void ei_copysign( EMUSHORT *eiy, EMUSHORT *eix, EMUSHORT *eis, int nb )
868b2b66 (kx 2024-12-20 16:11:07 +0300 57) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 58)
868b2b66 (kx 2024-12-20 16:11:07 +0300 59) Description : ei_copysign() Работает с internal
868b2b66 (kx 2024-12-20 16:11:07 +0300 60) e-type data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300 61)
868b2b66 (kx 2024-12-20 16:11:07 +0300 62) Concepts : Copy VALUE from EIX into EIY and
868b2b66 (kx 2024-12-20 16:11:07 +0300 63) SIGN from EIS into EIY.
868b2b66 (kx 2024-12-20 16:11:07 +0300 64)
868b2b66 (kx 2024-12-20 16:11:07 +0300 65) NOTE :
868b2b66 (kx 2024-12-20 16:11:07 +0300 66)
868b2b66 (kx 2024-12-20 16:11:07 +0300 67) Use Global Variable:
868b2b66 (kx 2024-12-20 16:11:07 +0300 68)
868b2b66 (kx 2024-12-20 16:11:07 +0300 69) Use Functions : internal_np( nb ); | mpu-real.c
868b2b66 (kx 2024-12-20 16:11:07 +0300 70) ei_copy( eiy, eix, nb ); | mpu-real.c
868b2b66 (kx 2024-12-20 16:11:07 +0300 71)
868b2b66 (kx 2024-12-20 16:11:07 +0300 72) Parameters : EMUSHORT *eiy; - указатель на
868b2b66 (kx 2024-12-20 16:11:07 +0300 73) internal e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300 74) data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300 75) TARGET;
868b2b66 (kx 2024-12-20 16:11:07 +0300 76) EMUSHORT *eix; - указатель на
868b2b66 (kx 2024-12-20 16:11:07 +0300 77) internal e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300 78) data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300 79) SOURCE VALUE;
868b2b66 (kx 2024-12-20 16:11:07 +0300 80) EMUSHORT *eis; - указатель на
868b2b66 (kx 2024-12-20 16:11:07 +0300 81) internal e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300 82) data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300 83) SOURCE SIGN;
868b2b66 (kx 2024-12-20 16:11:07 +0300 84) int nb; - количество бит в
868b2b66 (kx 2024-12-20 16:11:07 +0300 85) external e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300 86) data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300 87)
868b2b66 (kx 2024-12-20 16:11:07 +0300 88) Return : [void]
868b2b66 (kx 2024-12-20 16:11:07 +0300 89)
868b2b66 (kx 2024-12-20 16:11:07 +0300 90) ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 91) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 92) EMUSHORT sign;
868b2b66 (kx 2024-12-20 16:11:07 +0300 93) int ps = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 94)
868b2b66 (kx 2024-12-20 16:11:07 +0300 95) #if MPU_WORD_ORDER_BIG_ENDIAN == 0
868b2b66 (kx 2024-12-20 16:11:07 +0300 96) ps = internal_np( nb ) - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 97) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 98)
868b2b66 (kx 2024-12-20 16:11:07 +0300 99) sign = eis[ps];
868b2b66 (kx 2024-12-20 16:11:07 +0300 100) ei_copy( eiy, eix, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 101) eiy[ps] = sign;
868b2b66 (kx 2024-12-20 16:11:07 +0300 102)
868b2b66 (kx 2024-12-20 16:11:07 +0300 103) } /* End of ei_copysign() */
868b2b66 (kx 2024-12-20 16:11:07 +0300 104)
868b2b66 (kx 2024-12-20 16:11:07 +0300 105)
868b2b66 (kx 2024-12-20 16:11:07 +0300 106) static void ei_drem( EMUSHORT *eiy, EMUSHORT *eix, EMUSHORT *eid, int nb )
868b2b66 (kx 2024-12-20 16:11:07 +0300 107) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 108)
868b2b66 (kx 2024-12-20 16:11:07 +0300 109) Description : ei_drem() Работает с
868b2b66 (kx 2024-12-20 16:11:07 +0300 110) internal e-type data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300 111)
868b2b66 (kx 2024-12-20 16:11:07 +0300 112) Concepts : Reduce EIX into [-EID/2, EID/2] and
868b2b66 (kx 2024-12-20 16:11:07 +0300 113) return result in EIY.
868b2b66 (kx 2024-12-20 16:11:07 +0300 114)
868b2b66 (kx 2024-12-20 16:11:07 +0300 115) NOTE :
868b2b66 (kx 2024-12-20 16:11:07 +0300 116)
868b2b66 (kx 2024-12-20 16:11:07 +0300 117) Use Global Variable:
868b2b66 (kx 2024-12-20 16:11:07 +0300 118)
868b2b66 (kx 2024-12-20 16:11:07 +0300 119) Use Functions : internal_np( nb ); | mpu-real.c
868b2b66 (kx 2024-12-20 16:11:07 +0300 120) _gen_two( eic, nb ); | mpu-real.c
868b2b66 (kx 2024-12-20 16:11:07 +0300 121) ei_copy( eiy, eix, nb ); | mpu-real.c
868b2b66 (kx 2024-12-20 16:11:07 +0300 122) ei_remain( r,q,y,x,nb ); | mpu-real.c
868b2b66 (kx 2024-12-20 16:11:07 +0300 123)
868b2b66 (kx 2024-12-20 16:11:07 +0300 124) Parameters : EMUSHORT *eiy; - указатель на
868b2b66 (kx 2024-12-20 16:11:07 +0300 125) internal e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300 126) data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300 127) TARGET;
868b2b66 (kx 2024-12-20 16:11:07 +0300 128) EMUSHORT *eix; - указатель на
868b2b66 (kx 2024-12-20 16:11:07 +0300 129) internal e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300 130) data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300 131) SOURCE VALUE;
868b2b66 (kx 2024-12-20 16:11:07 +0300 132) EMUSHORT *eid; - указатель на
868b2b66 (kx 2024-12-20 16:11:07 +0300 133) internal e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300 134) data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300 135) SOURCE +
868b2b66 (kx 2024-12-20 16:11:07 +0300 136) 2*DIAPASON;
868b2b66 (kx 2024-12-20 16:11:07 +0300 137) int nb; - количество бит в
868b2b66 (kx 2024-12-20 16:11:07 +0300 138) external e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300 139) data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300 140)
868b2b66 (kx 2024-12-20 16:11:07 +0300 141) Return : [void]
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) EMUSHORT *x = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 146) *b = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 147) *d = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 148) *two = NULL;
868b2b66 (kx 2024-12-20 16:11:07 +0300 149) EMUSHORT sign;
868b2b66 (kx 2024-12-20 16:11:07 +0300 150) int ps = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 151) int np;
868b2b66 (kx 2024-12-20 16:11:07 +0300 152)
868b2b66 (kx 2024-12-20 16:11:07 +0300 153) np = internal_np( nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 154)
868b2b66 (kx 2024-12-20 16:11:07 +0300 155) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 156) ps = np - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 157) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 158)
868b2b66 (kx 2024-12-20 16:11:07 +0300 159) /*** Allocate memory for x, b, d, two . *********************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 160) x = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 161) if( !x )
868b2b66 (kx 2024-12-20 16:11:07 +0300 162) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 163) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 164) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 165) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 166)
868b2b66 (kx 2024-12-20 16:11:07 +0300 167) b = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 168) if( !b )
868b2b66 (kx 2024-12-20 16:11:07 +0300 169) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 170) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 171)
868b2b66 (kx 2024-12-20 16:11:07 +0300 172) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 173) __mpu_sbrk( -(int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 174) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 175)
868b2b66 (kx 2024-12-20 16:11:07 +0300 176) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 177) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 178)
868b2b66 (kx 2024-12-20 16:11:07 +0300 179) d = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 180) if( !d )
868b2b66 (kx 2024-12-20 16:11:07 +0300 181) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 182) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 183)
868b2b66 (kx 2024-12-20 16:11:07 +0300 184) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 185) /* FREE b *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 186) __mpu_sbrk( -(int)(2*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 187) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 188)
868b2b66 (kx 2024-12-20 16:11:07 +0300 189) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 190) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 191)
868b2b66 (kx 2024-12-20 16:11:07 +0300 192) two = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 193) if( !two )
868b2b66 (kx 2024-12-20 16:11:07 +0300 194) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 195) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 196)
868b2b66 (kx 2024-12-20 16:11:07 +0300 197) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 198) /* FREE b *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 199) /* FREE d *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 200) __mpu_sbrk( -(int)(3*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 201) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 202)
868b2b66 (kx 2024-12-20 16:11:07 +0300 203) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 204) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 205) /************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 206)
868b2b66 (kx 2024-12-20 16:11:07 +0300 207)
868b2b66 (kx 2024-12-20 16:11:07 +0300 208) _gen_two( two, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 209)
868b2b66 (kx 2024-12-20 16:11:07 +0300 210) sign = eix[ps];
868b2b66 (kx 2024-12-20 16:11:07 +0300 211)
868b2b66 (kx 2024-12-20 16:11:07 +0300 212) ei_copy( x, eix, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 213) x[ps] = (EMUSHORT)0; /* ei_abs( x, nb ); */
868b2b66 (kx 2024-12-20 16:11:07 +0300 214)
868b2b66 (kx 2024-12-20 16:11:07 +0300 215) ei_copy( d, eid, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 216) d[ps] = (EMUSHORT)0; /* ei_abs( d, nb ); */
868b2b66 (kx 2024-12-20 16:11:07 +0300 217)
868b2b66 (kx 2024-12-20 16:11:07 +0300 218) ei_div( b, d, two, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 219)
868b2b66 (kx 2024-12-20 16:11:07 +0300 220) if( ei_cmp( x, d, nb ) > 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 221) ei_remain( x, (EMUSHORT *)0, x, d, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 222) if( ei_cmp( x, b, nb ) >= 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 223) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 224) ei_sub( x, x, d, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 225) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 226)
868b2b66 (kx 2024-12-20 16:11:07 +0300 227) x[ps] ^= sign;
868b2b66 (kx 2024-12-20 16:11:07 +0300 228)
868b2b66 (kx 2024-12-20 16:11:07 +0300 229) ei_copy( eiy, x, nb ); /* return value */
868b2b66 (kx 2024-12-20 16:11:07 +0300 230)
868b2b66 (kx 2024-12-20 16:11:07 +0300 231)
868b2b66 (kx 2024-12-20 16:11:07 +0300 232) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 233) /* FREE b *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 234) /* FREE d *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 235) /* FREE two ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 236) __mpu_sbrk( -(int)(4*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 237) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 238)
868b2b66 (kx 2024-12-20 16:11:07 +0300 239) } /* End of ei_drem() */
868b2b66 (kx 2024-12-20 16:11:07 +0300 240)
868b2b66 (kx 2024-12-20 16:11:07 +0300 241)
868b2b66 (kx 2024-12-20 16:11:07 +0300 242) #if BITS_PER_EMUSHORT == 16
868b2b66 (kx 2024-12-20 16:11:07 +0300 243) static EMUSHORT bzmask[] =
868b2b66 (kx 2024-12-20 16:11:07 +0300 244) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 245) 0xffff,
868b2b66 (kx 2024-12-20 16:11:07 +0300 246) 0xfffe,
868b2b66 (kx 2024-12-20 16:11:07 +0300 247) 0xfffc,
868b2b66 (kx 2024-12-20 16:11:07 +0300 248) 0xfff8,
868b2b66 (kx 2024-12-20 16:11:07 +0300 249) 0xfff0,
868b2b66 (kx 2024-12-20 16:11:07 +0300 250) 0xffe0,
868b2b66 (kx 2024-12-20 16:11:07 +0300 251) 0xffc0,
868b2b66 (kx 2024-12-20 16:11:07 +0300 252) 0xff80,
868b2b66 (kx 2024-12-20 16:11:07 +0300 253) 0xff00,
868b2b66 (kx 2024-12-20 16:11:07 +0300 254) 0xfe00,
868b2b66 (kx 2024-12-20 16:11:07 +0300 255) 0xfc00,
868b2b66 (kx 2024-12-20 16:11:07 +0300 256) 0xf800,
868b2b66 (kx 2024-12-20 16:11:07 +0300 257) 0xf000,
868b2b66 (kx 2024-12-20 16:11:07 +0300 258) 0xe000,
868b2b66 (kx 2024-12-20 16:11:07 +0300 259) 0xc000,
868b2b66 (kx 2024-12-20 16:11:07 +0300 260) 0x8000,
868b2b66 (kx 2024-12-20 16:11:07 +0300 261) 0x0000,
868b2b66 (kx 2024-12-20 16:11:07 +0300 262) };
868b2b66 (kx 2024-12-20 16:11:07 +0300 263) #else /* not (BITS_PER_EMUSHORT == 16) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 264) #if BITS_PER_EMUSHORT == 32
868b2b66 (kx 2024-12-20 16:11:07 +0300 265) static EMUSHORT bzmask[] =
868b2b66 (kx 2024-12-20 16:11:07 +0300 266) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 267) 0xffffffff,
868b2b66 (kx 2024-12-20 16:11:07 +0300 268) 0xfffffffe,
868b2b66 (kx 2024-12-20 16:11:07 +0300 269) 0xfffffffc,
868b2b66 (kx 2024-12-20 16:11:07 +0300 270) 0xfffffff8,
868b2b66 (kx 2024-12-20 16:11:07 +0300 271) 0xfffffff0,
868b2b66 (kx 2024-12-20 16:11:07 +0300 272) 0xffffffe0,
868b2b66 (kx 2024-12-20 16:11:07 +0300 273) 0xffffffc0,
868b2b66 (kx 2024-12-20 16:11:07 +0300 274) 0xffffff80,
868b2b66 (kx 2024-12-20 16:11:07 +0300 275) 0xffffff00,
868b2b66 (kx 2024-12-20 16:11:07 +0300 276) 0xfffffe00,
868b2b66 (kx 2024-12-20 16:11:07 +0300 277) 0xfffffc00,
868b2b66 (kx 2024-12-20 16:11:07 +0300 278) 0xfffff800,
868b2b66 (kx 2024-12-20 16:11:07 +0300 279) 0xfffff000,
868b2b66 (kx 2024-12-20 16:11:07 +0300 280) 0xffffe000,
868b2b66 (kx 2024-12-20 16:11:07 +0300 281) 0xffffc000,
868b2b66 (kx 2024-12-20 16:11:07 +0300 282) 0xffff8000,
868b2b66 (kx 2024-12-20 16:11:07 +0300 283) 0xffff0000,
868b2b66 (kx 2024-12-20 16:11:07 +0300 284) 0xfffe0000,
868b2b66 (kx 2024-12-20 16:11:07 +0300 285) 0xfffc0000,
868b2b66 (kx 2024-12-20 16:11:07 +0300 286) 0xfff80000,
868b2b66 (kx 2024-12-20 16:11:07 +0300 287) 0xfff00000,
868b2b66 (kx 2024-12-20 16:11:07 +0300 288) 0xffe00000,
868b2b66 (kx 2024-12-20 16:11:07 +0300 289) 0xffc00000,
868b2b66 (kx 2024-12-20 16:11:07 +0300 290) 0xff800000,
868b2b66 (kx 2024-12-20 16:11:07 +0300 291) 0xff000000,
868b2b66 (kx 2024-12-20 16:11:07 +0300 292) 0xfe000000,
868b2b66 (kx 2024-12-20 16:11:07 +0300 293) 0xfc000000,
868b2b66 (kx 2024-12-20 16:11:07 +0300 294) 0xf8000000,
868b2b66 (kx 2024-12-20 16:11:07 +0300 295) 0xf0000000,
868b2b66 (kx 2024-12-20 16:11:07 +0300 296) 0xe0000000,
868b2b66 (kx 2024-12-20 16:11:07 +0300 297) 0xc0000000,
868b2b66 (kx 2024-12-20 16:11:07 +0300 298) 0x80000000,
868b2b66 (kx 2024-12-20 16:11:07 +0300 299) 0x00000000,
868b2b66 (kx 2024-12-20 16:11:07 +0300 300) };
868b2b66 (kx 2024-12-20 16:11:07 +0300 301) #else /* not (BITS_PER_EMUSHORT == 32) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 302) #if BITS_PER_EMUSHORT == 64
868b2b66 (kx 2024-12-20 16:11:07 +0300 303) static EMUSHORT bzmask[] =
868b2b66 (kx 2024-12-20 16:11:07 +0300 304) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 305) 0xffffffffffffffff,
868b2b66 (kx 2024-12-20 16:11:07 +0300 306) 0xfffffffffffffffe,
868b2b66 (kx 2024-12-20 16:11:07 +0300 307) 0xfffffffffffffffc,
868b2b66 (kx 2024-12-20 16:11:07 +0300 308) 0xfffffffffffffff8,
868b2b66 (kx 2024-12-20 16:11:07 +0300 309) 0xfffffffffffffff0,
868b2b66 (kx 2024-12-20 16:11:07 +0300 310) 0xffffffffffffffe0,
868b2b66 (kx 2024-12-20 16:11:07 +0300 311) 0xffffffffffffffc0,
868b2b66 (kx 2024-12-20 16:11:07 +0300 312) 0xffffffffffffff80,
868b2b66 (kx 2024-12-20 16:11:07 +0300 313) 0xffffffffffffff00,
868b2b66 (kx 2024-12-20 16:11:07 +0300 314) 0xfffffffffffffe00,
868b2b66 (kx 2024-12-20 16:11:07 +0300 315) 0xfffffffffffffc00,
868b2b66 (kx 2024-12-20 16:11:07 +0300 316) 0xfffffffffffff800,
868b2b66 (kx 2024-12-20 16:11:07 +0300 317) 0xfffffffffffff000,
868b2b66 (kx 2024-12-20 16:11:07 +0300 318) 0xffffffffffffe000,
868b2b66 (kx 2024-12-20 16:11:07 +0300 319) 0xffffffffffffc000,
868b2b66 (kx 2024-12-20 16:11:07 +0300 320) 0xffffffffffff8000,
868b2b66 (kx 2024-12-20 16:11:07 +0300 321) 0xffffffffffff0000,
868b2b66 (kx 2024-12-20 16:11:07 +0300 322) 0xfffffffffffe0000,
868b2b66 (kx 2024-12-20 16:11:07 +0300 323) 0xfffffffffffc0000,
868b2b66 (kx 2024-12-20 16:11:07 +0300 324) 0xfffffffffff80000,
868b2b66 (kx 2024-12-20 16:11:07 +0300 325) 0xfffffffffff00000,
868b2b66 (kx 2024-12-20 16:11:07 +0300 326) 0xffffffffffe00000,
868b2b66 (kx 2024-12-20 16:11:07 +0300 327) 0xffffffffffc00000,
868b2b66 (kx 2024-12-20 16:11:07 +0300 328) 0xffffffffff800000,
868b2b66 (kx 2024-12-20 16:11:07 +0300 329) 0xffffffffff000000,
868b2b66 (kx 2024-12-20 16:11:07 +0300 330) 0xfffffffffe000000,
868b2b66 (kx 2024-12-20 16:11:07 +0300 331) 0xfffffffffc000000,
868b2b66 (kx 2024-12-20 16:11:07 +0300 332) 0xfffffffff8000000,
868b2b66 (kx 2024-12-20 16:11:07 +0300 333) 0xfffffffff0000000,
868b2b66 (kx 2024-12-20 16:11:07 +0300 334) 0xffffffffe0000000,
868b2b66 (kx 2024-12-20 16:11:07 +0300 335) 0xffffffffc0000000,
868b2b66 (kx 2024-12-20 16:11:07 +0300 336) 0xffffffff80000000,
868b2b66 (kx 2024-12-20 16:11:07 +0300 337) 0xffffffff00000000,
868b2b66 (kx 2024-12-20 16:11:07 +0300 338) 0xfffffffe00000000,
868b2b66 (kx 2024-12-20 16:11:07 +0300 339) 0xfffffffc00000000,
868b2b66 (kx 2024-12-20 16:11:07 +0300 340) 0xfffffff800000000,
868b2b66 (kx 2024-12-20 16:11:07 +0300 341) 0xfffffff000000000,
868b2b66 (kx 2024-12-20 16:11:07 +0300 342) 0xffffffe000000000,
868b2b66 (kx 2024-12-20 16:11:07 +0300 343) 0xffffffc000000000,
868b2b66 (kx 2024-12-20 16:11:07 +0300 344) 0xffffff8000000000,
868b2b66 (kx 2024-12-20 16:11:07 +0300 345) 0xffffff0000000000,
868b2b66 (kx 2024-12-20 16:11:07 +0300 346) 0xfffffe0000000000,
868b2b66 (kx 2024-12-20 16:11:07 +0300 347) 0xfffffc0000000000,
868b2b66 (kx 2024-12-20 16:11:07 +0300 348) 0xfffff80000000000,
868b2b66 (kx 2024-12-20 16:11:07 +0300 349) 0xfffff00000000000,
868b2b66 (kx 2024-12-20 16:11:07 +0300 350) 0xffffe00000000000,
868b2b66 (kx 2024-12-20 16:11:07 +0300 351) 0xffffc00000000000,
868b2b66 (kx 2024-12-20 16:11:07 +0300 352) 0xffff800000000000,
868b2b66 (kx 2024-12-20 16:11:07 +0300 353) 0xffff000000000000,
868b2b66 (kx 2024-12-20 16:11:07 +0300 354) 0xfffe000000000000,
868b2b66 (kx 2024-12-20 16:11:07 +0300 355) 0xfffc000000000000,
868b2b66 (kx 2024-12-20 16:11:07 +0300 356) 0xfff8000000000000,
868b2b66 (kx 2024-12-20 16:11:07 +0300 357) 0xfff0000000000000,
868b2b66 (kx 2024-12-20 16:11:07 +0300 358) 0xffe0000000000000,
868b2b66 (kx 2024-12-20 16:11:07 +0300 359) 0xffc0000000000000,
868b2b66 (kx 2024-12-20 16:11:07 +0300 360) 0xff80000000000000,
868b2b66 (kx 2024-12-20 16:11:07 +0300 361) 0xff00000000000000,
868b2b66 (kx 2024-12-20 16:11:07 +0300 362) 0xfe00000000000000,
868b2b66 (kx 2024-12-20 16:11:07 +0300 363) 0xfc00000000000000,
868b2b66 (kx 2024-12-20 16:11:07 +0300 364) 0xf800000000000000,
868b2b66 (kx 2024-12-20 16:11:07 +0300 365) 0xf000000000000000,
868b2b66 (kx 2024-12-20 16:11:07 +0300 366) 0xe000000000000000,
868b2b66 (kx 2024-12-20 16:11:07 +0300 367) 0xc000000000000000,
868b2b66 (kx 2024-12-20 16:11:07 +0300 368) 0x8000000000000000,
868b2b66 (kx 2024-12-20 16:11:07 +0300 369) 0x0000000000000000,
868b2b66 (kx 2024-12-20 16:11:07 +0300 370) };
868b2b66 (kx 2024-12-20 16:11:07 +0300 371) #else /* not (BITS_PER_EMUSHORT == 64) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 372) #error mpu-math.c: Cannot use that size of EMUSHORT type
868b2b66 (kx 2024-12-20 16:11:07 +0300 373) #endif /* BITS_PER_EMUSHORT == 64 */
868b2b66 (kx 2024-12-20 16:11:07 +0300 374) #endif /* BITS_PER_EMUSHORT == 32 */
868b2b66 (kx 2024-12-20 16:11:07 +0300 375) #endif /* BITS_PER_EMUSHORT == 16 */
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) void ei_trunc( EMUSHORT *eix, unsigned int bz, int nb )
868b2b66 (kx 2024-12-20 16:11:07 +0300 379) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 380)
868b2b66 (kx 2024-12-20 16:11:07 +0300 381) Description : ei_trunc() Работает с
868b2b66 (kx 2024-12-20 16:11:07 +0300 382) internal e-type data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300 383)
868b2b66 (kx 2024-12-20 16:11:07 +0300 384) Concepts : ZERO to BZ last bits of Significand of EIX.
868b2b66 (kx 2024-12-20 16:11:07 +0300 385)
868b2b66 (kx 2024-12-20 16:11:07 +0300 386) NOTE :
868b2b66 (kx 2024-12-20 16:11:07 +0300 387)
868b2b66 (kx 2024-12-20 16:11:07 +0300 388) Use Global Variable:
868b2b66 (kx 2024-12-20 16:11:07 +0300 389)
868b2b66 (kx 2024-12-20 16:11:07 +0300 390) Use Functions : internal_ne( nb ); | mpu-real.c
868b2b66 (kx 2024-12-20 16:11:07 +0300 391) internal_ns( nb ); | mpu-real.c
868b2b66 (kx 2024-12-20 16:11:07 +0300 392) ei_issignull( eix, nb ); | mpu-real.c
868b2b66 (kx 2024-12-20 16:11:07 +0300 393)
868b2b66 (kx 2024-12-20 16:11:07 +0300 394) Parameters : EMUSHORT *eix; - указатель на
868b2b66 (kx 2024-12-20 16:11:07 +0300 395) internal e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300 396) data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300 397) SOURCE, TARGET;
868b2b66 (kx 2024-12-20 16:11:07 +0300 398) unsigned int bz; - количество
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) external e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300 402) data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300 403) int nb; - количество бит в
868b2b66 (kx 2024-12-20 16:11:07 +0300 404) external e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300 405) data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300 406)
868b2b66 (kx 2024-12-20 16:11:07 +0300 407) Return : [void]
868b2b66 (kx 2024-12-20 16:11:07 +0300 408)
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) EMUSHORT *p;
868b2b66 (kx 2024-12-20 16:11:07 +0300 412) int ne, ns;
868b2b66 (kx 2024-12-20 16:11:07 +0300 413) unsigned int k = (unsigned)NSBITS(nb);
868b2b66 (kx 2024-12-20 16:11:07 +0300 414)
868b2b66 (kx 2024-12-20 16:11:07 +0300 415) if( nb < NBR_32 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 416) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 417) /* error: Invalid size of operand(s) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 418) __real_invalid_size( (__mpu_char8_t *)"trunc" );
868b2b66 (kx 2024-12-20 16:11:07 +0300 419) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 420) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 421)
868b2b66 (kx 2024-12-20 16:11:07 +0300 422) if( bz > k )
868b2b66 (kx 2024-12-20 16:11:07 +0300 423) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 424) /* error: Invalid number of TRUNC bits(BZ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 425) /* количество обнуляемых бит больше чем количество бит мантиссы */
868b2b66 (kx 2024-12-20 16:11:07 +0300 426) __real_truncate_error();
868b2b66 (kx 2024-12-20 16:11:07 +0300 427) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 428) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 429)
868b2b66 (kx 2024-12-20 16:11:07 +0300 430) /* Если на входе знаковый ноль. */
868b2b66 (kx 2024-12-20 16:11:07 +0300 431) if( ei_issignull( eix, nb ) )
868b2b66 (kx 2024-12-20 16:11:07 +0300 432) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 433) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 434) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 435)
868b2b66 (kx 2024-12-20 16:11:07 +0300 436) ne = internal_ne( nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 437) ns = internal_ns( nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 438)
868b2b66 (kx 2024-12-20 16:11:07 +0300 439) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 440) p = &eix[ne+ns+2]; /* lgw */
868b2b66 (kx 2024-12-20 16:11:07 +0300 441) *p-- = (EMUSHORT)0; /* p -> low part of Significand */
868b2b66 (kx 2024-12-20 16:11:07 +0300 442) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 443) p = &eix[0]; /* lgw */
868b2b66 (kx 2024-12-20 16:11:07 +0300 444) *p++ = (EMUSHORT)0; /* p -> low part of Significand */
868b2b66 (kx 2024-12-20 16:11:07 +0300 445) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 446)
868b2b66 (kx 2024-12-20 16:11:07 +0300 447) while( bz >= BITS_PER_EMUSHORT )
868b2b66 (kx 2024-12-20 16:11:07 +0300 448) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 449) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 450) *p-- = (EMUSHORT)0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 451) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 452) *p++ = (EMUSHORT)0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 453) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 454) bz -= BITS_PER_EMUSHORT;
868b2b66 (kx 2024-12-20 16:11:07 +0300 455) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 456)
868b2b66 (kx 2024-12-20 16:11:07 +0300 457) /* Clear the remaining bits. */
868b2b66 (kx 2024-12-20 16:11:07 +0300 458) *p &= bzmask[bz];
868b2b66 (kx 2024-12-20 16:11:07 +0300 459)
868b2b66 (kx 2024-12-20 16:11:07 +0300 460) } /* End of ei_TRUNC() */
868b2b66 (kx 2024-12-20 16:11:07 +0300 461)
868b2b66 (kx 2024-12-20 16:11:07 +0300 462)
868b2b66 (kx 2024-12-20 16:11:07 +0300 463) static void __ei_TRUNC( EMUSHORT *eix, int nb )
868b2b66 (kx 2024-12-20 16:11:07 +0300 464) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 465) unsigned int z = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 466)
868b2b66 (kx 2024-12-20 16:11:07 +0300 467) switch( nb )
868b2b66 (kx 2024-12-20 16:11:07 +0300 468) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 469) case NBR_32:
868b2b66 (kx 2024-12-20 16:11:07 +0300 470) case NBR_64:
868b2b66 (kx 2024-12-20 16:11:07 +0300 471) case NBR_128:
868b2b66 (kx 2024-12-20 16:11:07 +0300 472) z = 44;
868b2b66 (kx 2024-12-20 16:11:07 +0300 473) break;
868b2b66 (kx 2024-12-20 16:11:07 +0300 474) case NBR_256:
868b2b66 (kx 2024-12-20 16:11:07 +0300 475) z = 95;
868b2b66 (kx 2024-12-20 16:11:07 +0300 476) break;
868b2b66 (kx 2024-12-20 16:11:07 +0300 477) case NBR_512:
868b2b66 (kx 2024-12-20 16:11:07 +0300 478) z = 184;
868b2b66 (kx 2024-12-20 16:11:07 +0300 479) break;
868b2b66 (kx 2024-12-20 16:11:07 +0300 480) case NBR_1024:
868b2b66 (kx 2024-12-20 16:11:07 +0300 481) z = 388;
868b2b66 (kx 2024-12-20 16:11:07 +0300 482) break;
868b2b66 (kx 2024-12-20 16:11:07 +0300 483) case NBR_2048:
868b2b66 (kx 2024-12-20 16:11:07 +0300 484) z = 770;
868b2b66 (kx 2024-12-20 16:11:07 +0300 485) break;
868b2b66 (kx 2024-12-20 16:11:07 +0300 486) case NBR_4096:
868b2b66 (kx 2024-12-20 16:11:07 +0300 487) z = 1585;
868b2b66 (kx 2024-12-20 16:11:07 +0300 488) break;
868b2b66 (kx 2024-12-20 16:11:07 +0300 489) case NBR_8192:
868b2b66 (kx 2024-12-20 16:11:07 +0300 490) z = 3964;
868b2b66 (kx 2024-12-20 16:11:07 +0300 491) break;
868b2b66 (kx 2024-12-20 16:11:07 +0300 492) case NBR_16384:
868b2b66 (kx 2024-12-20 16:11:07 +0300 493) z = 6424;
868b2b66 (kx 2024-12-20 16:11:07 +0300 494) break;
868b2b66 (kx 2024-12-20 16:11:07 +0300 495) case NBR_32768:
868b2b66 (kx 2024-12-20 16:11:07 +0300 496) z = 12842;
868b2b66 (kx 2024-12-20 16:11:07 +0300 497) break;
868b2b66 (kx 2024-12-20 16:11:07 +0300 498) case NBR_65536:
868b2b66 (kx 2024-12-20 16:11:07 +0300 499) z = 15882;
868b2b66 (kx 2024-12-20 16:11:07 +0300 500) break;
868b2b66 (kx 2024-12-20 16:11:07 +0300 501) case NBR_131072:
868b2b66 (kx 2024-12-20 16:11:07 +0300 502) z = 51758;
868b2b66 (kx 2024-12-20 16:11:07 +0300 503) break;
868b2b66 (kx 2024-12-20 16:11:07 +0300 504)
868b2b66 (kx 2024-12-20 16:11:07 +0300 505) default:
868b2b66 (kx 2024-12-20 16:11:07 +0300 506) /* error: Invalid size of operand(s) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 507) __real_invalid_size( (__mpu_char8_t *)"TRUNC" );
868b2b66 (kx 2024-12-20 16:11:07 +0300 508) break;
868b2b66 (kx 2024-12-20 16:11:07 +0300 509)
868b2b66 (kx 2024-12-20 16:11:07 +0300 510) } /* End of switch( nb ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 511)
868b2b66 (kx 2024-12-20 16:11:07 +0300 512) ei_trunc( eix, z, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 513)
868b2b66 (kx 2024-12-20 16:11:07 +0300 514) } /* End of __ei_TRUNC() */
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) void ei_sin( EMUSHORT *eiy, EMUSHORT *eix, int nb )
868b2b66 (kx 2024-12-20 16:11:07 +0300 518) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 519)
868b2b66 (kx 2024-12-20 16:11:07 +0300 520) Description : ei_sin() Работает с
868b2b66 (kx 2024-12-20 16:11:07 +0300 521) internal e-type data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300 522)
868b2b66 (kx 2024-12-20 16:11:07 +0300 523) Concepts : Return in EIY = SIN( EIX ).
868b2b66 (kx 2024-12-20 16:11:07 +0300 524)
868b2b66 (kx 2024-12-20 16:11:07 +0300 525) NOTE : See: ei_sin__S() & ei_cos__C().
868b2b66 (kx 2024-12-20 16:11:07 +0300 526)
868b2b66 (kx 2024-12-20 16:11:07 +0300 527) Use Global Variable:
868b2b66 (kx 2024-12-20 16:11:07 +0300 528)
868b2b66 (kx 2024-12-20 16:11:07 +0300 529) Use Functions : ei_copy( eiy, eix, nb ); | mpu-real.c
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) Parameters : EMUSHORT *eiy; - указатель на
868b2b66 (kx 2024-12-20 16:11:07 +0300 535) internal e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300 536) data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300 537) TARGET;
868b2b66 (kx 2024-12-20 16:11:07 +0300 538) EMUSHORT *eix; - указатель на
868b2b66 (kx 2024-12-20 16:11:07 +0300 539) internal e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300 540) data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300 541) SOURCE;
868b2b66 (kx 2024-12-20 16:11:07 +0300 542) int nb; - количество бит в
868b2b66 (kx 2024-12-20 16:11:07 +0300 543) external e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300 544) data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300 545)
868b2b66 (kx 2024-12-20 16:11:07 +0300 546) Return : [void]
868b2b66 (kx 2024-12-20 16:11:07 +0300 547)
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) EMUSHORT *a = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 551) *c = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 552) *z = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 553) *x = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 554) *half = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 555) *one = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 556) *small = NULL;
868b2b66 (kx 2024-12-20 16:11:07 +0300 557) EMUSHORT *pi, *pi2, *pi_2, *pi_4, *pi3_4;
868b2b66 (kx 2024-12-20 16:11:07 +0300 558) int np;
868b2b66 (kx 2024-12-20 16:11:07 +0300 559)
868b2b66 (kx 2024-12-20 16:11:07 +0300 560) if( nb < NBR_32 || nb > MPU_MATH_FN_LIMIT )
868b2b66 (kx 2024-12-20 16:11:07 +0300 561) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 562) /* error: Invalid size of operand(s) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 563) __real_invalid_size( (__mpu_char8_t *)"sin" );
868b2b66 (kx 2024-12-20 16:11:07 +0300 564) /* ei_ind( eiy, nb ); */ /* Invalid NB */
868b2b66 (kx 2024-12-20 16:11:07 +0300 565) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 566) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 567)
868b2b66 (kx 2024-12-20 16:11:07 +0300 568) /*******************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 569) Hight Precision for r32, r64.
868b2b66 (kx 2024-12-20 16:11:07 +0300 570) *******************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 571) if( nb < NBR_128 ) nb = NBR_128;
868b2b66 (kx 2024-12-20 16:11:07 +0300 572)
868b2b66 (kx 2024-12-20 16:11:07 +0300 573) np = internal_np( nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 574)
868b2b66 (kx 2024-12-20 16:11:07 +0300 575) /*** Allocate memory for x . ********************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 576) x = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 577) if( !x )
868b2b66 (kx 2024-12-20 16:11:07 +0300 578) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 579) /* fatal error */
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)
868b2b66 (kx 2024-12-20 16:11:07 +0300 584) ei_copy( x, eix, nb ); /* temp for _mtherr() */
868b2b66 (kx 2024-12-20 16:11:07 +0300 585)
868b2b66 (kx 2024-12-20 16:11:07 +0300 586) /***************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 587) Test for EIX.
868b2b66 (kx 2024-12-20 16:11:07 +0300 588) ***************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 589) /* SIN(InD) must by InD */
868b2b66 (kx 2024-12-20 16:11:07 +0300 590) if( ei_isind( eix, nb ) )
868b2b66 (kx 2024-12-20 16:11:07 +0300 591) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 592) /* "argument domain error" */
868b2b66 (kx 2024-12-20 16:11:07 +0300 593) /* return: InD */
868b2b66 (kx 2024-12-20 16:11:07 +0300 594) ei_copy( eiy, eix, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 595) /***************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 596) NOTE:
868b2b66 (kx 2024-12-20 16:11:07 +0300 597) Функция _mtherr() является переходником между
868b2b66 (kx 2024-12-20 16:11:07 +0300 598) внутренним форматом и внешней,
868b2b66 (kx 2024-12-20 16:11:07 +0300 599) переопределяемой пользователем, функцией
868b2b66 (kx 2024-12-20 16:11:07 +0300 600) _math_error(). Кроме основных действий она
868b2b66 (kx 2024-12-20 16:11:07 +0300 601) выставляет системную переменную errno
868b2b66 (kx 2024-12-20 16:11:07 +0300 602) следующим образом.
868b2b66 (kx 2024-12-20 16:11:07 +0300 603)
868b2b66 (kx 2024-12-20 16:11:07 +0300 604) errno = __mpu_math_errnotab[type];
868b2b66 (kx 2024-12-20 16:11:07 +0300 605) ***************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 606) _mtherr( eiy, (__mpu_char8_t *)"sin", __DOMAIN__,
868b2b66 (kx 2024-12-20 16:11:07 +0300 607) eiy, x, (EMUSHORT *)0, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 608) __STDOM; /* Set REAL InD - produsing Domain Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 609)
868b2b66 (kx 2024-12-20 16:11:07 +0300 610) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 611) __mpu_sbrk( -(int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 612) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 613)
868b2b66 (kx 2024-12-20 16:11:07 +0300 614) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 615) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 616) /* SIN(NaN) must by NaN */
868b2b66 (kx 2024-12-20 16:11:07 +0300 617) if( ei_isnans( eix, nb ) )
868b2b66 (kx 2024-12-20 16:11:07 +0300 618) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 619) /* "argument domain error" */
868b2b66 (kx 2024-12-20 16:11:07 +0300 620) /* return: NaN */
868b2b66 (kx 2024-12-20 16:11:07 +0300 621) ei_copy( eiy, eix, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 622) /***************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 623) NOTE:
868b2b66 (kx 2024-12-20 16:11:07 +0300 624) Функция _mtherr() является переходником между
868b2b66 (kx 2024-12-20 16:11:07 +0300 625) внутренним форматом и внешней,
868b2b66 (kx 2024-12-20 16:11:07 +0300 626) переопределяемой пользователем, функцией
868b2b66 (kx 2024-12-20 16:11:07 +0300 627) _math_error(). Кроме основных действий она
868b2b66 (kx 2024-12-20 16:11:07 +0300 628) выставляет системную переменную errno
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) errno = __mpu_math_errnotab[type];
868b2b66 (kx 2024-12-20 16:11:07 +0300 632) ***************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 633) _mtherr( eiy, (__mpu_char8_t *)"sin", __DOMAIN__,
868b2b66 (kx 2024-12-20 16:11:07 +0300 634) eiy, x, (EMUSHORT *)0, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 635) __STDOM; /* Set REAL NaN - produsing Domain Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 636)
868b2b66 (kx 2024-12-20 16:11:07 +0300 637) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 638) __mpu_sbrk( -(int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 639) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 640)
868b2b66 (kx 2024-12-20 16:11:07 +0300 641) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 642) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 643)
868b2b66 (kx 2024-12-20 16:11:07 +0300 644) /* SIN(Infinity) must by NaN */
868b2b66 (kx 2024-12-20 16:11:07 +0300 645) if( ei_isinfin( eix, nb ) )
868b2b66 (kx 2024-12-20 16:11:07 +0300 646) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 647) /* "argument domain error" */
868b2b66 (kx 2024-12-20 16:11:07 +0300 648) /* return: InD */
868b2b66 (kx 2024-12-20 16:11:07 +0300 649) ei_ind( eiy, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 650) /***************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 651) NOTE:
868b2b66 (kx 2024-12-20 16:11:07 +0300 652) Функция _mtherr() является переходником между
868b2b66 (kx 2024-12-20 16:11:07 +0300 653) внутренним форматом и внешней,
868b2b66 (kx 2024-12-20 16:11:07 +0300 654) переопределяемой пользователем, функцией
868b2b66 (kx 2024-12-20 16:11:07 +0300 655) _math_error(). Кроме основных действий она
868b2b66 (kx 2024-12-20 16:11:07 +0300 656) выставляет системную переменную errno
868b2b66 (kx 2024-12-20 16:11:07 +0300 657) следующим образом.
868b2b66 (kx 2024-12-20 16:11:07 +0300 658)
868b2b66 (kx 2024-12-20 16:11:07 +0300 659) errno = __mpu_math_errnotab[type];
868b2b66 (kx 2024-12-20 16:11:07 +0300 660) ***************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 661) _mtherr( eiy, (__mpu_char8_t *)"sin", __DOMAIN__,
868b2b66 (kx 2024-12-20 16:11:07 +0300 662) eiy, x, (EMUSHORT *)0, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 663) __STDOM; /* Set REAL Infinity - produsing Domain Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 664)
868b2b66 (kx 2024-12-20 16:11:07 +0300 665) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 666) __mpu_sbrk( -(int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 667) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 668)
868b2b66 (kx 2024-12-20 16:11:07 +0300 669) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 670) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 671)
868b2b66 (kx 2024-12-20 16:11:07 +0300 672) pi = _get_m_pi_ptr ( nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 673) pi2 = _get_m_2pi_ptr ( nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 674) pi_2 = _get_m_pi_2_ptr ( nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 675) pi_4 = _get_m_pi_4_ptr ( nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 676) pi3_4 = _get_m_3pi_4_ptr( nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 677)
868b2b66 (kx 2024-12-20 16:11:07 +0300 678) /*** Allocate memory for a, c, z, half, one, small . ******/
868b2b66 (kx 2024-12-20 16:11:07 +0300 679) a = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 680) if( !a )
868b2b66 (kx 2024-12-20 16:11:07 +0300 681) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 682) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 683)
868b2b66 (kx 2024-12-20 16:11:07 +0300 684) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 685) __mpu_sbrk( -(int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 686) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 687)
868b2b66 (kx 2024-12-20 16:11:07 +0300 688) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 689) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 690)
868b2b66 (kx 2024-12-20 16:11:07 +0300 691) c = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 692) if( !c )
868b2b66 (kx 2024-12-20 16:11:07 +0300 693) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 694) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 695)
868b2b66 (kx 2024-12-20 16:11:07 +0300 696) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 697) /* FREE a *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 698) __mpu_sbrk( -(int)(2*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 699) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 700)
868b2b66 (kx 2024-12-20 16:11:07 +0300 701) return;
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) z = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 705) if( !z )
868b2b66 (kx 2024-12-20 16:11:07 +0300 706) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 707) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 708)
868b2b66 (kx 2024-12-20 16:11:07 +0300 709) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 710) /* FREE a *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 711) /* FREE c *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 712) __mpu_sbrk( -(int)(3*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 713) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 714)
868b2b66 (kx 2024-12-20 16:11:07 +0300 715) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 716) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 717)
868b2b66 (kx 2024-12-20 16:11:07 +0300 718) half = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 719) if( !half )
868b2b66 (kx 2024-12-20 16:11:07 +0300 720) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 721) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 722)
868b2b66 (kx 2024-12-20 16:11:07 +0300 723) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 724) /* FREE a *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 725) /* FREE c *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 726) /* FREE z *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 727) __mpu_sbrk( -(int)(4*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 728) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 729)
868b2b66 (kx 2024-12-20 16:11:07 +0300 730) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 731) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 732)
868b2b66 (kx 2024-12-20 16:11:07 +0300 733) one = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 734) if( !one )
868b2b66 (kx 2024-12-20 16:11:07 +0300 735) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 736) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 737)
868b2b66 (kx 2024-12-20 16:11:07 +0300 738) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 739) /* FREE a *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 740) /* FREE c *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 741) /* FREE z *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 742) /* FREE half **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 743) __mpu_sbrk( -(int)(5*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 744) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 745)
868b2b66 (kx 2024-12-20 16:11:07 +0300 746) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 747) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 748)
868b2b66 (kx 2024-12-20 16:11:07 +0300 749) small = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 750) if( !small )
868b2b66 (kx 2024-12-20 16:11:07 +0300 751) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 752) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 753)
868b2b66 (kx 2024-12-20 16:11:07 +0300 754) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 755) /* FREE a *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 756) /* FREE c *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 757) /* FREE z *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 758) /* FREE half **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 759) /* FREE one ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 760) __mpu_sbrk( -(int)(6*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 761) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 762)
868b2b66 (kx 2024-12-20 16:11:07 +0300 763) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 764) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 765) /************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 766)
868b2b66 (kx 2024-12-20 16:11:07 +0300 767)
868b2b66 (kx 2024-12-20 16:11:07 +0300 768) _gen_half( half, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 769) _gen_one ( one, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 770) /*********************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 771) small: 1.0 + small^2 == 1.0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 772) big : big = 1/(small^2);
868b2b66 (kx 2024-12-20 16:11:07 +0300 773) *********************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 774) ei_sqrt( small, _get_epsilon_ptr( nb ), nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 775)
868b2b66 (kx 2024-12-20 16:11:07 +0300 776) ei_drem( x, eix, pi2, nb ); /* reduse EIX into [-PI, PI]. */
868b2b66 (kx 2024-12-20 16:11:07 +0300 777)
868b2b66 (kx 2024-12-20 16:11:07 +0300 778) ei_copysign( a, x, one, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 779)
868b2b66 (kx 2024-12-20 16:11:07 +0300 780) if( ei_cmp( a, pi_4, nb ) >= 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 781) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 782) if( ei_cmp( a, pi3_4, nb ) >= 0 ) /* ... in [3PI/4, PI]. */
868b2b66 (kx 2024-12-20 16:11:07 +0300 783) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 784) ei_sub( a, pi, a, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 785) ei_copysign( x, a, x, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 786) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 787) else /* ... in [PI/4, 3PI/4]. */
868b2b66 (kx 2024-12-20 16:11:07 +0300 788) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 789) /* return: sign(x)*COS(PI/2-|x|).*/
868b2b66 (kx 2024-12-20 16:11:07 +0300 790) ei_sub( a, pi_2, a, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 791) ei_mul( z, a, a, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 792) ei_cos__C( c, z, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 793) ei_mul( z, z, half, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 794) ei_sub( a, z, c, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 795) ei_sub( a, one, a, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 796) ei_copysign( eiy, a, x, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 797)
868b2b66 (kx 2024-12-20 16:11:07 +0300 798) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 799) /* FREE a *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 800) /* FREE c *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 801) /* FREE z *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 802) /* FREE half **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 803) /* FREE one ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 804) /* FREE small *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 805) __mpu_sbrk( -(int)(7*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 806) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 807)
868b2b66 (kx 2024-12-20 16:11:07 +0300 808) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 809) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 810) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 811)
868b2b66 (kx 2024-12-20 16:11:07 +0300 812) /* return: SIN(x) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 813) if( ei_cmp( a, small, nb ) < 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 814) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 815) ei_copy( eiy, x, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 816)
868b2b66 (kx 2024-12-20 16:11:07 +0300 817) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 818) /* FREE a *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 819) /* FREE c *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 820) /* FREE z *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 821) /* FREE half **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 822) /* FREE one ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 823) /* FREE small *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 824) __mpu_sbrk( -(int)(7*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 825) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 826)
868b2b66 (kx 2024-12-20 16:11:07 +0300 827) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 828) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 829)
868b2b66 (kx 2024-12-20 16:11:07 +0300 830) ei_mul( z, x, x, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 831) ei_sin__S( z, z, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 832) ei_mul( z, z, x, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 833) ei_add( eiy, x, z, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 834)
868b2b66 (kx 2024-12-20 16:11:07 +0300 835) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 836) /* FREE a *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 837) /* FREE c *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 838) /* FREE z *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 839) /* FREE half **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 840) /* FREE one ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 841) /* FREE small *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 842) __mpu_sbrk( -(int)(7*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 843) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 844)
868b2b66 (kx 2024-12-20 16:11:07 +0300 845) } /* End of ei_sin() */
868b2b66 (kx 2024-12-20 16:11:07 +0300 846)
868b2b66 (kx 2024-12-20 16:11:07 +0300 847)
868b2b66 (kx 2024-12-20 16:11:07 +0300 848) void ei_cos( EMUSHORT *eiy, EMUSHORT *eix, int nb )
868b2b66 (kx 2024-12-20 16:11:07 +0300 849) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 850)
868b2b66 (kx 2024-12-20 16:11:07 +0300 851) Description : ei_cos() Работает с
868b2b66 (kx 2024-12-20 16:11:07 +0300 852) internal e-type data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300 853)
868b2b66 (kx 2024-12-20 16:11:07 +0300 854) Concepts : Return in EIY = COS( EIX ).
868b2b66 (kx 2024-12-20 16:11:07 +0300 855)
868b2b66 (kx 2024-12-20 16:11:07 +0300 856) NOTE : See: ei_sin__S() & ei_cos__C().
868b2b66 (kx 2024-12-20 16:11:07 +0300 857)
868b2b66 (kx 2024-12-20 16:11:07 +0300 858) Use Global Variable:
868b2b66 (kx 2024-12-20 16:11:07 +0300 859)
868b2b66 (kx 2024-12-20 16:11:07 +0300 860) Use Functions : ei_copy( eiy, eix, nb ); | mpu-real.c
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) .
868b2b66 (kx 2024-12-20 16:11:07 +0300 864)
868b2b66 (kx 2024-12-20 16:11:07 +0300 865) Parameters : EMUSHORT *eiy; - указатель на
868b2b66 (kx 2024-12-20 16:11:07 +0300 866) internal e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300 867) data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300 868) TARGET;
868b2b66 (kx 2024-12-20 16:11:07 +0300 869) EMUSHORT *eix; - указатель на
868b2b66 (kx 2024-12-20 16:11:07 +0300 870) internal e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300 871) data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300 872) SOURCE;
868b2b66 (kx 2024-12-20 16:11:07 +0300 873) int nb; - количество бит в
868b2b66 (kx 2024-12-20 16:11:07 +0300 874) external e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300 875) data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300 876)
868b2b66 (kx 2024-12-20 16:11:07 +0300 877) Return : [void]
868b2b66 (kx 2024-12-20 16:11:07 +0300 878)
868b2b66 (kx 2024-12-20 16:11:07 +0300 879) ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 880) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 881) EMUSHORT *a = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 882) *c = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 883) *z = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 884) *x = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 885) *s = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 886) *half = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 887) *one = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 888) *small = NULL;
868b2b66 (kx 2024-12-20 16:11:07 +0300 889) EMUSHORT *pi, *pi2, *pi_2, *pi_4, *pi3_4;
868b2b66 (kx 2024-12-20 16:11:07 +0300 890) int np;
868b2b66 (kx 2024-12-20 16:11:07 +0300 891)
868b2b66 (kx 2024-12-20 16:11:07 +0300 892) if( nb < NBR_32 || nb > MPU_MATH_FN_LIMIT )
868b2b66 (kx 2024-12-20 16:11:07 +0300 893) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 894) /* error: Invalid size of operand(s) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 895) __real_invalid_size( (__mpu_char8_t *)"cos" );
868b2b66 (kx 2024-12-20 16:11:07 +0300 896) /* ei_ind( eiy, nb ); */ /* Invalid NB */
868b2b66 (kx 2024-12-20 16:11:07 +0300 897) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 898) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 899)
868b2b66 (kx 2024-12-20 16:11:07 +0300 900) /*******************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 901) Hight Precision for r32, r64.
868b2b66 (kx 2024-12-20 16:11:07 +0300 902) *******************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 903) if( nb < NBR_128 ) nb = NBR_128;
868b2b66 (kx 2024-12-20 16:11:07 +0300 904)
868b2b66 (kx 2024-12-20 16:11:07 +0300 905) np = internal_np( nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 906)
868b2b66 (kx 2024-12-20 16:11:07 +0300 907) /*** Allocate memory for x . ********************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 908) x = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 909) if( !x )
868b2b66 (kx 2024-12-20 16:11:07 +0300 910) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 911) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 912) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 913) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 914) /************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 915)
868b2b66 (kx 2024-12-20 16:11:07 +0300 916)
868b2b66 (kx 2024-12-20 16:11:07 +0300 917) ei_copy( x, eix, nb ); /* temp for _mtherr() */
868b2b66 (kx 2024-12-20 16:11:07 +0300 918)
868b2b66 (kx 2024-12-20 16:11:07 +0300 919) /***************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 920) Test for EIX.
868b2b66 (kx 2024-12-20 16:11:07 +0300 921) ***************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 922) /* COS(InD) must by InD */
868b2b66 (kx 2024-12-20 16:11:07 +0300 923) if( ei_isind( eix, nb ) )
868b2b66 (kx 2024-12-20 16:11:07 +0300 924) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 925) /* "argument domain error" */
868b2b66 (kx 2024-12-20 16:11:07 +0300 926) /* return: InD */
868b2b66 (kx 2024-12-20 16:11:07 +0300 927) ei_copy( eiy, eix, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 928) /***************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 929) NOTE:
868b2b66 (kx 2024-12-20 16:11:07 +0300 930) Функция _mtherr() является переходником между
868b2b66 (kx 2024-12-20 16:11:07 +0300 931) внутренним форматом и внешней,
868b2b66 (kx 2024-12-20 16:11:07 +0300 932) переопределяемой пользователем, функцией
868b2b66 (kx 2024-12-20 16:11:07 +0300 933) _math_error(). Кроме основных действий она
868b2b66 (kx 2024-12-20 16:11:07 +0300 934) выставляет системную переменную errno
868b2b66 (kx 2024-12-20 16:11:07 +0300 935) следующим образом.
868b2b66 (kx 2024-12-20 16:11:07 +0300 936)
868b2b66 (kx 2024-12-20 16:11:07 +0300 937) errno = __mpu_math_errnotab[type];
868b2b66 (kx 2024-12-20 16:11:07 +0300 938) ***************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 939) _mtherr( eiy, (__mpu_char8_t *)"cos", __DOMAIN__,
868b2b66 (kx 2024-12-20 16:11:07 +0300 940) eiy, x, (EMUSHORT *)0, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 941) __STDOM; /* Set REAL InD - produsing Domain Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 942)
868b2b66 (kx 2024-12-20 16:11:07 +0300 943) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 944) __mpu_sbrk( -(int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 945) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 946)
868b2b66 (kx 2024-12-20 16:11:07 +0300 947) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 948) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 949) /* COS(NaN) must by NaN */
868b2b66 (kx 2024-12-20 16:11:07 +0300 950) if( ei_isnans( eix, nb ) )
868b2b66 (kx 2024-12-20 16:11:07 +0300 951) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 952) /* "argument domain error" */
868b2b66 (kx 2024-12-20 16:11:07 +0300 953) /* return: NaN */
868b2b66 (kx 2024-12-20 16:11:07 +0300 954) ei_copy( eiy, eix, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 955) /***************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 956) NOTE:
868b2b66 (kx 2024-12-20 16:11:07 +0300 957) Функция _mtherr() является переходником между
868b2b66 (kx 2024-12-20 16:11:07 +0300 958) внутренним форматом и внешней,
868b2b66 (kx 2024-12-20 16:11:07 +0300 959) переопределяемой пользователем, функцией
868b2b66 (kx 2024-12-20 16:11:07 +0300 960) _math_error(). Кроме основных действий она
868b2b66 (kx 2024-12-20 16:11:07 +0300 961) выставляет системную переменную errno
868b2b66 (kx 2024-12-20 16:11:07 +0300 962) следующим образом.
868b2b66 (kx 2024-12-20 16:11:07 +0300 963)
868b2b66 (kx 2024-12-20 16:11:07 +0300 964) errno = __mpu_math_errnotab[type];
868b2b66 (kx 2024-12-20 16:11:07 +0300 965) ***************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 966) _mtherr( eiy, (__mpu_char8_t *)"cos", __DOMAIN__,
868b2b66 (kx 2024-12-20 16:11:07 +0300 967) eiy, x, (EMUSHORT *)0, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 968) __STDOM; /* Set REAL NaN - produsing Domain Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 969)
868b2b66 (kx 2024-12-20 16:11:07 +0300 970) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 971) __mpu_sbrk( -(int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 972) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 973)
868b2b66 (kx 2024-12-20 16:11:07 +0300 974) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 975) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 976)
868b2b66 (kx 2024-12-20 16:11:07 +0300 977) /* COS(Infinity) must by NaN */
868b2b66 (kx 2024-12-20 16:11:07 +0300 978) if( ei_isinfin( eix, nb ) )
868b2b66 (kx 2024-12-20 16:11:07 +0300 979) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 980) /* "argument domain error" */
868b2b66 (kx 2024-12-20 16:11:07 +0300 981) /* return: InD */
868b2b66 (kx 2024-12-20 16:11:07 +0300 982) ei_ind( eiy, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 983) /***************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 984) NOTE:
868b2b66 (kx 2024-12-20 16:11:07 +0300 985) Функция _mtherr() является переходником между
868b2b66 (kx 2024-12-20 16:11:07 +0300 986) внутренним форматом и внешней,
868b2b66 (kx 2024-12-20 16:11:07 +0300 987) переопределяемой пользователем, функцией
868b2b66 (kx 2024-12-20 16:11:07 +0300 988) _math_error(). Кроме основных действий она
868b2b66 (kx 2024-12-20 16:11:07 +0300 989) выставляет системную переменную errno
868b2b66 (kx 2024-12-20 16:11:07 +0300 990) следующим образом.
868b2b66 (kx 2024-12-20 16:11:07 +0300 991)
868b2b66 (kx 2024-12-20 16:11:07 +0300 992) errno = __mpu_math_errnotab[type];
868b2b66 (kx 2024-12-20 16:11:07 +0300 993) ***************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 994) _mtherr( eiy, (__mpu_char8_t *)"cos", __DOMAIN__,
868b2b66 (kx 2024-12-20 16:11:07 +0300 995) eiy, x, (EMUSHORT *)0, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 996) __STDOM; /* Set REAL Infinity - produsing Domain Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 997)
868b2b66 (kx 2024-12-20 16:11:07 +0300 998) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 999) __mpu_sbrk( -(int)(np*SIZE_OF_EMUSHORT) );
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) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1003) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 1004)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1005) pi = _get_m_pi_ptr ( nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1006) pi2 = _get_m_2pi_ptr ( nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1007) pi_2 = _get_m_pi_2_ptr ( nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1008) pi_4 = _get_m_pi_4_ptr ( nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1009) pi3_4 = _get_m_3pi_4_ptr( nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1010)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1011) /*** Allocate memory for a, c, z, s, half, one, small . *****/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1012) a = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1013) if( !a )
868b2b66 (kx 2024-12-20 16:11:07 +0300 1014) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 1015) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1016)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1017) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1018) __mpu_sbrk( -(int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1019) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1020)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1021) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1022) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 1023)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1024) c = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1025) if( !c )
868b2b66 (kx 2024-12-20 16:11:07 +0300 1026) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 1027) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1028)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1029) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1030) /* FREE a *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1031) __mpu_sbrk( -(int)(2*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1032) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1033)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1034) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1035) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 1036)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1037) z = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1038) if( !z )
868b2b66 (kx 2024-12-20 16:11:07 +0300 1039) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 1040) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1041)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1042) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1043) /* FREE a *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1044) /* FREE c *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1045) __mpu_sbrk( -(int)(3*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1046) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1047)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1048) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1049) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 1050)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1051) s = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1052) if( !s )
868b2b66 (kx 2024-12-20 16:11:07 +0300 1053) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 1054) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1055)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1056) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1057) /* FREE a *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1058) /* FREE c *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1059) /* FREE z *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1060) __mpu_sbrk( -(int)(4*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1061) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1062)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1063) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1064) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 1065)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1066) half = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1067) if( !half )
868b2b66 (kx 2024-12-20 16:11:07 +0300 1068) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 1069) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1070)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1071) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1072) /* FREE a *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1073) /* FREE c *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1074) /* FREE z *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1075) /* FREE s *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1076) __mpu_sbrk( -(int)(5*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1077) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1078)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1079) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1080) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 1081)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1082) one = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1083) if( !one )
868b2b66 (kx 2024-12-20 16:11:07 +0300 1084) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 1085) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1086)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1087) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1088) /* FREE a *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1089) /* FREE c *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1090) /* FREE z *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1091) /* FREE s *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1092) /* FREE half **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1093) __mpu_sbrk( -(int)(6*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1094) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1095)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1096) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1097) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 1098)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1099) small = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1100) if( !small )
868b2b66 (kx 2024-12-20 16:11:07 +0300 1101) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 1102) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1103)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1104) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1105) /* FREE a *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1106) /* FREE c *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1107) /* FREE z *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1108) /* FREE s *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1109) /* FREE half **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1110) /* FREE one ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1111) __mpu_sbrk( -(int)(7*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1112) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1113)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1114) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1115) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 1116) /************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1117)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1118)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1119) _gen_half( half, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1120) _gen_one ( one, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1121) _gen_one ( s, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1122) /*********************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 1123) small: 1.0 + small^2 == 1.0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1124) big : big = 1/(small^2);
868b2b66 (kx 2024-12-20 16:11:07 +0300 1125) *********************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1126) ei_sqrt( small, _get_epsilon_ptr( nb ), nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1127)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1128) ei_drem( x, eix, pi2, nb ); /* reduse EIX into [-PI, PI]. */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1129)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1130) ei_copysign( a, x, one, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1131)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1132) if( ei_cmp( a, pi_4, nb ) >= 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 1133) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 1134) if( ei_cmp( a, pi3_4, nb ) >= 0 ) /* ... in [3PI/4, PI]. */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1135) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 1136) ei_sub( a, pi, a, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1137) ei_neg( s, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1138) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 1139) else /* ... in [PI/4, 3PI/4]. */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1140) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 1141) /* return: SIN(PI/2-|x|).*/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1142) ei_sub( a, pi_2, a, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1143) ei_mul( z, a, a, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1144) ei_sin__S( z, z, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1145) ei_mul( z, z, a, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1146) ei_add( eiy, a, z, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1147)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1148) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1149) /* FREE a *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1150) /* FREE c *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1151) /* FREE z *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1152) /* FREE s *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1153) /* FREE half **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1154) /* FREE one ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1155) /* FREE small *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1156) __mpu_sbrk( -(int)(8*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1157) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1158)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1159) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1160) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 1161) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 1162)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1163) /* return: s*COS(a) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1164) if( ei_cmp( a, small, nb ) < 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 1165) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 1166) ei_copy( eiy, s, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1167)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1168) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1169) /* FREE a *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1170) /* FREE c *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1171) /* FREE z *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1172) /* FREE s *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1173) /* FREE half **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1174) /* FREE one ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1175) /* FREE small *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1176) __mpu_sbrk( -(int)(8*np*SIZE_OF_EMUSHORT) );
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) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1180) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 1181)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1182) ei_mul( z, a, a, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1183) ei_cos__C( c, z, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1184) ei_mul( z, z, half, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1185) ei_sub( a, z, c, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1186) ei_sub( a, one, a, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1187) ei_copysign( eiy, a, s, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1188)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1189) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1190) /* FREE a *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1191) /* FREE c *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1192) /* FREE z *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1193) /* FREE s *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1194) /* FREE half **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1195) /* FREE one ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1196) /* FREE small *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1197) __mpu_sbrk( -(int)(8*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1198) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1199)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1200) } /* End of ei_cos() */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1201)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1202)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1203) void ei_tan( EMUSHORT *eiy, EMUSHORT *eix, int nb )
868b2b66 (kx 2024-12-20 16:11:07 +0300 1204) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 1205)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1206) Description : ei_tan() Работает с
868b2b66 (kx 2024-12-20 16:11:07 +0300 1207) internal e-type data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300 1208)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1209) Concepts : Return in EIY = TAN( EIX ).
868b2b66 (kx 2024-12-20 16:11:07 +0300 1210)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1211) NOTE : See: ei_sin__S() & ei_cos__C().
868b2b66 (kx 2024-12-20 16:11:07 +0300 1212)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1213) Use Global Variable:
868b2b66 (kx 2024-12-20 16:11:07 +0300 1214)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1215) Use Functions : ei_copy( eiy, eix, nb ); | mpu-real.c
868b2b66 (kx 2024-12-20 16:11:07 +0300 1216) .
868b2b66 (kx 2024-12-20 16:11:07 +0300 1217) .
868b2b66 (kx 2024-12-20 16:11:07 +0300 1218) .
868b2b66 (kx 2024-12-20 16:11:07 +0300 1219)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1220) Parameters : EMUSHORT *eiy; - указатель на
868b2b66 (kx 2024-12-20 16:11:07 +0300 1221) internal e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300 1222) data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300 1223) TARGET;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1224) EMUSHORT *eix; - указатель на
868b2b66 (kx 2024-12-20 16:11:07 +0300 1225) internal e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300 1226) data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300 1227) SOURCE;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1228) int nb; - количество бит в
868b2b66 (kx 2024-12-20 16:11:07 +0300 1229) external e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300 1230) data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300 1231)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1232) Return : [void]
868b2b66 (kx 2024-12-20 16:11:07 +0300 1233)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1234) ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1235) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 1236) EMUSHORT *a = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 1237) *c = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 1238) *z = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 1239) *ss = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 1240) *cc = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 1241) *x = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 1242) *half = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 1243) *one = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 1244) *small = NULL;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1245) EMUSHORT *pi, *pi_2, *pi_4;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1246) int np;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1247) int k;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1248)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1249) if( nb < NBR_32 || nb > MPU_MATH_FN_LIMIT )
868b2b66 (kx 2024-12-20 16:11:07 +0300 1250) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 1251) /* error: Invalid size of operand(s) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1252) __real_invalid_size( (__mpu_char8_t *)"tan" );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1253) /* ei_ind( eiy, nb ); */ /* Invalid NB */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1254) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1255) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 1256)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1257) /*******************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 1258) Hight Precision for r32, r64.
868b2b66 (kx 2024-12-20 16:11:07 +0300 1259) *******************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1260) if( nb < NBR_128 ) nb = NBR_128;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1261)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1262) np = internal_np( nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1263)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1264) /*** Allocate memory for x . ********************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1265) x = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1266) if( !x )
868b2b66 (kx 2024-12-20 16:11:07 +0300 1267) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 1268) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1269) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1270) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 1271) /************************************************************/
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) ei_copy( x, eix, nb ); /* temp for _mtherr() */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1275)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1276) /***************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 1277) Test for EIX.
868b2b66 (kx 2024-12-20 16:11:07 +0300 1278) ***************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1279) /* TAN(InD) must by InD */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1280) if( ei_isind( eix, nb ) )
868b2b66 (kx 2024-12-20 16:11:07 +0300 1281) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 1282) /* "argument domain error" */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1283) /* return: InD */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1284) ei_copy( eiy, eix, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1285) /***************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 1286) NOTE:
868b2b66 (kx 2024-12-20 16:11:07 +0300 1287) Функция _mtherr() является переходником между
868b2b66 (kx 2024-12-20 16:11:07 +0300 1288) внутренним форматом и внешней,
868b2b66 (kx 2024-12-20 16:11:07 +0300 1289) переопределяемой пользователем, функцией
868b2b66 (kx 2024-12-20 16:11:07 +0300 1290) _math_error(). Кроме основных действий она
868b2b66 (kx 2024-12-20 16:11:07 +0300 1291) выставляет системную переменную errno
868b2b66 (kx 2024-12-20 16:11:07 +0300 1292) следующим образом.
868b2b66 (kx 2024-12-20 16:11:07 +0300 1293)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1294) errno = __mpu_math_errnotab[type];
868b2b66 (kx 2024-12-20 16:11:07 +0300 1295) ***************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1296) _mtherr( eiy, (__mpu_char8_t *)"tan", __DOMAIN__,
868b2b66 (kx 2024-12-20 16:11:07 +0300 1297) eiy, x, (EMUSHORT *)0, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1298) __STDOM; /* Set REAL InD - produsing Domain Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1299)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1300) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1301) __mpu_sbrk( -(int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1302) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1303)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1304) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1305) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 1306) /* TAN(NaN) must by NaN */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1307) if( ei_isnans( eix, nb ) )
868b2b66 (kx 2024-12-20 16:11:07 +0300 1308) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 1309) /* "argument domain error" */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1310) /* return: NaN */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1311) ei_copy( eiy, eix, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1312) /***************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 1313) NOTE:
868b2b66 (kx 2024-12-20 16:11:07 +0300 1314) Функция _mtherr() является переходником между
868b2b66 (kx 2024-12-20 16:11:07 +0300 1315) внутренним форматом и внешней,
868b2b66 (kx 2024-12-20 16:11:07 +0300 1316) переопределяемой пользователем, функцией
868b2b66 (kx 2024-12-20 16:11:07 +0300 1317) _math_error(). Кроме основных действий она
868b2b66 (kx 2024-12-20 16:11:07 +0300 1318) выставляет системную переменную errno
868b2b66 (kx 2024-12-20 16:11:07 +0300 1319) следующим образом.
868b2b66 (kx 2024-12-20 16:11:07 +0300 1320)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1321) errno = __mpu_math_errnotab[type];
868b2b66 (kx 2024-12-20 16:11:07 +0300 1322) ***************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1323) _mtherr( eiy, (__mpu_char8_t *)"tan", __DOMAIN__,
868b2b66 (kx 2024-12-20 16:11:07 +0300 1324) eiy, x, (EMUSHORT *)0, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1325) __STDOM; /* Set REAL NaN - produsing Domain Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1326)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1327) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1328) __mpu_sbrk( -(int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1329) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1330)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1331) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1332) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 1333)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1334) /* TAN(Infinity) must by NaN */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1335) if( ei_isinfin( eix, nb ) )
868b2b66 (kx 2024-12-20 16:11:07 +0300 1336) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 1337) /* "argument domain error" */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1338) /* return: InD */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1339) ei_ind( eiy, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1340) /***************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 1341) NOTE:
868b2b66 (kx 2024-12-20 16:11:07 +0300 1342) Функция _mtherr() является переходником между
868b2b66 (kx 2024-12-20 16:11:07 +0300 1343) внутренним форматом и внешней,
868b2b66 (kx 2024-12-20 16:11:07 +0300 1344) переопределяемой пользователем, функцией
868b2b66 (kx 2024-12-20 16:11:07 +0300 1345) _math_error(). Кроме основных действий она
868b2b66 (kx 2024-12-20 16:11:07 +0300 1346) выставляет системную переменную errno
868b2b66 (kx 2024-12-20 16:11:07 +0300 1347) следующим образом.
868b2b66 (kx 2024-12-20 16:11:07 +0300 1348)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1349) errno = __mpu_math_errnotab[type];
868b2b66 (kx 2024-12-20 16:11:07 +0300 1350) ***************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1351) _mtherr( eiy, (__mpu_char8_t *)"tan", __DOMAIN__,
868b2b66 (kx 2024-12-20 16:11:07 +0300 1352) eiy, x, (EMUSHORT *)0, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1353) __STDOM; /* Set REAL Infinity - produsing Domain Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1354)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1355) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1356) __mpu_sbrk( -(int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1357) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1358)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1359) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1360) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 1361)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1362) pi = _get_m_pi_ptr ( nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1363) pi_2 = _get_m_pi_2_ptr ( nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1364) pi_4 = _get_m_pi_4_ptr ( nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1365)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1366) /*** Allocate memory for a, c, z, ss, cc, half, one, small. */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1367) a = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1368) if( !a )
868b2b66 (kx 2024-12-20 16:11:07 +0300 1369) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 1370) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1371)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1372) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1373) __mpu_sbrk( -(int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1374) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1375)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1376) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1377) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 1378)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1379) c = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1380) if( !c )
868b2b66 (kx 2024-12-20 16:11:07 +0300 1381) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 1382) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1383)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1384) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1385) /* FREE a *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1386) __mpu_sbrk( -(int)(2*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1387) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1388)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1389) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1390) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 1391)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1392) z = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1393) if( !z )
868b2b66 (kx 2024-12-20 16:11:07 +0300 1394) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 1395) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1396)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1397) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1398) /* FREE a *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1399) /* FREE c *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1400) __mpu_sbrk( -(int)(3*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1401) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1402)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1403) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1404) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 1405)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1406) ss = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1407) if( !ss )
868b2b66 (kx 2024-12-20 16:11:07 +0300 1408) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 1409) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1410)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1411) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1412) /* FREE a *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1413) /* FREE c *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1414) /* FREE z *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1415) __mpu_sbrk( -(int)(4*np*SIZE_OF_EMUSHORT) );
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) return;
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) cc = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1422) if( !cc )
868b2b66 (kx 2024-12-20 16:11:07 +0300 1423) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 1424) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1425)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1426) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1427) /* FREE a *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1428) /* FREE c *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1429) /* FREE z *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1430) /* FREE ss ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1431) __mpu_sbrk( -(int)(5*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1432) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1433)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1434) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1435) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 1436)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1437) half = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1438) if( !half )
868b2b66 (kx 2024-12-20 16:11:07 +0300 1439) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 1440) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1441)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1442) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1443) /* FREE a *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1444) /* FREE c *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1445) /* FREE z *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1446) /* FREE ss ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1447) /* FREE cc ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1448) __mpu_sbrk( -(int)(6*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1449) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1450)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1451) return;
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) one = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1455) if( !one )
868b2b66 (kx 2024-12-20 16:11:07 +0300 1456) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 1457) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1458)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1459) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1460) /* FREE a *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1461) /* FREE c *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1462) /* FREE z *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1463) /* FREE ss ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1464) /* FREE cc ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1465) /* FREE half **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1466) __mpu_sbrk( -(int)(7*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1467) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1468)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1469) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1470) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 1471)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1472) small = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1473) if( !small )
868b2b66 (kx 2024-12-20 16:11:07 +0300 1474) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 1475) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1476)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1477) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1478) /* FREE a *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1479) /* FREE c *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1480) /* FREE z *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1481) /* FREE ss ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1482) /* FREE cc ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1483) /* FREE half **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1484) /* FREE one ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1485) __mpu_sbrk( -(int)(8*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1486) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1487)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1488) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1489) }
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) _gen_half( half, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1493) _gen_one ( one, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1494) /*********************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 1495) small: 1.0 + small^2 == 1.0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1496) big : big = 1/(small^2);
868b2b66 (kx 2024-12-20 16:11:07 +0300 1497) *********************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1498) ei_sqrt( small, _get_epsilon_ptr( nb ), nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1499)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1500) ei_drem( x, eix, pi, nb ); /* reduse EIX into [-PI/2, PI/2]. */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1501)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1502) ei_copysign( a, x, one, nb ); /* ... = abs(x) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1503)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1504) if( ei_cmp( a, pi_4, nb ) >= 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 1505) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 1506) k = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1507) ei_sub( a, pi_2, a, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1508) ei_copysign( x, a, x, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1509) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 1510) else
868b2b66 (kx 2024-12-20 16:11:07 +0300 1511) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 1512) k = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1513) if( ei_cmp( a, small, nb ) < 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 1514) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 1515) ei_copy( eiy, x, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1516)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1517) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1518) /* FREE a *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1519) /* FREE c *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1520) /* FREE z *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1521) /* FREE ss ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1522) /* FREE cc ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1523) /* FREE half **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1524) /* FREE one ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1525) /* FREE small *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1526) __mpu_sbrk( -(int)(9*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1527) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1528)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1529) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1530) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 1531) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 1532)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1533) ei_mul( z, x, x, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1534) ei_cos__C( cc, z, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1535) ei_sin__S( ss, z, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1536) ei_mul( z, z, half, nb ); /* Next get c = cos(x) accurately */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1537)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1538) ei_sub( c, z, cc, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1539) ei_sub( c, one, c, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1540)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1541) if( k == 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 1542) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 1543) /* a use as temp variable */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1544) /* return x+(x*(z-(cc-ss)))/c; ... sin/cos */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1545) ei_sub( a, cc, ss, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1546) ei_sub( a, z, a, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1547) ei_mul( a, x, a, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1548) ei_div( a, a, c, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1549) ei_add( a, x, a, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1550)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1551) ei_copy( eiy, a, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1552)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1553) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1554) /* FREE a *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1555) /* FREE c *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1556) /* FREE z *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1557) /* FREE ss ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1558) /* FREE cc ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1559) /* FREE half **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1560) /* FREE one ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1561) /* FREE small *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1562) __mpu_sbrk( -(int)(9*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1563) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1564)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1565) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1566) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 1567) else
868b2b66 (kx 2024-12-20 16:11:07 +0300 1568) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 1569) /* a use as temp variable */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1570) /* return c/(x+x*ss); ... cos/sin */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1571) ei_mul( a, x, ss, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1572) ei_add( a, x, a, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1573) ei_div( a, c, a, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1574)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1575) ei_copy( eiy, a, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1576)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1577) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1578) /* FREE a *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1579) /* FREE c *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1580) /* FREE z *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1581) /* FREE ss ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1582) /* FREE cc ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1583) /* FREE half **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1584) /* FREE one ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1585) /* FREE small *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1586) __mpu_sbrk( -(int)(9*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1587) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1588)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1589) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1590)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1591) } /* End if( k == 0 ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1592)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1593) } /* End of ei_tan() */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1594)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1595)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1596) void ei_log1p( EMUSHORT *eiy, EMUSHORT *eix, int nb )
868b2b66 (kx 2024-12-20 16:11:07 +0300 1597) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 1598)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1599) Description : ei_log1p() Работает с
868b2b66 (kx 2024-12-20 16:11:07 +0300 1600) internal e-type data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300 1601)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1602) Concepts : Return in EIY the LOGARITHM of ( 1 + EIX ).
868b2b66 (kx 2024-12-20 16:11:07 +0300 1603)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1604) METHOD : 1. Argument Reduction: find k and f such that
868b2b66 (kx 2024-12-20 16:11:07 +0300 1605)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1606) 1+x = 2^k * (1+f),
868b2b66 (kx 2024-12-20 16:11:07 +0300 1607)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1608) whwre sqrt(2)/2 < 1+f < sqrt(2).
868b2b66 (kx 2024-12-20 16:11:07 +0300 1609)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1610) 2. Let s = f/(2+f); Based on
868b2b66 (kx 2024-12-20 16:11:07 +0300 1611)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1612) log(1+f) = log(1+s) - log(1-s) =
868b2b66 (kx 2024-12-20 16:11:07 +0300 1613) = 2*S + (2/3)*S^3 + (2/5)*S^5 + ... = L,
868b2b66 (kx 2024-12-20 16:11:07 +0300 1614)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1615) log(1+f) is computed by
868b2b66 (kx 2024-12-20 16:11:07 +0300 1616)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1617) log(1+f) = 2*s + s*log__L(s*s),
868b2b66 (kx 2024-12-20 16:11:07 +0300 1618)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1619) where
868b2b66 (kx 2024-12-20 16:11:07 +0300 1620)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1621) log__L(z) =
868b2b66 (kx 2024-12-20 16:11:07 +0300 1622) = z*(L1 + z*(L2 + z*(L3 + ... )) ... ).
868b2b66 (kx 2024-12-20 16:11:07 +0300 1623)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1624) See: ei_log__L() for the values of the
868b2b66 (kx 2024-12-20 16:11:07 +0300 1625) coefficients.
868b2b66 (kx 2024-12-20 16:11:07 +0300 1626)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1627) 3. Finaly, log(1+x) = k*ln2 + log(1+f).
868b2b66 (kx 2024-12-20 16:11:07 +0300 1628)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1629)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1630) ACCURACY : In the absence of rounding error,
868b2b66 (kx 2024-12-20 16:11:07 +0300 1631) the appriximation has absolute error
868b2b66 (kx 2024-12-20 16:11:07 +0300 1632) less than EPSILON [see: FLOATP.H].
868b2b66 (kx 2024-12-20 16:11:07 +0300 1633)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1634) NOTE : 1. В шаге 3 n*ln2 всегда сохраняется в двух
868b2b66 (kx 2024-12-20 16:11:07 +0300 1635) числах n*ln2hi + n*ln2lo, где ln2hi ищется
868b2b66 (kx 2024-12-20 16:11:07 +0300 1636) таким, чтобы последние биты были равны 0.
868b2b66 (kx 2024-12-20 16:11:07 +0300 1637) Это обеспечивает точное представление
868b2b66 (kx 2024-12-20 16:11:07 +0300 1638) произведения n*ln2hi в разрядной сетке
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) './service/emuXXXXX/SxxxCxxX.c'.
868b2b66 (kx 2024-12-20 16:11:07 +0300 1642) 2. In step 1, f may not representable.
868b2b66 (kx 2024-12-20 16:11:07 +0300 1643) A correction term c for f is computed.
868b2b66 (kx 2024-12-20 16:11:07 +0300 1644) It follows that the correction term for
868b2b66 (kx 2024-12-20 16:11:07 +0300 1645) f - t (the leading term of log(1+f)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1646) in step 2) is c-c*x. We add this correction
868b2b66 (kx 2024-12-20 16:11:07 +0300 1647) term to n*ln2lo to attenuate the error.
868b2b66 (kx 2024-12-20 16:11:07 +0300 1648)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1649) SPECIAL CASES : log1p(x) = -InD с выставлением DOMAIN flag
868b2b66 (kx 2024-12-20 16:11:07 +0300 1650) [если( x < -1 )];
868b2b66 (kx 2024-12-20 16:11:07 +0300 1651) log1p(+NaN) = +NaN с выставлением DOMAIN flag;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1652) log1p(-NaN) = -NaN с выставлением DOMAIN flag;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1653) log1p(-inf) = -InD с выставлением DOMAIN flag;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1654) log1p(-1) = -inf с выставлением DOMAIN flag;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1655) log1p(+inf) = +inf [норма];
868b2b66 (kx 2024-12-20 16:11:07 +0300 1656) log1p(0) = 0 [норма];
868b2b66 (kx 2024-12-20 16:11:07 +0300 1657)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1658) Use Global Variable:
868b2b66 (kx 2024-12-20 16:11:07 +0300 1659)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1660) Use Functions : ei_copy( eiy, eix, nb ); | mpu-real.c
868b2b66 (kx 2024-12-20 16:11:07 +0300 1661) .
868b2b66 (kx 2024-12-20 16:11:07 +0300 1662) .
868b2b66 (kx 2024-12-20 16:11:07 +0300 1663) .
868b2b66 (kx 2024-12-20 16:11:07 +0300 1664)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1665) Parameters : EMUSHORT *eiy; - указатель на
868b2b66 (kx 2024-12-20 16:11:07 +0300 1666) internal e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300 1667) data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300 1668) TARGET;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1669) EMUSHORT *eix; - указатель на
868b2b66 (kx 2024-12-20 16:11:07 +0300 1670) internal e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300 1671) data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300 1672) SOURCE;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1673) int nb; - количество бит в
868b2b66 (kx 2024-12-20 16:11:07 +0300 1674) external e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300 1675) data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300 1676)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1677) Return : [void]
868b2b66 (kx 2024-12-20 16:11:07 +0300 1678)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1679) ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1680) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 1681) EMUSHORT *z = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 1682) *s = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 1683) *t = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 1684) *c = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 1685) *x = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 1686) *tx = NULL, /* temp */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1687) *tr = NULL, /* temp */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1688) *half = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 1689) *one = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 1690) *negone = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 1691) *two = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 1692) *zero = NULL;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1693) static
868b2b66 (kx 2024-12-20 16:11:07 +0300 1694) EMUSHORT *k = NULL, /* for Exponent */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1695) *tk = NULL; /* temp */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1696) EMUSHORT *ln2hi, *ln2lo, *sqrt2, *small;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1697) int np, ne;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1698)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1699)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1700) if( nb < NBR_32 || nb > MPU_MATH_FN_LIMIT )
868b2b66 (kx 2024-12-20 16:11:07 +0300 1701) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 1702) /* error: Invalid size of operand(s) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1703) __real_invalid_size( (__mpu_char8_t *)"log1p" );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1704) ei_ind( eiy, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1705) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1706) }
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) Hight Precision for r32, r64.
868b2b66 (kx 2024-12-20 16:11:07 +0300 1710) *******************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1711) if( nb < NBR_128 ) nb = NBR_128;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1712)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1713) np = internal_np( nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1714) ne = internal_ne( nb ) + 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1715)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1716) /*** Allocate memory for x, zero . **************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1717) x = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1718) if( !x )
868b2b66 (kx 2024-12-20 16:11:07 +0300 1719) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 1720) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1721) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1722) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 1723)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1724) zero = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1725) if( !zero )
868b2b66 (kx 2024-12-20 16:11:07 +0300 1726) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 1727) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1728)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1729) /* FREE zero **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1730) __mpu_sbrk( -(int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1731) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1732)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1733) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1734) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 1735) /************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1736)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1737)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1738) _gen_zero( zero, nb ); /* Befor test +/-inf */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1739)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1740) ei_copy( x, eix, nb );
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) /***************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 1744) Test for EIX.
868b2b66 (kx 2024-12-20 16:11:07 +0300 1745) ***************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1746) /* LOG1P(InD) must by InD */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1747) if( ei_isind( eix, nb ) )
868b2b66 (kx 2024-12-20 16:11:07 +0300 1748) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 1749) /* "argument domain error" */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1750) /* return: InD */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1751) ei_copy( eiy, eix, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1752) /***************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 1753) NOTE:
868b2b66 (kx 2024-12-20 16:11:07 +0300 1754) Функция _mtherr() является переходником между
868b2b66 (kx 2024-12-20 16:11:07 +0300 1755) внутренним форматом и внешней,
868b2b66 (kx 2024-12-20 16:11:07 +0300 1756) переопределяемой пользователем, функцией
868b2b66 (kx 2024-12-20 16:11:07 +0300 1757) _math_error(). Кроме основных действий она
868b2b66 (kx 2024-12-20 16:11:07 +0300 1758) выставляет системную переменную errno
868b2b66 (kx 2024-12-20 16:11:07 +0300 1759) следующим образом.
868b2b66 (kx 2024-12-20 16:11:07 +0300 1760)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1761) errno = __mpu_math_errnotab[type];
868b2b66 (kx 2024-12-20 16:11:07 +0300 1762) ***************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1763) _mtherr( eiy, (__mpu_char8_t *)"log1p", __DOMAIN__,
868b2b66 (kx 2024-12-20 16:11:07 +0300 1764) eiy, x, (EMUSHORT *)0, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1765) __STDOM; /*Set REAL InD - produsing Domain Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1766)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1767) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1768) /* FREE zero **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1769) __mpu_sbrk( -(int)(2*np*SIZE_OF_EMUSHORT) );
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) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1773) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 1774) /* LOG1P(NaN) must by NaN */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1775) if( ei_isnans( eix, nb ) )
868b2b66 (kx 2024-12-20 16:11:07 +0300 1776) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 1777) /* "argument domain error" */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1778) /* return: NaN */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1779) ei_copy( eiy, eix, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1780) /***************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 1781) NOTE:
868b2b66 (kx 2024-12-20 16:11:07 +0300 1782) Функция _mtherr() является переходником между
868b2b66 (kx 2024-12-20 16:11:07 +0300 1783) внутренним форматом и внешней,
868b2b66 (kx 2024-12-20 16:11:07 +0300 1784) переопределяемой пользователем, функцией
868b2b66 (kx 2024-12-20 16:11:07 +0300 1785) _math_error(). Кроме основных действий она
868b2b66 (kx 2024-12-20 16:11:07 +0300 1786) выставляет системную переменную errno
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) errno = __mpu_math_errnotab[type];
868b2b66 (kx 2024-12-20 16:11:07 +0300 1790) ***************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1791) _mtherr( eiy, (__mpu_char8_t *)"log1p", __DOMAIN__,
868b2b66 (kx 2024-12-20 16:11:07 +0300 1792) eiy, x, (EMUSHORT *)0, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1793) __STDOM; /* Set REAL NaN - produsing Domain Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1794)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1795) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1796) /* FREE zero **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1797) __mpu_sbrk( -(int)(2*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1798) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1799)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1800) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1801) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 1802)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1803) /*
868b2b66 (kx 2024-12-20 16:11:07 +0300 1804) LOG1P(+Infinity) must by Infinity;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1805) LOG1P(-Infinity) must by InD;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1806) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1807) if( ei_isinfin( eix, nb ) )
868b2b66 (kx 2024-12-20 16:11:07 +0300 1808) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 1809) if( ei_cmp( eix, zero, nb ) < 0 ) /* ( EIX < 0 ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1810) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 1811) /* "argument domain error" */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1812) /* return: InD */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1813) ei_ind( eiy, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1814) /***************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 1815) NOTE:
868b2b66 (kx 2024-12-20 16:11:07 +0300 1816) Функция _mtherr() является переходником между
868b2b66 (kx 2024-12-20 16:11:07 +0300 1817) внутренним форматом и внешней,
868b2b66 (kx 2024-12-20 16:11:07 +0300 1818) переопределяемой пользователем, функцией
868b2b66 (kx 2024-12-20 16:11:07 +0300 1819) _math_error(). Кроме основных действий она
868b2b66 (kx 2024-12-20 16:11:07 +0300 1820) выставляет системную переменную errno
868b2b66 (kx 2024-12-20 16:11:07 +0300 1821) следующим образом.
868b2b66 (kx 2024-12-20 16:11:07 +0300 1822)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1823) errno = __mpu_math_errnotab[type];
868b2b66 (kx 2024-12-20 16:11:07 +0300 1824) ***************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1825) _mtherr( eiy, (__mpu_char8_t *)"log1p", __DOMAIN__,
868b2b66 (kx 2024-12-20 16:11:07 +0300 1826) eiy, x, (EMUSHORT *)0, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1827) __STDOM; /* Set REAL -Infinity - produsing Domain Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1828) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 1829) else
868b2b66 (kx 2024-12-20 16:11:07 +0300 1830) ei_copy( eiy, eix, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1831)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1832)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1833) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1834) /* FREE zero **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1835) __mpu_sbrk( -(int)(2*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1836) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1837)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1838) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1839) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 1840)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1841)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1842) /*** Allocate memory for z, s, t, c, tx, tr . ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1843) z = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1844) if( !z )
868b2b66 (kx 2024-12-20 16:11:07 +0300 1845) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 1846) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1847)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1848) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1849) /* FREE zero **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1850) __mpu_sbrk( -(int)(2*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1851) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1852)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1853) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1854) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 1855)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1856) s = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1857) if( !s )
868b2b66 (kx 2024-12-20 16:11:07 +0300 1858) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 1859) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1860)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1861) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1862) /* FREE zero **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1863) /* FREE z *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1864) __mpu_sbrk( -(int)(3*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1865) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1866)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1867) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1868) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 1869)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1870) t = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1871) if( !t )
868b2b66 (kx 2024-12-20 16:11:07 +0300 1872) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 1873) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1874)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1875) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1876) /* FREE zero **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1877) /* FREE z *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1878) /* FREE s *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1879) __mpu_sbrk( -(int)(4*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1880) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1881)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1882) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1883) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 1884)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1885) c = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1886) if( !c )
868b2b66 (kx 2024-12-20 16:11:07 +0300 1887) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 1888) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1889)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1890) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1891) /* FREE zero **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1892) /* FREE z *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1893) /* FREE s *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1894) /* FREE t *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1895) __mpu_sbrk( -(int)(5*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1896) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1897)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1898) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1899) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 1900)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1901) tx = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1902) if( !tx )
868b2b66 (kx 2024-12-20 16:11:07 +0300 1903) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 1904) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1905)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1906) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1907) /* FREE zero **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1908) /* FREE z *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1909) /* FREE s *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1910) /* FREE t *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1911) /* FREE c *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1912) __mpu_sbrk( -(int)(6*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1913) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1914)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1915) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1916) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 1917)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1918) tr = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1919) if( !tr )
868b2b66 (kx 2024-12-20 16:11:07 +0300 1920) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 1921) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1922)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1923) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1924) /* FREE zero **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1925) /* FREE z *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1926) /* FREE s *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1927) /* FREE t *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1928) /* FREE c *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1929) /* FREE tx ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1930) __mpu_sbrk( -(int)(7*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1931) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1932)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1933) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1934) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 1935) /************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1936)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1937) /*** Allocate memory for half, one, negone, two . ***********/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1938) half = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1939) if( !half )
868b2b66 (kx 2024-12-20 16:11:07 +0300 1940) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 1941) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1942)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1943) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1944) /* FREE zero **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1945) /* FREE z *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1946) /* FREE s *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1947) /* FREE t *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1948) /* FREE c *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1949) /* FREE tx ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1950) /* FREE tr ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1951) __mpu_sbrk( -(int)(8*np*SIZE_OF_EMUSHORT) );
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) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1955) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 1956)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1957) one = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1958) if( !one )
868b2b66 (kx 2024-12-20 16:11:07 +0300 1959) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 1960) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1961)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1962) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1963) /* FREE zero **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1964) /* FREE z *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1965) /* FREE s *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1966) /* FREE t *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1967) /* FREE c *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1968) /* FREE tx ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1969) /* FREE tr ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1970) /* FREE half **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1971) __mpu_sbrk( -(int)(9*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1972) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1973)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1974) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1975) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 1976)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1977) negone = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1978) if( !negone )
868b2b66 (kx 2024-12-20 16:11:07 +0300 1979) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 1980) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1981)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1982) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1983) /* FREE zero **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1984) /* FREE z *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1985) /* FREE s *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1986) /* FREE t *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1987) /* FREE c *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1988) /* FREE tx ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1989) /* FREE tr ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1990) /* FREE half **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1991) /* FREE one ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1992) __mpu_sbrk( -(int)(10*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1993) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1994)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1995) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1996) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 1997)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1998) two = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1999) if( !two )
868b2b66 (kx 2024-12-20 16:11:07 +0300 2000) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 2001) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2002)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2003) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2004) /* FREE zero **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2005) /* FREE z *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2006) /* FREE s *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2007) /* FREE t *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2008) /* FREE c *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2009) /* FREE tx ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2010) /* FREE tr ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2011) /* FREE half **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2012) /* FREE one ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2013) /* FREE negone ************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2014) __mpu_sbrk( -(int)(11*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 2015) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2016)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2017) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2018) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 2019) /************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2020)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2021) /*** Allocate memory for k, tk . ****************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2022) k = (EMUSHORT *)__mpu_sbrk( (int)(ne*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 2023) if( !k )
868b2b66 (kx 2024-12-20 16:11:07 +0300 2024) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 2025) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2026)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2027) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2028) /* FREE zero **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2029) /* FREE z *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2030) /* FREE s *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2031) /* FREE t *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2032) /* FREE c *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2033) /* FREE tx ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2034) /* FREE tr ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2035) /* FREE half **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2036) /* FREE one ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2037) /* FREE negone ************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2038) /* FREE two ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2039) __mpu_sbrk( -(int)(12*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 2040) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2041)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2042) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2043) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 2044)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2045) tk = (EMUSHORT *)__mpu_sbrk( (int)(ne*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 2046) if( !tk )
868b2b66 (kx 2024-12-20 16:11:07 +0300 2047) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 2048) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2049)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2050) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2051) /* FREE zero **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2052) /* FREE z *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2053) /* FREE s *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2054) /* FREE t *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2055) /* FREE c *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2056) /* FREE tx ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2057) /* FREE tr ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2058) /* FREE half **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2059) /* FREE one ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2060) /* FREE negone ************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2061) /* FREE two ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2062) __mpu_sbrk( -(int)(12*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 2063) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2064)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2065) /* FREE k *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2066) __mpu_sbrk( -(int)(ne*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 2067) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2068)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2069) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2070) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 2071) /************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2072)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2073) _gen_half( half, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 2074) _gen_one ( one, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 2075) _gen_one ( negone, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 2076) ei_neg ( negone, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 2077) _gen_two ( two, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 2078)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2079) ln2hi = _get_m_ln2hi_ptr( nb ); /* Service Constant */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2080) ln2lo = _get_m_ln2lo_ptr( nb ); /* Service Constant */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2081) sqrt2 = _get_m_sqrt2_ptr( nb ); /* Math Constant */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2082) small = _get_epsilon_ptr( nb ); /* See: FLOATP.H */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2083)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2084)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2085) if( ei_cmp( x, negone, nb ) > 0 ) /* ( x > -1.0 ) */
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) Argument reduction
868b2b66 (kx 2024-12-20 16:11:07 +0300 2089) ********************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2090) ei_copysign( tx, x, one, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 2091) if( ei_cmp( tx, small, nb ) < 0 ) /* if( x < small ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2092) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 2093) ei_copy( eiy, x, nb ); /* return( x ); */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2094)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2095) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2096) /* FREE zero **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2097) /* FREE z *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2098) /* FREE s *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2099) /* FREE t *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2100) /* FREE c *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2101) /* FREE tx ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2102) /* FREE tr ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2103) /* FREE half **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2104) /* FREE one ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2105) /* FREE negone ************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2106) /* FREE two ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2107) __mpu_sbrk( -(int)(12*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 2108) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2109)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2110) /* FREE k *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2111) /* FREE tk ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2112) __mpu_sbrk( -(int)(2*ne*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 2113) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2114)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2115) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2116) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 2117)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2118) ei_add( tx, one, x, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 2119) ei_logb( k, tx, ne, nb ); /* k=logb(1+x); */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2120)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2121) ei_nege( tk, k, ne );
868b2b66 (kx 2024-12-20 16:11:07 +0300 2122) ei_ldexp( z, tk, x, ne, nb ); /* z=ldexp( x,-k); */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2123) ei_ldexp( t, tk, one, ne, nb ); /* t=ldexp(one,-k); */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2124)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2125) ei_add( tx, z, t, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 2126) if( ei_cmp( tx, sqrt2, nb ) >= 0 ) /* if( z+t >= sqrt2 ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2127) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 2128) ei_ince( k, k, ne ); /* k += 1; */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2129) ei_mul( z, z, half, nb ); /* z *= half; */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2130) ei_mul( t, t, half, nb ); /* t *= half; */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2131) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 2132) ei_add( t, t, negone, nb ); /* t += negone; */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2133) ei_add( x, z, t, nb ); /* x = z + t; */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2134)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2135) ei_sub( tx, t, x, nb ); /* Correction term for x */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2136) ei_add( c, tx, z, nb ); /* c = (t-x) + z; */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2137)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2138) /******************
868b2b66 (kx 2024-12-20 16:11:07 +0300 2139) Compute log(1+x)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2140) ******************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2141) ei_add( tx, two, x, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 2142) ei_div( s, x, tx, nb ); /* s = x/(2+x); */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2143) ei_mul( tx, x, x, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 2144) ei_mul( t, tx, half, nb ); /* t = x*x*half; */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2145)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2146) ei_ltor( tr, k, nb, ne );
868b2b66 (kx 2024-12-20 16:11:07 +0300 2147) ei_mul( tr, tr, ln2lo, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 2148) ei_mul( tx, c, x, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 2149) ei_sub( tr, tr, tx, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 2150) ei_add( c, c, tr, nb ); /* c += (k*ln2lo-c*x); */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2151)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2152) ei_mul( tr, s, s, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 2153) ei_log__L( tx, tr, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 2154) ei_add( tx, t, tx, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 2155) ei_mul( tr, s, tx, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 2156) ei_add( z, c, tr, nb ); /* z = c+s*(t+log_L(s*s)); */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2157)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2158) ei_sub( tx, z, t, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 2159) ei_add( x, x, tx, nb ); /* x += (z - t); */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2160)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2161) ei_ltor( tr, k, nb, ne );
868b2b66 (kx 2024-12-20 16:11:07 +0300 2162) ei_mul( tr, tr, ln2hi, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 2163) ei_add( eiy, tr, x, nb ); /* return( k*ln2hi+x ); */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2164)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2165) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2166) /* FREE zero **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2167) /* FREE z *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2168) /* FREE s *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2169) /* FREE t *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2170) /* FREE c *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2171) /* FREE tx ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2172) /* FREE tr ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2173) /* FREE half **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2174) /* FREE one ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2175) /* FREE negone ************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2176) /* FREE two ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2177) __mpu_sbrk( -(int)(12*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 2178) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2179)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2180) /* FREE k *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2181) /* FREE tk ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2182) __mpu_sbrk( -(int)(2*ne*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 2183) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2184)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2185) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2186)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2187) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 2188) else /* т.е. ( x <= -1.0 ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2189) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 2190) if( ei_cmp( x, negone, nb ) == 0 ) /* ( x == -1.0 ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2191) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 2192) /* x == -1, return -Infinity with signal */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2193) /* "argument domain error" */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2194) /* return: -Infinity */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2195) ei_infin( eiy, (unsigned)1, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 2196) /***************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 2197) NOTE:
868b2b66 (kx 2024-12-20 16:11:07 +0300 2198) Функция _mtherr() является переходником между
868b2b66 (kx 2024-12-20 16:11:07 +0300 2199) внутренним форматом и внешней,
868b2b66 (kx 2024-12-20 16:11:07 +0300 2200) переопределяемой пользователем, функцией
868b2b66 (kx 2024-12-20 16:11:07 +0300 2201) _math_error(). Кроме основных действий она
868b2b66 (kx 2024-12-20 16:11:07 +0300 2202) выставляет системную переменную errno
868b2b66 (kx 2024-12-20 16:11:07 +0300 2203) следующим образом.
868b2b66 (kx 2024-12-20 16:11:07 +0300 2204)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2205) errno = __mpu_math_errnotab[type];
868b2b66 (kx 2024-12-20 16:11:07 +0300 2206) ***************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2207) _mtherr( eiy, (__mpu_char8_t *)"log1p", __DOMAIN__,
868b2b66 (kx 2024-12-20 16:11:07 +0300 2208) eiy, x, (EMUSHORT *)0, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 2209) __STDOM; /* ( x == -1 ) - produsing Domain Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2210)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2211) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2212) /* FREE zero **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2213) /* FREE z *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2214) /* FREE s *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2215) /* FREE t *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2216) /* FREE c *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2217) /* FREE tx ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2218) /* FREE tr ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2219) /* FREE half **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2220) /* FREE one ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2221) /* FREE negone ************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2222) /* FREE two ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2223) __mpu_sbrk( -(int)(12*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 2224) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2225)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2226) /* FREE k *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2227) /* FREE tk ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2228) __mpu_sbrk( -(int)(2*ne*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 2229) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2230)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2231) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2232) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 2233) else
868b2b66 (kx 2024-12-20 16:11:07 +0300 2234) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 2235) /* x < -1, return -InD with signal */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2236) /* "argument domain error" */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2237) /* return: InD */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2238) ei_ind( eiy, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 2239) /***************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 2240) NOTE:
868b2b66 (kx 2024-12-20 16:11:07 +0300 2241) Функция _mtherr() является переходником между
868b2b66 (kx 2024-12-20 16:11:07 +0300 2242) внутренним форматом и внешней,
868b2b66 (kx 2024-12-20 16:11:07 +0300 2243) переопределяемой пользователем, функцией
868b2b66 (kx 2024-12-20 16:11:07 +0300 2244) _math_error(). Кроме основных действий она
868b2b66 (kx 2024-12-20 16:11:07 +0300 2245) выставляет системную переменную errno
868b2b66 (kx 2024-12-20 16:11:07 +0300 2246) следующим образом.
868b2b66 (kx 2024-12-20 16:11:07 +0300 2247)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2248) errno = __mpu_math_errnotab[type];
868b2b66 (kx 2024-12-20 16:11:07 +0300 2249) ***************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2250) _mtherr( eiy, (__mpu_char8_t *)"log1p", __DOMAIN__,
868b2b66 (kx 2024-12-20 16:11:07 +0300 2251) eiy, x, (EMUSHORT *)0, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 2252) __STDOM; /* ( x < -1 ) - produsing Domain Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2253)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2254) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2255) /* FREE zero **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2256) /* FREE z *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2257) /* FREE s *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2258) /* FREE t *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2259) /* FREE c *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2260) /* FREE tx ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2261) /* FREE tr ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2262) /* FREE half **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2263) /* FREE one ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2264) /* FREE negone ************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2265) /* FREE two ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2266) __mpu_sbrk( -(int)(12*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 2267) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2268)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2269) /* FREE k *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2270) /* FREE tk ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2271) __mpu_sbrk( -(int)(2*ne*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 2272) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2273)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2274) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2275) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 2276)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2277) } /* End if( x > -1.0 ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2278)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2279) } /* End of ei_log1p() */
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) void ei_log( EMUSHORT *eiy, EMUSHORT *eix, int nb )
868b2b66 (kx 2024-12-20 16:11:07 +0300 2283) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 2284)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2285) Description : ei_log() Работает с
868b2b66 (kx 2024-12-20 16:11:07 +0300 2286) internal e-type data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300 2287)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2288) Concepts : Return in EIY the LOGARITHM of ( EIX ).
868b2b66 (kx 2024-12-20 16:11:07 +0300 2289)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2290) METHOD : * This code was derived, with minor
868b2b66 (kx 2024-12-20 16:11:07 +0300 2291) * modification, from:
868b2b66 (kx 2024-12-20 16:11:07 +0300 2292) * Teter Tang, "Table-Driven Implementation
868b2b66 (kx 2024-12-20 16:11:07 +0300 2293) * of the Logarithm in IEEE Floating-Point
868b2b66 (kx 2024-12-20 16:11:07 +0300 2294) * arithmetic." ACM Trans. Math Software,
868b2b66 (kx 2024-12-20 16:11:07 +0300 2295) * vol 16. no 4, pp 378-400, Dec 1990).
868b2b66 (kx 2024-12-20 16:11:07 +0300 2296)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2297) Calculates log(2^m*F*(1+f/F)), |f/j| <= 1/256,
868b2b66 (kx 2024-12-20 16:11:07 +0300 2298) where F = j/128 for j an integer in [0, 128].
868b2b66 (kx 2024-12-20 16:11:07 +0300 2299)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2300) log(2^m) = log2_hi*m + log2_tail*m
868b2b66 (kx 2024-12-20 16:11:07 +0300 2301) since m is an integer, the dominant term
868b2b66 (kx 2024-12-20 16:11:07 +0300 2302) is exact. m has at most
868b2b66 (kx 2024-12-20 16:11:07 +0300 2303) nE*HOST_BITS_PER_EMUSHORT digits
868b2b66 (kx 2024-12-20 16:11:07 +0300 2304) (for subnormal numbers), and log2_hi has
868b2b66 (kx 2024-12-20 16:11:07 +0300 2305) nE*HOST_BITS_PER_EMUSHORT + 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 2306) trailing zero bits.
868b2b66 (kx 2024-12-20 16:11:07 +0300 2307)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2308) log(F) = logF_hi[j] + logF_lo[j]
868b2b66 (kx 2024-12-20 16:11:07 +0300 2309) is in tabular form in log_table[]
868b2b66 (kx 2024-12-20 16:11:07 +0300 2310) logF_hi[] + 512 is exact.
868b2b66 (kx 2024-12-20 16:11:07 +0300 2311)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2312) log(1+f/F) =
868b2b66 (kx 2024-12-20 16:11:07 +0300 2313) 2*f/(2*F + f) + 1/12 * (2*f/(2*F + f))**3 + ...
868b2b66 (kx 2024-12-20 16:11:07 +0300 2314) the leading term is calculated to extra
868b2b66 (kx 2024-12-20 16:11:07 +0300 2315) precision in two parts, the larger of which
868b2b66 (kx 2024-12-20 16:11:07 +0300 2316) adds exactly to the dominant m and F terms.
868b2b66 (kx 2024-12-20 16:11:07 +0300 2317)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2318) There are two cases:
868b2b66 (kx 2024-12-20 16:11:07 +0300 2319) 1. when m, j are non-zero (m | j), use
868b2b66 (kx 2024-12-20 16:11:07 +0300 2320) absolute precision for the leading term.
868b2b66 (kx 2024-12-20 16:11:07 +0300 2321) 2. when m = j = 0, |1-x| < 1/256,
868b2b66 (kx 2024-12-20 16:11:07 +0300 2322) and log(x) ~= (x-1).
868b2b66 (kx 2024-12-20 16:11:07 +0300 2323) In this case, use a relative precision
868b2b66 (kx 2024-12-20 16:11:07 +0300 2324) of [after __ei_TRUNC()] bits.
868b2b66 (kx 2024-12-20 16:11:07 +0300 2325)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2326) (This is done differently in the original
868b2b66 (kx 2024-12-20 16:11:07 +0300 2327) paper).
868b2b66 (kx 2024-12-20 16:11:07 +0300 2328)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2329) Table of log(Fj) = logF_head[j] + logF_tail[j],
868b2b66 (kx 2024-12-20 16:11:07 +0300 2330) for Fj = 1+j/128. Used for generation of
868b2b66 (kx 2024-12-20 16:11:07 +0300 2331) extend precision logarithms.
868b2b66 (kx 2024-12-20 16:11:07 +0300 2332) Values for log(F) were generated using
868b2b66 (kx 2024-12-20 16:11:07 +0300 2333) ei_log1p() function.
868b2b66 (kx 2024-12-20 16:11:07 +0300 2334)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2335) EI_LOG__N() : Построение ряда:
868b2b66 (kx 2024-12-20 16:11:07 +0300 2336) =====================================================================
868b2b66 (kx 2024-12-20 16:11:07 +0300 2337) log(1+f/F) = 2*f/(2*F+f) + 1/12 * (2*f/(2*F+f))**3 + ...
868b2b66 (kx 2024-12-20 16:11:07 +0300 2338)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2339) q = f/F;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2340) s = q/(2+q) = (f/F)/(2+f/F) = f/(2F+f);
868b2b66 (kx 2024-12-20 16:11:07 +0300 2341)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2342) тогда
868b2b66 (kx 2024-12-20 16:11:07 +0300 2343) log(1+f/F) = 2s + (2/3)s^3 + (2/5)s^5 + ... =
868b2b66 (kx 2024-12-20 16:11:07 +0300 2344)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2345) / f \ 2 / f \ ^3 2 / f \ ^5
868b2b66 (kx 2024-12-20 16:11:07 +0300 2346) = 2*| ---- | + ---*| ---- | + ---*| ---- | + ... =
868b2b66 (kx 2024-12-20 16:11:07 +0300 2347) \2F+f/ 3 \2F+f/ 5 \2F+f/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2348)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2349) / f \ 2*2^2 / f \ ^3 2*2^4 / f \ ^5
868b2b66 (kx 2024-12-20 16:11:07 +0300 2350) = 2*| ---- | + -----*| ---- | + -----*| ---- | + ... =
868b2b66 (kx 2024-12-20 16:11:07 +0300 2351) \2F+f/ 3*2^2 \2F+f/ 5*2^4 \2F+f/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2352)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2353) / 2f \ 1 / 2f \ ^3 1 / 2f \ ^5
868b2b66 (kx 2024-12-20 16:11:07 +0300 2354) = | ---- | + -----*| ---- | + -----*| ---- | + ... .
868b2b66 (kx 2024-12-20 16:11:07 +0300 2355) \2F+f/ 3*2^2 \2F+f/ 5*2^4 \2F+f/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2356)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2357)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2358) 1 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 2359) ei_log__N(x) = -----*x^3 + -----*x^5 + ... .
868b2b66 (kx 2024-12-20 16:11:07 +0300 2360) 3*2^2 5*2^4
868b2b66 (kx 2024-12-20 16:11:07 +0300 2361)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2362) Общая формула получения коэффициентов для APPROX():
868b2b66 (kx 2024-12-20 16:11:07 +0300 2363)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2364) k = 1/(s*2^(s-1)), где s = 3, 5, 7, 9, 11, ... .
868b2b66 (kx 2024-12-20 16:11:07 +0300 2365)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2366) Интервал для APPROX(): [0.0, 1/256].
868b2b66 (kx 2024-12-20 16:11:07 +0300 2367) =====================================================================
868b2b66 (kx 2024-12-20 16:11:07 +0300 2368)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2369) ACCURACY : In the absence of rounding error,
868b2b66 (kx 2024-12-20 16:11:07 +0300 2370) the appriximation has absolute error
868b2b66 (kx 2024-12-20 16:11:07 +0300 2371) less than EPSILON [see: FLOATP.H].
868b2b66 (kx 2024-12-20 16:11:07 +0300 2372)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2373) NOTE : log2_hi = logF_head[n_log_table];
868b2b66 (kx 2024-12-20 16:11:07 +0300 2374) log2_lo = logF_tail[n_log_table];
868b2b66 (kx 2024-12-20 16:11:07 +0300 2375) Not use the service constants ln2hi, ln2lo.
868b2b66 (kx 2024-12-20 16:11:07 +0300 2376)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2377) SPECIAL CASES : log(x) = -InD с выставлением DOMAIN flag
868b2b66 (kx 2024-12-20 16:11:07 +0300 2378) [если( x < 0 )];
868b2b66 (kx 2024-12-20 16:11:07 +0300 2379) log(+NaN) = +NaN с выставлением DOMAIN flag;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2380) log(-NaN) = -NaN с выставлением DOMAIN flag;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2381) log(-inf) = -InD с выставлением DOMAIN flag;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2382) log( 0 ) = -inf с выставлением DOMAIN flag;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2383) log(+inf) = +inf [норма];
868b2b66 (kx 2024-12-20 16:11:07 +0300 2384) log(1) = 0 [норма];
868b2b66 (kx 2024-12-20 16:11:07 +0300 2385)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2386) Use Global Variable:
868b2b66 (kx 2024-12-20 16:11:07 +0300 2387)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2388) Use Functions : ei_log__N( eiy, eix, nb ); | st-ln.c
868b2b66 (kx 2024-12-20 16:11:07 +0300 2389) ei_copy( eiy, eix, nb ); | mpu-real.c
868b2b66 (kx 2024-12-20 16:11:07 +0300 2390) .
868b2b66 (kx 2024-12-20 16:11:07 +0300 2391) .
868b2b66 (kx 2024-12-20 16:11:07 +0300 2392) .
868b2b66 (kx 2024-12-20 16:11:07 +0300 2393)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2394) Parameters : EMUSHORT *eiy; - указатель на
868b2b66 (kx 2024-12-20 16:11:07 +0300 2395) internal e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300 2396) data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300 2397) TARGET;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2398) EMUSHORT *eix; - указатель на
868b2b66 (kx 2024-12-20 16:11:07 +0300 2399) internal e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300 2400) data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300 2401) SOURCE;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2402) int nb; - количество бит в
868b2b66 (kx 2024-12-20 16:11:07 +0300 2403) external e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300 2404) data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300 2405)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2406) Return : [void]
868b2b66 (kx 2024-12-20 16:11:07 +0300 2407)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2408) ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2409) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 2410) EMUSHORT *x = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 2411) *F = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 2412) *f = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 2413) *g = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 2414) *q = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 2415) *u = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 2416) *u1 = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 2417) *u2 = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 2418) *v = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 2419) *zero = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 2420) *one = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 2421) *half = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 2422) *two = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 2423) *tx = NULL, /* temp */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2424) *tm = NULL, /* temp */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2425) *tr = NULL; /* temp */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2426)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2427) EMUSHORT *log2_hi = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 2428) *log2_lo = NULL;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2429)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2430) EMUSHORT *m = NULL, /* for Exponent */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2431) *je = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 2432) *min_bin_exp = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 2433) *mt = NULL; /* temp */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2434) EMUSHORT *p, *logF_head, *logF_tail;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2435) __mpu_int32_t j;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2436) int np, ne, i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2437) int n_log_table;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2438)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2439)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2440) if( nb < NBR_32 || nb > MPU_MATH_FN_LIMIT )
868b2b66 (kx 2024-12-20 16:11:07 +0300 2441) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 2442) /* error: Invalid size of operand(s) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2443) __real_invalid_size( (__mpu_char8_t *)"log" );
868b2b66 (kx 2024-12-20 16:11:07 +0300 2444) /* ei_ind( eiy, nb ); */ /* Invalid NB */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2445) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2446) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 2447)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2448) /*******************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 2449) Hight Precision for r32, r64.
868b2b66 (kx 2024-12-20 16:11:07 +0300 2450) *******************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2451) if( nb < NBR_128 ) nb = NBR_128;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2452)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2453) np = internal_np( nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 2454) ne = internal_ne( nb ) + 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2455)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2456) /*** Allocate memory for x, y . *****************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2457) x = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 2458) if( !x )
868b2b66 (kx 2024-12-20 16:11:07 +0300 2459) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 2460) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2461) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2462) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 2463)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2464) zero = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 2465) if( !zero )
868b2b66 (kx 2024-12-20 16:11:07 +0300 2466) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 2467) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2468)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2469) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2470) __mpu_sbrk( -(int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 2471) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2472) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2473) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 2474) /************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2475)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2476)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2477) _gen_zero( zero, nb ); /* Befor test +/-inf */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2478)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2479) ei_copy( x, eix, nb ); /* temp for _mtherr() */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2480)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2481) /***************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 2482) Test for EIX.
868b2b66 (kx 2024-12-20 16:11:07 +0300 2483) ***************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2484) /* LOG(InD) must by InD */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2485) if( ei_isind( eix, nb ) )
868b2b66 (kx 2024-12-20 16:11:07 +0300 2486) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 2487) /* "argument domain error" */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2488) /* return: InD */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2489) ei_copy( eiy, eix, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 2490) /***************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 2491) NOTE:
868b2b66 (kx 2024-12-20 16:11:07 +0300 2492) Функция _mtherr() является переходником между
868b2b66 (kx 2024-12-20 16:11:07 +0300 2493) внутренним форматом и внешней,
868b2b66 (kx 2024-12-20 16:11:07 +0300 2494) переопределяемой пользователем, функцией
868b2b66 (kx 2024-12-20 16:11:07 +0300 2495) _math_error(). Кроме основных действий она
868b2b66 (kx 2024-12-20 16:11:07 +0300 2496) выставляет системную переменную errno
868b2b66 (kx 2024-12-20 16:11:07 +0300 2497) следующим образом.
868b2b66 (kx 2024-12-20 16:11:07 +0300 2498)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2499) errno = __mpu_math_errnotab[type];
868b2b66 (kx 2024-12-20 16:11:07 +0300 2500) ***************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2501) _mtherr( eiy, (__mpu_char8_t *)"log", __DOMAIN__,
868b2b66 (kx 2024-12-20 16:11:07 +0300 2502) eiy, x, (EMUSHORT *)0, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 2503) __STDOM; /* Set REAL InD - produsing Domain Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2504)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2505) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2506) /* FREE zero **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2507) __mpu_sbrk( -(int)(2*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 2508) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2509)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2510) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2511) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 2512) /* LOG(NaN) must by NaN */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2513) if( ei_isnans( eix, nb ) )
868b2b66 (kx 2024-12-20 16:11:07 +0300 2514) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 2515) /* "argument domain error" */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2516) /* return: NaN */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2517) ei_copy( eiy, eix, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 2518) /***************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 2519) NOTE:
868b2b66 (kx 2024-12-20 16:11:07 +0300 2520) Функция _mtherr() является переходником между
868b2b66 (kx 2024-12-20 16:11:07 +0300 2521) внутренним форматом и внешней,
868b2b66 (kx 2024-12-20 16:11:07 +0300 2522) переопределяемой пользователем, функцией
868b2b66 (kx 2024-12-20 16:11:07 +0300 2523) _math_error(). Кроме основных действий она
868b2b66 (kx 2024-12-20 16:11:07 +0300 2524) выставляет системную переменную errno
868b2b66 (kx 2024-12-20 16:11:07 +0300 2525) следующим образом.
868b2b66 (kx 2024-12-20 16:11:07 +0300 2526)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2527) errno = __mpu_math_errnotab[type];
868b2b66 (kx 2024-12-20 16:11:07 +0300 2528) ***************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2529) _mtherr( eiy, (__mpu_char8_t *)"log", __DOMAIN__,
868b2b66 (kx 2024-12-20 16:11:07 +0300 2530) eiy, x, (EMUSHORT *)0, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 2531) __STDOM; /* Set REAL NaN - produsing Domain Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2532)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2533) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2534) /* FREE zero **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2535) __mpu_sbrk( -(int)(2*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 2536) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2537)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2538) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2539) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 2540)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2541) /*
868b2b66 (kx 2024-12-20 16:11:07 +0300 2542) LOG(+Infinity) must by Infinity;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2543) LOG(-Infinity) must by InD;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2544) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2545) if( ei_isinfin( eix, nb ) )
868b2b66 (kx 2024-12-20 16:11:07 +0300 2546) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 2547) if( ei_cmp( eix, zero, nb ) < 0 ) /* ( EIX < 0 ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2548) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 2549) /* "argument domain error" */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2550) /* return: InD */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2551) ei_ind( eiy, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 2552) /***************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 2553) NOTE:
868b2b66 (kx 2024-12-20 16:11:07 +0300 2554) Функция _mtherr() является переходником между
868b2b66 (kx 2024-12-20 16:11:07 +0300 2555) внутренним форматом и внешней,
868b2b66 (kx 2024-12-20 16:11:07 +0300 2556) переопределяемой пользователем, функцией
868b2b66 (kx 2024-12-20 16:11:07 +0300 2557) _math_error(). Кроме основных действий она
868b2b66 (kx 2024-12-20 16:11:07 +0300 2558) выставляет системную переменную errno
868b2b66 (kx 2024-12-20 16:11:07 +0300 2559) следующим образом.
868b2b66 (kx 2024-12-20 16:11:07 +0300 2560)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2561) errno = __mpu_math_errnotab[type];
868b2b66 (kx 2024-12-20 16:11:07 +0300 2562) ***************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2563) _mtherr( eiy, (__mpu_char8_t *)"log", __DOMAIN__,
868b2b66 (kx 2024-12-20 16:11:07 +0300 2564) eiy, x, (EMUSHORT *)0, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 2565) __STDOM; /* Set REAL -Infinity - produsing Domain Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2566) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 2567) else
868b2b66 (kx 2024-12-20 16:11:07 +0300 2568) ei_copy( eiy, eix, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 2569)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2570) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2571) /* FREE zero **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2572) __mpu_sbrk( -(int)(2*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 2573) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2574)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2575) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2576) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 2577)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2578)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2579) /*** Allocate memory for F, f, g, q, u, u1, u2, v . *********/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2580) F = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 2581) if( !F )
868b2b66 (kx 2024-12-20 16:11:07 +0300 2582) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 2583) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2584)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2585) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2586) /* FREE zero **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2587) __mpu_sbrk( -(int)(2*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 2588) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2589)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2590) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2591) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 2592)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2593) f = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 2594) if( !f )
868b2b66 (kx 2024-12-20 16:11:07 +0300 2595) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 2596) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2597)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2598) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2599) /* FREE zero **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2600) /* FREE F *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2601) __mpu_sbrk( -(int)(3*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 2602) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2603)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2604) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2605) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 2606)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2607) g = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 2608) if( !g )
868b2b66 (kx 2024-12-20 16:11:07 +0300 2609) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 2610) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2611)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2612) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2613) /* FREE zero **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2614) /* FREE F *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2615) /* FREE f *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2616) __mpu_sbrk( -(int)(4*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 2617) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2618)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2619) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2620) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 2621)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2622) q = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 2623) if( !q )
868b2b66 (kx 2024-12-20 16:11:07 +0300 2624) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 2625) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2626)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2627) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2628) /* FREE zero **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2629) /* FREE F *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2630) /* FREE f *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2631) /* FREE g *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2632) __mpu_sbrk( -(int)(5*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 2633) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2634)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2635) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2636) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 2637)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2638) u = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 2639) if( !u )
868b2b66 (kx 2024-12-20 16:11:07 +0300 2640) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 2641) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2642)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2643) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2644) /* FREE zero **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2645) /* FREE F *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2646) /* FREE f *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2647) /* FREE g *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2648) /* FREE q *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2649) __mpu_sbrk( -(int)(6*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 2650) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2651)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2652) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2653) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 2654)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2655) u1 = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 2656) if( !u1 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 2657) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 2658) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2659)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2660) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2661) /* FREE zero **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2662) /* FREE F *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2663) /* FREE f *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2664) /* FREE g *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2665) /* FREE q *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2666) /* FREE u *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2667) __mpu_sbrk( -(int)(7*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 2668) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2669)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2670) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2671) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 2672)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2673) u2 = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 2674) if( !u2 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 2675) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 2676) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2677)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2678) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2679) /* FREE zero **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2680) /* FREE F *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2681) /* FREE f *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2682) /* FREE g *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2683) /* FREE q *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2684) /* FREE u *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2685) /* FREE u1 ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2686) __mpu_sbrk( -(int)(8*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 2687) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2688)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2689) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2690) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 2691)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2692) v = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 2693) if( !v )
868b2b66 (kx 2024-12-20 16:11:07 +0300 2694) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 2695) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2696)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2697) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2698) /* FREE zero **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2699) /* FREE F *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2700) /* FREE f *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2701) /* FREE g *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2702) /* FREE q *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2703) /* FREE u *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2704) /* FREE u1 ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2705) /* FREE u2 ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2706) __mpu_sbrk( -(int)(9*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 2707) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2708)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2709) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2710) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 2711) /************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2712)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2713) /*** Allocate memory for one, half, two, tx, tm, tr . *******/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2714) one = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 2715) if( !one )
868b2b66 (kx 2024-12-20 16:11:07 +0300 2716) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 2717) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2718)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2719) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2720) /* FREE zero **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2721) /* FREE F *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2722) /* FREE f *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2723) /* FREE g *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2724) /* FREE q *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2725) /* FREE u *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2726) /* FREE u1 ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2727) /* FREE u2 ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2728) /* FREE v *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2729) __mpu_sbrk( -(int)(10*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 2730) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2731)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2732) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2733) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 2734)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2735) half = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 2736) if( !half )
868b2b66 (kx 2024-12-20 16:11:07 +0300 2737) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 2738) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2739)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2740) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2741) /* FREE zero **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2742) /* FREE F *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2743) /* FREE f *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2744) /* FREE g *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2745) /* FREE q *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2746) /* FREE u *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2747) /* FREE u1 ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2748) /* FREE u2 ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2749) /* FREE v *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2750) /* FREE one ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2751) __mpu_sbrk( -(int)(11*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 2752) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2753)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2754) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2755) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 2756)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2757) two = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 2758) if( !two )
868b2b66 (kx 2024-12-20 16:11:07 +0300 2759) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 2760) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2761)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2762) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2763) /* FREE zero **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2764) /* FREE F *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2765) /* FREE f *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2766) /* FREE g *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2767) /* FREE q *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2768) /* FREE u *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2769) /* FREE u1 ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2770) /* FREE u2 ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2771) /* FREE v *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2772) /* FREE one ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2773) /* FREE half **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2774) __mpu_sbrk( -(int)(12*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 2775) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2776)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2777) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2778) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 2779)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2780) tx = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 2781) if( !tx )
868b2b66 (kx 2024-12-20 16:11:07 +0300 2782) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 2783) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2784)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2785) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2786) /* FREE zero **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2787) /* FREE F *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2788) /* FREE f *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2789) /* FREE g *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2790) /* FREE q *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2791) /* FREE u *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2792) /* FREE u1 ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2793) /* FREE u2 ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2794) /* FREE v *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2795) /* FREE one ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2796) /* FREE half **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2797) /* FREE two ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2798) __mpu_sbrk( -(int)(13*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 2799) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2800)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2801) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2802) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 2803)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2804) tm = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 2805) if( !tm )
868b2b66 (kx 2024-12-20 16:11:07 +0300 2806) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 2807) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2808)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2809) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2810) /* FREE zero **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2811) /* FREE F *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2812) /* FREE f *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2813) /* FREE g *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2814) /* FREE q *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2815) /* FREE u *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2816) /* FREE u1 ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2817) /* FREE u2 ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2818) /* FREE v *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2819) /* FREE one ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2820) /* FREE half **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2821) /* FREE two ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2822) /* FREE tx ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2823) __mpu_sbrk( -(int)(14*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 2824) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2825)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2826) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2827) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 2828)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2829) tr = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 2830) if( !tr )
868b2b66 (kx 2024-12-20 16:11:07 +0300 2831) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 2832) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2833)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2834) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2835) /* FREE zero **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2836) /* FREE F *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2837) /* FREE f *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2838) /* FREE g *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2839) /* FREE q *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2840) /* FREE u *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2841) /* FREE u1 ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2842) /* FREE u2 ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2843) /* FREE v *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2844) /* FREE one ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2845) /* FREE half **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2846) /* FREE two ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2847) /* FREE tx ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2848) /* FREE tm ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2849) __mpu_sbrk( -(int)(15*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 2850) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2851)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2852) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2853) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 2854) /************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2855)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2856) /*** Allocate memory for log2_hi, log2_lo . *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2857) log2_hi = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 2858) if( !log2_hi )
868b2b66 (kx 2024-12-20 16:11:07 +0300 2859) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 2860) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2861)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2862) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2863) /* FREE zero **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2864) /* FREE F *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2865) /* FREE f *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2866) /* FREE g *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2867) /* FREE q *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2868) /* FREE u *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2869) /* FREE u1 ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2870) /* FREE u2 ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2871) /* FREE v *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2872) /* FREE one ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2873) /* FREE half **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2874) /* FREE two ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2875) /* FREE tx ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2876) /* FREE tm ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2877) /* FREE tr ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2878) __mpu_sbrk( -(int)(16*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 2879) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2880)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2881) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2882) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 2883)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2884) log2_lo = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 2885) if( !log2_lo )
868b2b66 (kx 2024-12-20 16:11:07 +0300 2886) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 2887) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2888)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2889) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2890) /* FREE zero **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2891) /* FREE F *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2892) /* FREE f *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2893) /* FREE g *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2894) /* FREE q *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2895) /* FREE u *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2896) /* FREE u1 ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2897) /* FREE u2 ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2898) /* FREE v *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2899) /* FREE one ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2900) /* FREE half **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2901) /* FREE two ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2902) /* FREE tx ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2903) /* FREE tm ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2904) /* FREE tr ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2905) /* FREE log2_hi ***********/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2906) __mpu_sbrk( -(int)(17*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 2907) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2908)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2909) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2910) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 2911) /************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2912)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2913) /*** Allocate memory for m, je, min_bin_exp, mt . ***********/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2914) m = (EMUSHORT *)__mpu_sbrk( (int)(ne*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 2915) if( !m )
868b2b66 (kx 2024-12-20 16:11:07 +0300 2916) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 2917) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2918)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2919) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2920) /* FREE zero **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2921) /* FREE F *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2922) /* FREE f *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2923) /* FREE g *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2924) /* FREE q *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2925) /* FREE u *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2926) /* FREE u1 ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2927) /* FREE u2 ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2928) /* FREE v *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2929) /* FREE one ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2930) /* FREE half **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2931) /* FREE two ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2932) /* FREE tx ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2933) /* FREE tm ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2934) /* FREE tr ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2935) /* FREE log2_hi ***********/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2936) /* FREE log2_lo ***********/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2937) __mpu_sbrk( -(int)(18*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 2938) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2939)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2940) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2941) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 2942)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2943) je = (EMUSHORT *)__mpu_sbrk( (int)(ne*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 2944) if( !je )
868b2b66 (kx 2024-12-20 16:11:07 +0300 2945) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 2946) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2947)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2948) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2949) /* FREE zero **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2950) /* FREE F *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2951) /* FREE f *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2952) /* FREE g *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2953) /* FREE q *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2954) /* FREE u *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2955) /* FREE u1 ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2956) /* FREE u2 ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2957) /* FREE v *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2958) /* FREE one ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2959) /* FREE half **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2960) /* FREE two ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2961) /* FREE tx ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2962) /* FREE tm ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2963) /* FREE tr ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2964) /* FREE log2_hi ***********/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2965) /* FREE log2_lo ***********/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2966) __mpu_sbrk( -(int)(18*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 2967) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2968)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2969) /* FREE m *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2970) __mpu_sbrk( -(int)(ne*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 2971) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2972)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2973) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2974) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 2975)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2976) min_bin_exp = (EMUSHORT *)__mpu_sbrk( (int)(ne*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 2977) if( !min_bin_exp )
868b2b66 (kx 2024-12-20 16:11:07 +0300 2978) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 2979) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2980)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2981) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2982) /* FREE zero **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2983) /* FREE F *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2984) /* FREE f *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2985) /* FREE g *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2986) /* FREE q *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2987) /* FREE u *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2988) /* FREE u1 ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2989) /* FREE u2 ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2990) /* FREE v *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2991) /* FREE one ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2992) /* FREE half **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2993) /* FREE two ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2994) /* FREE tx ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2995) /* FREE tm ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2996) /* FREE tr ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2997) /* FREE log2_hi ***********/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2998) /* FREE log2_lo ***********/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2999) __mpu_sbrk( -(int)(18*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 3000) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3001)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3002) /* FREE m *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3003) /* FREE je ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3004) __mpu_sbrk( -(int)(2*ne*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 3005) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3006)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3007) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3008) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 3009)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3010) mt = (EMUSHORT *)__mpu_sbrk( (int)(ne*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 3011) if( !mt )
868b2b66 (kx 2024-12-20 16:11:07 +0300 3012) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 3013) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 3014)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3015) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3016) /* FREE zero **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3017) /* FREE F *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3018) /* FREE f *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3019) /* FREE g *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3020) /* FREE q *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3021) /* FREE u *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3022) /* FREE u1 ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3023) /* FREE u2 ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3024) /* FREE v *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3025) /* FREE one ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3026) /* FREE half **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3027) /* FREE two ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3028) /* FREE tx ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3029) /* FREE tm ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3030) /* FREE tr ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3031) /* FREE log2_hi ***********/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3032) /* FREE log2_lo ***********/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3033) __mpu_sbrk( -(int)(18*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 3034) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3035)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3036) /* FREE m *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3037) /* FREE je ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3038) /* FREE min_bin_exp *******/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3039) __mpu_sbrk( -(int)(3*ne*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 3040) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3041)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3042) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3043) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 3044) /************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3045)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3046)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3047) n_log_table = _get_n_log_table( nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 3048)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3049) logF_head = _get_logF_head_ptr( nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 3050) logF_tail = _get_logF_tail_ptr( nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 3051)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3052) ei_cpye( min_bin_exp, _get_min_2_exp_ptr( nb ), ne, ne );
868b2b66 (kx 2024-12-20 16:11:07 +0300 3053)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3054) _gen_half( half, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 3055) _gen_one ( one, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 3056) _gen_two ( two, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 3057)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3058) /* Service Constant: hight entries of log_table[] */
868b2b66 (kx 2024-12-20 16:11:07 +0300 3059) ei_copy( log2_hi, logF_head + np*n_log_table, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 3060) ei_copy( log2_lo, logF_tail + np*n_log_table, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 3061)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3062) /* ei_copy( x, eix, nb ); */
868b2b66 (kx 2024-12-20 16:11:07 +0300 3063)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3064) if( ei_cmp( x, zero, nb ) > 0 ) /* ( x > 0.0 ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 3065) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 3066) /********************
868b2b66 (kx 2024-12-20 16:11:07 +0300 3067) Argument reduction
868b2b66 (kx 2024-12-20 16:11:07 +0300 3068) ********************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3069) ei_logb( m, x, ne, nb ); /* m = logb( x ); */
868b2b66 (kx 2024-12-20 16:11:07 +0300 3070) ei_nege( mt, m, ne );
868b2b66 (kx 2024-12-20 16:11:07 +0300 3071) ei_ldexp( g, mt, x, ne, nb ); /* g = ldexp( x, -m ); */
868b2b66 (kx 2024-12-20 16:11:07 +0300 3072) /* if( m == min_bin_exp ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 3073) if( ei_cmpe( m, min_bin_exp, ne ) == 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 3074) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 3075) ei_logb( je, g, ne, nb ); /* je = logb( g ); */
868b2b66 (kx 2024-12-20 16:11:07 +0300 3076) ei_adde( m, m, je, ne ); /* m += je; */
868b2b66 (kx 2024-12-20 16:11:07 +0300 3077) ei_nege( mt, je, ne );
868b2b66 (kx 2024-12-20 16:11:07 +0300 3078) ei_ldexp( g, mt, g, ne, nb ); /* g = ldexp( g, -je ); */
868b2b66 (kx 2024-12-20 16:11:07 +0300 3079) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 3080)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3081) /* begin: ************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 3082) j = n_log_table*(g-1) + .5;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3083) F = (1.0/n_log_table) * j + 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3084) f = g - F;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3085) *********************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3086) j = (__mpu_int32_t)n_log_table;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3087) ei_ltor( tr, (EMUSHORT *)&j, nb, 1 );
868b2b66 (kx 2024-12-20 16:11:07 +0300 3088) ei_sub( tx, g, one, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 3089) ei_mul( tr, tr, tx, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 3090) ei_add( tr, tr, half, nb ); /* tr=j; */
868b2b66 (kx 2024-12-20 16:11:07 +0300 3091)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3092) ei_ltor( tx, (EMUSHORT *)&j, nb, 1 );
868b2b66 (kx 2024-12-20 16:11:07 +0300 3093) ei_div( tx, one, tx, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 3094)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3095) /* begin : *********************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 3096) Skip digits after decimal point.
868b2b66 (kx 2024-12-20 16:11:07 +0300 3097) *******************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3098) ei_rtol_frac( (EMUSHORT *)&j, /* j = tr; */
868b2b66 (kx 2024-12-20 16:11:07 +0300 3099) (EMUSHORT *)0, tr, 1, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 3100) ei_ltor( tr, (EMUSHORT *)&j, nb, 1 );
868b2b66 (kx 2024-12-20 16:11:07 +0300 3101) /* end : ***********************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 3102) Skip digits after decimal point.
868b2b66 (kx 2024-12-20 16:11:07 +0300 3103) *******************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3104)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3105) ei_mul( tx, tx, tr, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 3106) ei_add( F, tx, one, nb ); /* F*128 is an integer in [128,512] */
868b2b66 (kx 2024-12-20 16:11:07 +0300 3107)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3108) ei_sub( f, g, F, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 3109)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3110) /* For following Code. */
868b2b66 (kx 2024-12-20 16:11:07 +0300 3111) ei_rtol_frac( je, /* je = tr; */
868b2b66 (kx 2024-12-20 16:11:07 +0300 3112) (EMUSHORT *)0, tr, ne, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 3113) /* end: **************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 3114) j = n_log_table*(g-1) + .5;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3115) F = (1.0/n_log_table) * j + 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3116) f = g - F;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3117) *********************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3118)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3119)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3120) /**************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 3121) Approximate expansion for log( 1+f/F ) ~= u + q.
868b2b66 (kx 2024-12-20 16:11:07 +0300 3122) **************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3123) ei_mul( tr, two, F, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 3124) ei_add( tr, tr, f, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 3125) ei_div( g, one, tr, nb ); /* g = 1/(2*F+f); */
868b2b66 (kx 2024-12-20 16:11:07 +0300 3126)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3127) ei_mul( u, two, f, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 3128) ei_mul( u, u, g, nb ); /* u = 2*f*g; */
868b2b66 (kx 2024-12-20 16:11:07 +0300 3129)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3130) ei_mul( v, u, u, nb ); /* v = u*u; */
868b2b66 (kx 2024-12-20 16:11:07 +0300 3131)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3132) ei_log__N( tx, v, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 3133) ei_mul( q, u, tx, nb ); /* q = u*v*(A1+v*(A2+v*(A3+...))); */
868b2b66 (kx 2024-12-20 16:11:07 +0300 3134)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3135) if( ei_cmp0e( m, ne ) || ei_cmp0e( je, ne ) )
868b2b66 (kx 2024-12-20 16:11:07 +0300 3136) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 3137) /* Формирование константы 0x2000.....0001; */
868b2b66 (kx 2024-12-20 16:11:07 +0300 3138) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 3139) /* hight part */
868b2b66 (kx 2024-12-20 16:11:07 +0300 3140) p = mt;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3141) *p++ = (EMUSHORT)0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3142) *p++ = HIGHT_EXTWO >> 1; /* 0x2000... */
868b2b66 (kx 2024-12-20 16:11:07 +0300 3143) for( i = 0; i < ne - 2; i++ ) *p++ = (EMUSHORT)0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3144) p--;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3145) *p |= 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3146) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 3147) /* hight part */
868b2b66 (kx 2024-12-20 16:11:07 +0300 3148) p = mt + ne - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3149) *p-- = (EMUSHORT)0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3150) *p-- = HIGHT_EXTWO >> 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3151) for( i = 0; i < ne - 2; i++ ) *p-- = (EMUSHORT)0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3152) p++;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3153) *p |= 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3154) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 3155)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3156) ei_ltor( tr, mt, nb, ne );
868b2b66 (kx 2024-12-20 16:11:07 +0300 3157)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3158) ei_add( u1, u, tr, nb ); /* u1 = u + 513; */
868b2b66 (kx 2024-12-20 16:11:07 +0300 3159) ei_sub( u1, u1, tr, nb ); /* u1 -= 513; */
868b2b66 (kx 2024-12-20 16:11:07 +0300 3160) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 3161) else
868b2b66 (kx 2024-12-20 16:11:07 +0300 3162) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 3163) ei_copy( u1, u, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 3164) __ei_TRUNC( u1, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 3165) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 3166)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3167) ei_mul( tr, F, u1, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 3168) ei_sub( tr, f, tr, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 3169) ei_mul( tr, two, tr, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 3170) ei_mul( tx, u1, f, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 3171) ei_sub( tr, tr, tx, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 3172) ei_mul( u2, tr, g, nb ); /* u2 = (2.0*(f - F*u1) - u1*f) * g; */
868b2b66 (kx 2024-12-20 16:11:07 +0300 3173) /******************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 3174) u1 + u2 = 2f/(2F+f); to extra precision.
868b2b66 (kx 2024-12-20 16:11:07 +0300 3175) ******************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3176)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3177) /***********************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 3178) log(x) = log(2^m*F*(1+f/F)) =
868b2b66 (kx 2024-12-20 16:11:07 +0300 3179) (m*log2_hi+logF_head[j]+u1) + (m*log2_lo+logF_tail[j]+q);
868b2b66 (kx 2024-12-20 16:11:07 +0300 3180) (exact) + (tiny).
868b2b66 (kx 2024-12-20 16:11:07 +0300 3181) ***********************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3182) ei_ltor( tm, m, nb, ne );
868b2b66 (kx 2024-12-20 16:11:07 +0300 3183) ei_mul( tr, tm, log2_hi, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 3184) ei_add( tr, tr, logF_head+np*j, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 3185) ei_add( u1, u1, tr, nb ); /* u1 += m*logF_head[N] +
868b2b66 (kx 2024-12-20 16:11:07 +0300 3186) logF_head[j]; */
868b2b66 (kx 2024-12-20 16:11:07 +0300 3187)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3188) ei_add( tr, u2, logF_tail+np*j, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 3189) ei_add( u2, tr, q, nb ); /* u2 = (u2 + logF_tail[j]) + q; */
868b2b66 (kx 2024-12-20 16:11:07 +0300 3190)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3191) ei_mul( tr, log2_lo, tm, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 3192) ei_add( u2, u2, tr, nb ); /* u2 += logF_tail[N]*m; */
868b2b66 (kx 2024-12-20 16:11:07 +0300 3193)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3194) ei_add( eiy, u1, u2, nb ); /* return( u1 + u2 ); */
868b2b66 (kx 2024-12-20 16:11:07 +0300 3195)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3196) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3197) /* FREE zero **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3198) /* FREE F *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3199) /* FREE f *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3200) /* FREE g *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3201) /* FREE q *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3202) /* FREE u *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3203) /* FREE u1 ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3204) /* FREE u2 ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3205) /* FREE v *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3206) /* FREE one ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3207) /* FREE half **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3208) /* FREE two ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3209) /* FREE tx ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3210) /* FREE tm ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3211) /* FREE tr ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3212) /* FREE log2_hi ***********/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3213) /* FREE log2_lo ***********/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3214) __mpu_sbrk( -(int)(18*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 3215) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3216)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3217) /* FREE m *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3218) /* FREE je ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3219) /* FREE min_bin_exp *******/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3220) /* FREE mt ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3221) __mpu_sbrk( -(int)(4*ne*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 3222) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3223)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3224) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3225) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 3226) else /* т.е. ( x <= 0.0 ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 3227) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 3228) if( ei_cmp( x, zero, nb ) == 0 ) /* ( x == 0.0 ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 3229) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 3230) /* x == 0.0, return -Infinity with signal */
868b2b66 (kx 2024-12-20 16:11:07 +0300 3231) /* "argument domain error" */
868b2b66 (kx 2024-12-20 16:11:07 +0300 3232) /* return: -Infinity */
868b2b66 (kx 2024-12-20 16:11:07 +0300 3233) ei_infin( eiy, (unsigned)1, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 3234) /***************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 3235) NOTE:
868b2b66 (kx 2024-12-20 16:11:07 +0300 3236) Функция _mtherr() является переходником между
868b2b66 (kx 2024-12-20 16:11:07 +0300 3237) внутренним форматом и внешней,
868b2b66 (kx 2024-12-20 16:11:07 +0300 3238) переопределяемой пользователем, функцией
868b2b66 (kx 2024-12-20 16:11:07 +0300 3239) _math_error(). Кроме основных действий она
868b2b66 (kx 2024-12-20 16:11:07 +0300 3240) выставляет системную переменную errno
868b2b66 (kx 2024-12-20 16:11:07 +0300 3241) следующим образом.
868b2b66 (kx 2024-12-20 16:11:07 +0300 3242)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3243) errno = __mpu_math_errnotab[type];
868b2b66 (kx 2024-12-20 16:11:07 +0300 3244) ***************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3245) _mtherr( eiy, (__mpu_char8_t *)"log", __DOMAIN__,
868b2b66 (kx 2024-12-20 16:11:07 +0300 3246) eiy, x, (EMUSHORT *)0, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 3247) __STDOM; /* ( x == 0 ) - produsing Domain Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 3248)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3249) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3250) /* FREE zero **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3251) /* FREE F *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3252) /* FREE f *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3253) /* FREE g *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3254) /* FREE q *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3255) /* FREE u *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3256) /* FREE u1 ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3257) /* FREE u2 ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3258) /* FREE v *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3259) /* FREE one ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3260) /* FREE half **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3261) /* FREE two ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3262) /* FREE tx ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3263) /* FREE tm ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3264) /* FREE tr ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3265) /* FREE log2_hi ***********/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3266) /* FREE log2_lo ***********/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3267) __mpu_sbrk( -(int)(18*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 3268) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3269)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3270) /* FREE m *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3271) /* FREE je ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3272) /* FREE min_bin_exp *******/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3273) /* FREE mt ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3274) __mpu_sbrk( -(int)(4*ne*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 3275) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3276)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3277) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3278) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 3279) else
868b2b66 (kx 2024-12-20 16:11:07 +0300 3280) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 3281) /* x < 0.0, return -InD with signal */
868b2b66 (kx 2024-12-20 16:11:07 +0300 3282) /* "argument domain error" */
868b2b66 (kx 2024-12-20 16:11:07 +0300 3283) /* return: InD */
868b2b66 (kx 2024-12-20 16:11:07 +0300 3284) ei_ind( eiy, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 3285) /***************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 3286) NOTE:
868b2b66 (kx 2024-12-20 16:11:07 +0300 3287) Функция _mtherr() является переходником между
868b2b66 (kx 2024-12-20 16:11:07 +0300 3288) внутренним форматом и внешней,
868b2b66 (kx 2024-12-20 16:11:07 +0300 3289) переопределяемой пользователем, функцией
868b2b66 (kx 2024-12-20 16:11:07 +0300 3290) _math_error(). Кроме основных действий она
868b2b66 (kx 2024-12-20 16:11:07 +0300 3291) выставляет системную переменную errno
868b2b66 (kx 2024-12-20 16:11:07 +0300 3292) следующим образом.
868b2b66 (kx 2024-12-20 16:11:07 +0300 3293)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3294) errno = __mpu_math_errnotab[type];
868b2b66 (kx 2024-12-20 16:11:07 +0300 3295) ***************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3296) _mtherr( eiy, (__mpu_char8_t *)"log", __DOMAIN__,
868b2b66 (kx 2024-12-20 16:11:07 +0300 3297) eiy, x, (EMUSHORT *)0, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 3298) __STDOM; /* ( x < 0 ) - produsing Domain Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 3299)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3300) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3301) /* FREE zero **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3302) /* FREE F *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3303) /* FREE f *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3304) /* FREE g *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3305) /* FREE q *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3306) /* FREE u *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3307) /* FREE u1 ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3308) /* FREE u2 ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3309) /* FREE v *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3310) /* FREE one ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3311) /* FREE half **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3312) /* FREE two ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3313) /* FREE tx ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3314) /* FREE tm ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3315) /* FREE tr ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3316) /* FREE log2_hi ***********/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3317) /* FREE log2_lo ***********/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3318) __mpu_sbrk( -(int)(18*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 3319) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3320)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3321) /* FREE m *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3322) /* FREE je ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3323) /* FREE min_bin_exp *******/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3324) /* FREE mt ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3325) __mpu_sbrk( -(int)(4*ne*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 3326) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3327)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3328) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3329) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 3330)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3331) } /* End if( x > 0.0 ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 3332)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3333) } /* End of ei_log() */
868b2b66 (kx 2024-12-20 16:11:07 +0300 3334)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3335)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3336) typedef struct Double Double;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3337) struct Double
868b2b66 (kx 2024-12-20 16:11:07 +0300 3338) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 3339) EMUSHORT *a;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3340) EMUSHORT *b;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3341) };
868b2b66 (kx 2024-12-20 16:11:07 +0300 3342)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3343) static void __ei_log__D( Double diy, EMUSHORT *eix, int nb )
868b2b66 (kx 2024-12-20 16:11:07 +0300 3344) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 3345) EMUSHORT *x = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 3346) *F = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 3347) *f = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 3348) *g = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 3349) *q = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 3350) *u = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 3351) *u1 = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 3352) *u2 = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 3353) *v = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 3354) *zero = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 3355) *one = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 3356) *half = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 3357) *two = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 3358) *tx = NULL, /* temp */
868b2b66 (kx 2024-12-20 16:11:07 +0300 3359) *tm = NULL, /* temp */
868b2b66 (kx 2024-12-20 16:11:07 +0300 3360) *tr = NULL; /* temp */
868b2b66 (kx 2024-12-20 16:11:07 +0300 3361)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3362) EMUSHORT *log2_hi = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 3363) *log2_lo = NULL;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3364)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3365) EMUSHORT *m = NULL, /* for Exponent */
868b2b66 (kx 2024-12-20 16:11:07 +0300 3366) *je = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 3367) *min_bin_exp = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 3368) *mt = NULL; /* temp */
868b2b66 (kx 2024-12-20 16:11:07 +0300 3369) EMUSHORT *p, *logF_head, *logF_tail;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3370) __mpu_int32_t j;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3371) int np, ne, i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3372) int n_log_table;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3373)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3374)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3375) if( nb < NBR_32 || nb > MPU_MATH_FN_LIMIT )
868b2b66 (kx 2024-12-20 16:11:07 +0300 3376) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 3377) /* error: Invalid size of operand(s) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 3378) __real_error_no = __R_ESIZE__;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3379) __STIND; /* Set REAL ind-produsing operation Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 3380) /* ei_ind( eiy, nb ); */ /* Invalid NB */
868b2b66 (kx 2024-12-20 16:11:07 +0300 3381) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3382) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 3383)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3384) /*******************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 3385) Hight Precision for r32, r64.
868b2b66 (kx 2024-12-20 16:11:07 +0300 3386) *******************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3387) if( nb < NBR_128 ) nb = NBR_128;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3388)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3389) np = internal_np( nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 3390) ne = internal_ne( nb ) + 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3391)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3392)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3393) /*** Allocate memory for x, y . *****************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3394) x = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 3395) if( !x )
868b2b66 (kx 2024-12-20 16:11:07 +0300 3396) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 3397) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 3398) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3399) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 3400)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3401) zero = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 3402) if( !zero )
868b2b66 (kx 2024-12-20 16:11:07 +0300 3403) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 3404) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 3405)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3406) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3407) __mpu_sbrk( -(int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 3408) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3409) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3410) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 3411) /************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3412)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3413) /*** Allocate memory for F, f, g, q, u, u1, u2, v . *********/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3414) F = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 3415) if( !F )
868b2b66 (kx 2024-12-20 16:11:07 +0300 3416) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 3417) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 3418)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3419) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3420) /* FREE zero **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3421) __mpu_sbrk( -(int)(2*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 3422) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3423)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3424) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3425) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 3426)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3427) f = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 3428) if( !f )
868b2b66 (kx 2024-12-20 16:11:07 +0300 3429) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 3430) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 3431)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3432) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3433) /* FREE zero **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3434) /* FREE F *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3435) __mpu_sbrk( -(int)(3*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 3436) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3437)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3438) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3439) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 3440)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3441) g = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 3442) if( !g )
868b2b66 (kx 2024-12-20 16:11:07 +0300 3443) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 3444) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 3445)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3446) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3447) /* FREE zero **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3448) /* FREE F *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3449) /* FREE f *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3450) __mpu_sbrk( -(int)(4*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 3451) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3452)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3453) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3454) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 3455)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3456) q = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 3457) if( !q )
868b2b66 (kx 2024-12-20 16:11:07 +0300 3458) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 3459) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 3460)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3461) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3462) /* FREE zero **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3463) /* FREE F *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3464) /* FREE f *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3465) /* FREE g *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3466) __mpu_sbrk( -(int)(5*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 3467) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3468)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3469) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3470) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 3471)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3472) u = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 3473) if( !u )
868b2b66 (kx 2024-12-20 16:11:07 +0300 3474) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 3475) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 3476)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3477) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3478) /* FREE zero **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3479) /* FREE F *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3480) /* FREE f *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3481) /* FREE g *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3482) /* FREE q *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3483) __mpu_sbrk( -(int)(6*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 3484) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3485)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3486) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3487) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 3488)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3489) u1 = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 3490) if( !u1 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 3491) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 3492) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 3493)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3494) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3495) /* FREE zero **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3496) /* FREE F *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3497) /* FREE f *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3498) /* FREE g *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3499) /* FREE q *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3500) /* FREE u *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3501) __mpu_sbrk( -(int)(7*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 3502) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3503)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3504) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3505) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 3506)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3507) u2 = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 3508) if( !u2 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 3509) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 3510) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 3511)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3512) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3513) /* FREE zero **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3514) /* FREE F *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3515) /* FREE f *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3516) /* FREE g *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3517) /* FREE q *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3518) /* FREE u *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3519) /* FREE u1 ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3520) __mpu_sbrk( -(int)(8*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 3521) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3522)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3523) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3524) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 3525)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3526) v = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 3527) if( !v )
868b2b66 (kx 2024-12-20 16:11:07 +0300 3528) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 3529) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 3530)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3531) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3532) /* FREE zero **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3533) /* FREE F *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3534) /* FREE f *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3535) /* FREE g *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3536) /* FREE q *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3537) /* FREE u *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3538) /* FREE u1 ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3539) /* FREE u2 ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3540) __mpu_sbrk( -(int)(9*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 3541) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3542)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3543) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3544) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 3545) /************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3546)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3547) /*** Allocate memory for one, half, two, tx, tm, tr . *******/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3548) one = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 3549) if( !one )
868b2b66 (kx 2024-12-20 16:11:07 +0300 3550) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 3551) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 3552)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3553) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3554) /* FREE zero **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3555) /* FREE F *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3556) /* FREE f *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3557) /* FREE g *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3558) /* FREE q *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3559) /* FREE u *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3560) /* FREE u1 ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3561) /* FREE u2 ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3562) /* FREE v *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3563) __mpu_sbrk( -(int)(10*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 3564) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3565)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3566) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3567) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 3568)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3569) half = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 3570) if( !half )
868b2b66 (kx 2024-12-20 16:11:07 +0300 3571) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 3572) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 3573)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3574) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3575) /* FREE zero **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3576) /* FREE F *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3577) /* FREE f *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3578) /* FREE g *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3579) /* FREE q *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3580) /* FREE u *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3581) /* FREE u1 ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3582) /* FREE u2 ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3583) /* FREE v *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3584) /* FREE one ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3585) __mpu_sbrk( -(int)(11*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 3586) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3587)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3588) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3589) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 3590)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3591) two = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 3592) if( !two )
868b2b66 (kx 2024-12-20 16:11:07 +0300 3593) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 3594) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 3595)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3596) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3597) /* FREE zero **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3598) /* FREE F *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3599) /* FREE f *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3600) /* FREE g *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3601) /* FREE q *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3602) /* FREE u *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3603) /* FREE u1 ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3604) /* FREE u2 ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3605) /* FREE v *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3606) /* FREE one ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3607) /* FREE half **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3608) __mpu_sbrk( -(int)(12*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 3609) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3610)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3611) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3612) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 3613)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3614) tx = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 3615) if( !tx )
868b2b66 (kx 2024-12-20 16:11:07 +0300 3616) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 3617) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 3618)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3619) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3620) /* FREE zero **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3621) /* FREE F *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3622) /* FREE f *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3623) /* FREE g *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3624) /* FREE q *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3625) /* FREE u *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3626) /* FREE u1 ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3627) /* FREE u2 ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3628) /* FREE v *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3629) /* FREE one ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3630) /* FREE half **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3631) /* FREE two ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3632) __mpu_sbrk( -(int)(13*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 3633) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3634)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3635) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3636) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 3637)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3638) tm = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 3639) if( !tm )
868b2b66 (kx 2024-12-20 16:11:07 +0300 3640) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 3641) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 3642)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3643) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3644) /* FREE zero **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3645) /* FREE F *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3646) /* FREE f *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3647) /* FREE g *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3648) /* FREE q *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3649) /* FREE u *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3650) /* FREE u1 ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3651) /* FREE u2 ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3652) /* FREE v *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3653) /* FREE one ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3654) /* FREE half **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3655) /* FREE two ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3656) /* FREE tx ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3657) __mpu_sbrk( -(int)(14*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 3658) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3659)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3660) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3661) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 3662)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3663) tr = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 3664) if( !tr )
868b2b66 (kx 2024-12-20 16:11:07 +0300 3665) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 3666) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 3667)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3668) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3669) /* FREE zero **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3670) /* FREE F *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3671) /* FREE f *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3672) /* FREE g *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3673) /* FREE q *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3674) /* FREE u *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3675) /* FREE u1 ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3676) /* FREE u2 ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3677) /* FREE v *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3678) /* FREE one ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3679) /* FREE half **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3680) /* FREE two ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3681) /* FREE tx ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3682) /* FREE tm ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3683) __mpu_sbrk( -(int)(15*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 3684) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3685)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3686) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3687) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 3688) /************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3689)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3690) /*** Allocate memory for log2_hi, log2_lo . *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3691) log2_hi = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 3692) if( !log2_hi )
868b2b66 (kx 2024-12-20 16:11:07 +0300 3693) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 3694) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 3695)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3696) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3697) /* FREE zero **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3698) /* FREE F *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3699) /* FREE f *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3700) /* FREE g *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3701) /* FREE q *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3702) /* FREE u *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3703) /* FREE u1 ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3704) /* FREE u2 ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3705) /* FREE v *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3706) /* FREE one ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3707) /* FREE half **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3708) /* FREE two ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3709) /* FREE tx ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3710) /* FREE tm ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3711) /* FREE tr ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3712) __mpu_sbrk( -(int)(16*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 3713) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3714)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3715) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3716) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 3717)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3718) log2_lo = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 3719) if( !log2_lo )
868b2b66 (kx 2024-12-20 16:11:07 +0300 3720) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 3721) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 3722)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3723) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3724) /* FREE zero **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3725) /* FREE F *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3726) /* FREE f *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3727) /* FREE g *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3728) /* FREE q *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3729) /* FREE u *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3730) /* FREE u1 ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3731) /* FREE u2 ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3732) /* FREE v *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3733) /* FREE one ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3734) /* FREE half **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3735) /* FREE two ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3736) /* FREE tx ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3737) /* FREE tm ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3738) /* FREE tr ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3739) /* FREE log2_hi ***********/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3740) __mpu_sbrk( -(int)(17*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 3741) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3742)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3743) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3744) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 3745) /************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3746)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3747) /*** Allocate memory for m, je, min_bin_exp, mt . ***********/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3748) m = (EMUSHORT *)__mpu_sbrk( (int)(ne*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 3749) if( !m )
868b2b66 (kx 2024-12-20 16:11:07 +0300 3750) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 3751) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 3752)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3753) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3754) /* FREE zero **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3755) /* FREE F *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3756) /* FREE f *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3757) /* FREE g *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3758) /* FREE q *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3759) /* FREE u *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3760) /* FREE u1 ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3761) /* FREE u2 ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3762) /* FREE v *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3763) /* FREE one ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3764) /* FREE half **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3765) /* FREE two ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3766) /* FREE tx ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3767) /* FREE tm ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3768) /* FREE tr ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3769) /* FREE log2_hi ***********/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3770) /* FREE log2_lo ***********/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3771) __mpu_sbrk( -(int)(18*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 3772) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3773)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3774) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3775) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 3776)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3777) je = (EMUSHORT *)__mpu_sbrk( (int)(ne*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 3778) if( !je )
868b2b66 (kx 2024-12-20 16:11:07 +0300 3779) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 3780) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 3781)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3782) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3783) /* FREE zero **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3784) /* FREE F *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3785) /* FREE f *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3786) /* FREE g *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3787) /* FREE q *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3788) /* FREE u *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3789) /* FREE u1 ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3790) /* FREE u2 ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3791) /* FREE v *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3792) /* FREE one ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3793) /* FREE half **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3794) /* FREE two ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3795) /* FREE tx ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3796) /* FREE tm ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3797) /* FREE tr ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3798) /* FREE log2_hi ***********/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3799) /* FREE log2_lo ***********/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3800) __mpu_sbrk( -(int)(18*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 3801) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3802)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3803) /* FREE m *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3804) __mpu_sbrk( -(int)(ne*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 3805) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3806)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3807) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3808) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 3809)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3810) min_bin_exp = (EMUSHORT *)__mpu_sbrk( (int)(ne*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 3811) if( !min_bin_exp )
868b2b66 (kx 2024-12-20 16:11:07 +0300 3812) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 3813) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 3814)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3815) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3816) /* FREE zero **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3817) /* FREE F *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3818) /* FREE f *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3819) /* FREE g *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3820) /* FREE q *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3821) /* FREE u *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3822) /* FREE u1 ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3823) /* FREE u2 ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3824) /* FREE v *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3825) /* FREE one ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3826) /* FREE half **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3827) /* FREE two ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3828) /* FREE tx ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3829) /* FREE tm ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3830) /* FREE tr ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3831) /* FREE log2_hi ***********/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3832) /* FREE log2_lo ***********/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3833) __mpu_sbrk( -(int)(18*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 3834) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3835)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3836) /* FREE m *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3837) /* FREE je ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3838) __mpu_sbrk( -(int)(2*ne*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 3839) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3840)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3841) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3842) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 3843)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3844) mt = (EMUSHORT *)__mpu_sbrk( (int)(ne*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 3845) if( !mt )
868b2b66 (kx 2024-12-20 16:11:07 +0300 3846) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 3847) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 3848)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3849) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3850) /* FREE zero **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3851) /* FREE F *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3852) /* FREE f *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3853) /* FREE g *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3854) /* FREE q *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3855) /* FREE u *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3856) /* FREE u1 ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3857) /* FREE u2 ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3858) /* FREE v *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3859) /* FREE one ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3860) /* FREE half **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3861) /* FREE two ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3862) /* FREE tx ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3863) /* FREE tm ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3864) /* FREE tr ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3865) /* FREE log2_hi ***********/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3866) /* FREE log2_lo ***********/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3867) __mpu_sbrk( -(int)(18*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 3868) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3869)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3870) /* FREE m *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3871) /* FREE je ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3872) /* FREE min_bin_exp *******/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3873) __mpu_sbrk( -(int)(3*ne*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 3874) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3875)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3876) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3877) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 3878) /************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3879)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3880)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3881) n_log_table = _get_n_log_table( nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 3882)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3883) logF_head = _get_logF_head_ptr( nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 3884) logF_tail = _get_logF_tail_ptr( nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 3885)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3886) ei_cpye( min_bin_exp, _get_min_2_exp_ptr( nb ), ne, ne );
868b2b66 (kx 2024-12-20 16:11:07 +0300 3887)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3888) _gen_zero( zero, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 3889) _gen_half( half, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 3890) _gen_one ( one, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 3891) _gen_two ( two, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 3892)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3893)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3894) /* Service Constant: hight entries of log_table[] */
868b2b66 (kx 2024-12-20 16:11:07 +0300 3895) ei_copy( log2_hi, logF_head + np*n_log_table, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 3896) ei_copy( log2_lo, logF_tail + np*n_log_table, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 3897)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3898)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3899) ei_copy( x, eix, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 3900)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3901) /********************
868b2b66 (kx 2024-12-20 16:11:07 +0300 3902) Argument reduction
868b2b66 (kx 2024-12-20 16:11:07 +0300 3903) ********************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3904) ei_logb( m, x, ne, nb ); /* m = logb( x ); */
868b2b66 (kx 2024-12-20 16:11:07 +0300 3905) ei_nege( mt, m, ne );
868b2b66 (kx 2024-12-20 16:11:07 +0300 3906) ei_ldexp( g, mt, x, ne, nb ); /* g = ldexp( x, -m ); */
868b2b66 (kx 2024-12-20 16:11:07 +0300 3907) /* if( m == min_bin_exp ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 3908) if( ei_cmpe( m, min_bin_exp, ne ) == 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 3909) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 3910) ei_logb( je, g, ne, nb ); /* je = logb( g ); */
868b2b66 (kx 2024-12-20 16:11:07 +0300 3911) ei_adde( m, m, je, ne ); /* m += je; */
868b2b66 (kx 2024-12-20 16:11:07 +0300 3912) ei_nege( mt, je, ne );
868b2b66 (kx 2024-12-20 16:11:07 +0300 3913) ei_ldexp( g, mt, g, ne, nb ); /* g = ldexp( g, -je ); */
868b2b66 (kx 2024-12-20 16:11:07 +0300 3914) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 3915)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3916) /* begin: ************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 3917) j = n_log_table*(g-1) + .5;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3918) F = (1.0/n_log_table) * j + 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3919) f = g - F;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3920) *********************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3921) j = (__mpu_int32_t)n_log_table;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3922) ei_ltor( tr, (EMUSHORT *)&j, nb, 1 );
868b2b66 (kx 2024-12-20 16:11:07 +0300 3923) ei_sub( tx, g, one, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 3924) ei_mul( tr, tr, tx, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 3925) ei_add( tr, tr, half, nb ); /* tr=j; */
868b2b66 (kx 2024-12-20 16:11:07 +0300 3926)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3927) ei_ltor( tx, (EMUSHORT *)&j, nb, 1 );
868b2b66 (kx 2024-12-20 16:11:07 +0300 3928) ei_div( tx, one, tx, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 3929)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3930) /* begin : *********************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 3931) Skip digits after decimal point.
868b2b66 (kx 2024-12-20 16:11:07 +0300 3932) *******************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3933) ei_rtol_frac( (EMUSHORT *)&j, /* j = tr; */
868b2b66 (kx 2024-12-20 16:11:07 +0300 3934) (EMUSHORT *)0, tr, 1, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 3935) ei_ltor( tr, (EMUSHORT *)&j, nb, 1 );
868b2b66 (kx 2024-12-20 16:11:07 +0300 3936) /* end : ***********************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 3937) Skip digits after decimal point.
868b2b66 (kx 2024-12-20 16:11:07 +0300 3938) *******************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3939)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3940) ei_mul( tx, tx, tr, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 3941) ei_add( F, tx, one, nb ); /* F*128 is an integer in [128,512] */
868b2b66 (kx 2024-12-20 16:11:07 +0300 3942)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3943) ei_sub( f, g, F, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 3944)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3945) /* For following Code. */
868b2b66 (kx 2024-12-20 16:11:07 +0300 3946) ei_rtol_frac( je, /* je = tr; */
868b2b66 (kx 2024-12-20 16:11:07 +0300 3947) (EMUSHORT *)0, tr, ne, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 3948) /* end: **************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 3949) j = n_log_table*(g-1) + .5;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3950) F = (1.0/n_log_table) * j + 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3951) f = g - F;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3952) *********************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3953)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3954)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3955) /**************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 3956) Approximate expansion for log( 1+f/F ) ~= u + q.
868b2b66 (kx 2024-12-20 16:11:07 +0300 3957) **************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3958) ei_mul( tr, two, F, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 3959) ei_add( tr, tr, f, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 3960) ei_div( g, one, tr, nb ); /* g = 1/(2*F+f); */
868b2b66 (kx 2024-12-20 16:11:07 +0300 3961)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3962) ei_mul( u, two, f, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 3963) ei_mul( u, u, g, nb ); /* u = 2*f*g; */
868b2b66 (kx 2024-12-20 16:11:07 +0300 3964)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3965) ei_mul( v, u, u, nb ); /* v = u*u; */
868b2b66 (kx 2024-12-20 16:11:07 +0300 3966)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3967) ei_log__N( tx, v, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 3968) ei_mul( q, u, tx, nb ); /* q = u*v*(A1+v*(A2+v*(A3+...))); */
868b2b66 (kx 2024-12-20 16:11:07 +0300 3969)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3970) if( ei_cmp0e( m, ne ) || ei_cmp0e( je, ne ) )
868b2b66 (kx 2024-12-20 16:11:07 +0300 3971) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 3972) /* Формирование константы 0x2000.....0001; */
868b2b66 (kx 2024-12-20 16:11:07 +0300 3973) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 3974) /* hight part */
868b2b66 (kx 2024-12-20 16:11:07 +0300 3975) p = mt;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3976) *p++ = (EMUSHORT)0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3977) *p++ = HIGHT_EXTWO >> 1; /* 0x2000... */
868b2b66 (kx 2024-12-20 16:11:07 +0300 3978) for( i = 0; i < ne - 2; i++ ) *p++ = (EMUSHORT)0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3979) p--;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3980) *p |= 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3981) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 3982) /* hight part */
868b2b66 (kx 2024-12-20 16:11:07 +0300 3983) p = mt + ne - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3984) *p-- = (EMUSHORT)0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3985) *p-- = HIGHT_EXTWO >> 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3986) for( i = 0; i < ne - 2; i++ ) *p-- = (EMUSHORT)0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3987) p++;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3988) *p |= 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3989) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 3990)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3991) ei_ltor( tr, mt, nb, ne );
868b2b66 (kx 2024-12-20 16:11:07 +0300 3992)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3993) ei_add( u1, u, tr, nb ); /* u1 = u + 513; */
868b2b66 (kx 2024-12-20 16:11:07 +0300 3994) ei_sub( u1, u1, tr, nb ); /* u1 -= 513; */
868b2b66 (kx 2024-12-20 16:11:07 +0300 3995) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 3996) else
868b2b66 (kx 2024-12-20 16:11:07 +0300 3997) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 3998) ei_copy( u1, u, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 3999) __ei_TRUNC( u1, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 4000) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 4001)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4002) ei_mul( tr, F, u1, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 4003) ei_sub( tr, f, tr, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 4004) ei_mul( tr, two, tr, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 4005) ei_mul( tx, u1, f, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 4006) ei_sub( tr, tr, tx, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 4007) ei_mul( u2, tr, g, nb ); /* u2 = (2.0*(f - F*u1) - u1*f) * g; */
868b2b66 (kx 2024-12-20 16:11:07 +0300 4008) /******************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 4009) u1 + u2 = 2f/(2F+f); to extra precision.
868b2b66 (kx 2024-12-20 16:11:07 +0300 4010) ******************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4011)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4012) /***********************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 4013) log(x) = log(2^m*F*(1+f/F)) =
868b2b66 (kx 2024-12-20 16:11:07 +0300 4014) (m*log2_hi+logF_head[j]+u1) + (m*log2_lo+logF_tail[j]+q);
868b2b66 (kx 2024-12-20 16:11:07 +0300 4015) (exact) + (tiny).
868b2b66 (kx 2024-12-20 16:11:07 +0300 4016) ***********************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4017) ei_ltor( tm, m, nb, ne );
868b2b66 (kx 2024-12-20 16:11:07 +0300 4018) ei_mul( tr, tm, log2_hi, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 4019) ei_add( tr, tr, logF_head+np*j, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 4020) ei_add( u1, u1, tr, nb ); /* u1 += m*logF_head[N] +
868b2b66 (kx 2024-12-20 16:11:07 +0300 4021) logF_head[j]; */
868b2b66 (kx 2024-12-20 16:11:07 +0300 4022)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4023) ei_add( tr, u2, logF_tail+np*j, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 4024) ei_add( u2, tr, q, nb ); /* u2 = (u2 + logF_tail[j]) + q; */
868b2b66 (kx 2024-12-20 16:11:07 +0300 4025)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4026) ei_mul( tr, log2_lo, tm, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 4027) ei_add( u2, u2, tr, nb ); /* u2 += logF_tail[N]*m; */
868b2b66 (kx 2024-12-20 16:11:07 +0300 4028)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4029) /* Only difference is here */
868b2b66 (kx 2024-12-20 16:11:07 +0300 4030) ei_add( diy.a, u1, u2, nb ); /* diy.a = u1 + u2; */
868b2b66 (kx 2024-12-20 16:11:07 +0300 4031) __ei_TRUNC( diy.a, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 4032) ei_sub( tr, u1, diy.a, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 4033) ei_add( diy.b, tr, u2, nb ); /* diy.b = (u1 - diy.a) + u2; */
868b2b66 (kx 2024-12-20 16:11:07 +0300 4034)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4035) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4036) /* FREE zero **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4037) /* FREE F *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4038) /* FREE f *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4039) /* FREE g *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4040) /* FREE q *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4041) /* FREE u *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4042) /* FREE u1 ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4043) /* FREE u2 ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4044) /* FREE v *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4045) /* FREE one ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4046) /* FREE half **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4047) /* FREE two ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4048) /* FREE tx ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4049) /* FREE tm ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4050) /* FREE tr ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4051) /* FREE log2_hi ***********/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4052) /* FREE log2_lo ***********/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4053) __mpu_sbrk( -(int)(18*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 4054) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4055)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4056) /* FREE m *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4057) /* FREE je ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4058) /* FREE min_bin_exp *******/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4059) /* FREE mt ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4060) __mpu_sbrk( -(int)(4*ne*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 4061) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4062)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4063) return; /* return( diy ); */
868b2b66 (kx 2024-12-20 16:11:07 +0300 4064)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4065) } /* End of __ei_log__D() */
868b2b66 (kx 2024-12-20 16:11:07 +0300 4066)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4067)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4068) void ei_log10( EMUSHORT *eiy, EMUSHORT *eix, int nb )
868b2b66 (kx 2024-12-20 16:11:07 +0300 4069) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 4070) log10( e ) = 1/ln( 10. );
868b2b66 (kx 2024-12-20 16:11:07 +0300 4071)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4072) Переход от натурального логарифма к десятичному:
868b2b66 (kx 2024-12-20 16:11:07 +0300 4073) log10( N ) = log10( e )*ln( N ).
868b2b66 (kx 2024-12-20 16:11:07 +0300 4074) ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4075) /*******************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 4076) mtherr("ei_log10"); ПОТОМ !!!
868b2b66 (kx 2024-12-20 16:11:07 +0300 4077) *******************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4078) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 4079) EMUSHORT *m_1_ln10;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4080)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4081) m_1_ln10 = _get_m_1_ln10_ptr( nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 4082) ei_log( eiy, eix, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 4083) ei_mul( eiy, eiy, m_1_ln10, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 4084) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 4085)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4086)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4087) void ei_log2( EMUSHORT *eiy, EMUSHORT *eix, int nb )
868b2b66 (kx 2024-12-20 16:11:07 +0300 4088) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 4089) Переход от натурального логарифма к логарифму по основанию 2:
868b2b66 (kx 2024-12-20 16:11:07 +0300 4090)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4091) log2( N ) = log2( e )*ln( N ).
868b2b66 (kx 2024-12-20 16:11:07 +0300 4092) ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4093) /******************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 4094) mtherr("ei_log2"); ПОТОМ !!!
868b2b66 (kx 2024-12-20 16:11:07 +0300 4095) ******************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4096) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 4097) EMUSHORT *m_1_ln2;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4098)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4099) m_1_ln2 = _get_m_1_ln2_ptr( nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 4100) ei_log( eiy, eix, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 4101) ei_mul( eiy, eiy, m_1_ln2, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 4102) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 4103)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4104)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4105) static void __ei_exp__E( EMUSHORT *eiy, EMUSHORT *eix, EMUSHORT *eic, int nb )
868b2b66 (kx 2024-12-20 16:11:07 +0300 4106) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 4107)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4108) Description : __ei_exp__E() Работает с
868b2b66 (kx 2024-12-20 16:11:07 +0300 4109) internal e-type data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300 4110)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4111) Concepts : ASSUMPTION: EIC << EIX SO THAT
868b2b66 (kx 2024-12-20 16:11:07 +0300 4112) __ei_TRUNC( EIX+EIC) = EIX.
868b2b66 (kx 2024-12-20 16:11:07 +0300 4113) (EIC is the correction term for EIX)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4114) ei_exp__E(x,c) RETURNS in EIY:
868b2b66 (kx 2024-12-20 16:11:07 +0300 4115) / exp(x+c)-1-x ,
868b2b66 (kx 2024-12-20 16:11:07 +0300 4116) | EPS < |x| < .3465736...
868b2b66 (kx 2024-12-20 16:11:07 +0300 4117) ei_exp__E(x,c) = |
868b2b66 (kx 2024-12-20 16:11:07 +0300 4118) \ 0, |x| < EPS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4119)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4120) where the constant .3465736... = ln(2)/2.
868b2b66 (kx 2024-12-20 16:11:07 +0300 4121)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4122) METHOD : 1. Rational approximation. Let r=x+c.
868b2b66 (kx 2024-12-20 16:11:07 +0300 4123) Based on
868b2b66 (kx 2024-12-20 16:11:07 +0300 4124) 2 * sinh(r/2)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4125) exp(r) - 1 = -----------------------,
868b2b66 (kx 2024-12-20 16:11:07 +0300 4126) cosh(r/2) - sinh(r/2)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4127)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4128) __ei_exp__E(r) is computed using
868b2b66 (kx 2024-12-20 16:11:07 +0300 4129)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4130) x*x (x/2)*W-(Q-(2*P+x*P))
868b2b66 (kx 2024-12-20 16:11:07 +0300 4131) --- + (c + x*[----------------------- + c ])
868b2b66 (kx 2024-12-20 16:11:07 +0300 4132) 2 1 - W
868b2b66 (kx 2024-12-20 16:11:07 +0300 4133)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4134) where P := p1*x^2 + p2*x^4 + ...,
868b2b66 (kx 2024-12-20 16:11:07 +0300 4135) Q := q1*x^2 + q2*x^4 + ...,
868b2b66 (kx 2024-12-20 16:11:07 +0300 4136) W := x/2-(Q-x*P),
868b2b66 (kx 2024-12-20 16:11:07 +0300 4137) See the listing below for the values
868b2b66 (kx 2024-12-20 16:11:07 +0300 4138) of p1,p2,q1,q2,q3. The polynomials
868b2b66 (kx 2024-12-20 16:11:07 +0300 4139) P and Q may be regarded as the
868b2b66 (kx 2024-12-20 16:11:07 +0300 4140) approximations to ei_sinh__S() and
868b2b66 (kx 2024-12-20 16:11:07 +0300 4141) ei_cosh__C() :
868b2b66 (kx 2024-12-20 16:11:07 +0300 4142)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4143) sinh(r/2) = r/2 + r * P,
868b2b66 (kx 2024-12-20 16:11:07 +0300 4144) cosh(r/2) = 1 + Q.)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4145)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4146) EI_SINH__S() : Построение ряда:
868b2b66 (kx 2024-12-20 16:11:07 +0300 4147) ==============================================================
868b2b66 (kx 2024-12-20 16:11:07 +0300 4148) Известно, что
868b2b66 (kx 2024-12-20 16:11:07 +0300 4149)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4150) sinh(x) = x + (1/3!)*x^3 + (1/5!)*x^5 + ... .
868b2b66 (kx 2024-12-20 16:11:07 +0300 4151)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4152) Мы имеем следующий способ
868b2b66 (kx 2024-12-20 16:11:07 +0300 4153)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4154) sinh(r/2) = r/2 + r*P;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4155)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4156) и
868b2b66 (kx 2024-12-20 16:11:07 +0300 4157)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4158) sinh(r/2) = r/2 + (1/3!)*(r/2)^3 + (1/5!)*(r/2)^5 + ... .
868b2b66 (kx 2024-12-20 16:11:07 +0300 4159)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4160) следовательно
868b2b66 (kx 2024-12-20 16:11:07 +0300 4161)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4162) P = (1/3!)*(r^2/2^3) + (1/5!)*(r^4/2^5) + ... =
868b2b66 (kx 2024-12-20 16:11:07 +0300 4163) 1 1 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 4164) = ------*r^2 + ------*r^4 + ------*r^6 + ... .
868b2b66 (kx 2024-12-20 16:11:07 +0300 4165) 2^3*3! 2^5*5! 2^7*7!
868b2b66 (kx 2024-12-20 16:11:07 +0300 4166)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4167) z = r*r; P = p1*z + p2*z^2 + p3*z^3 + ... .
868b2b66 (kx 2024-12-20 16:11:07 +0300 4168)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4169) Вот все, что нужно для APPROX(), чтобы получить p1, p2, p3, ...
868b2b66 (kx 2024-12-20 16:11:07 +0300 4170) на интервале [0, ln(2)/2] по флгоритму Ремеза.
868b2b66 (kx 2024-12-20 16:11:07 +0300 4171) ==============================================================
868b2b66 (kx 2024-12-20 16:11:07 +0300 4172)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4173) EI_COSH__C() : Построение ряда:
868b2b66 (kx 2024-12-20 16:11:07 +0300 4174) ==============================================================
868b2b66 (kx 2024-12-20 16:11:07 +0300 4175) Известно, что
868b2b66 (kx 2024-12-20 16:11:07 +0300 4176)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4177) cosh(x) = 1 + (1/2!)*x^2 + (1/4!)*x^4 + ... .
868b2b66 (kx 2024-12-20 16:11:07 +0300 4178)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4179) Мы имеем следующий способ
868b2b66 (kx 2024-12-20 16:11:07 +0300 4180)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4181) cosh(r/2) = 1 + Q;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4182)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4183) и
868b2b66 (kx 2024-12-20 16:11:07 +0300 4184)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4185) cosh(r/2) = 1 + (1/2!)*(r/2)^2 + (1/4!)*(r/2)^4 + ... .
868b2b66 (kx 2024-12-20 16:11:07 +0300 4186)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4187) следовательно
868b2b66 (kx 2024-12-20 16:11:07 +0300 4188)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4189) 1 1 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 4190) Q = ------*r^2 + ------*r^4 + ------*r^6 + ... .
868b2b66 (kx 2024-12-20 16:11:07 +0300 4191) 2^2*2! 2^4*4! 2^6*6!
868b2b66 (kx 2024-12-20 16:11:07 +0300 4192)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4193) z = r*r; Q = p1*z + p2*z^2 + p3*z^3 + ... .
868b2b66 (kx 2024-12-20 16:11:07 +0300 4194)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4195) Вот все, что нужно для APPROX(), чтобы получить q1, q2, q3, ...
868b2b66 (kx 2024-12-20 16:11:07 +0300 4196) на интервале [0, ln(2)/2] по флгоритму Ремеза.
868b2b66 (kx 2024-12-20 16:11:07 +0300 4197) ==============================================================
868b2b66 (kx 2024-12-20 16:11:07 +0300 4198)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4199) ACCURACY : In the absence of rounding error,
868b2b66 (kx 2024-12-20 16:11:07 +0300 4200) the appriximation has absolute error
868b2b66 (kx 2024-12-20 16:11:07 +0300 4201) less than EPSILON [see: FLOATP.H].
868b2b66 (kx 2024-12-20 16:11:07 +0300 4202)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4203) NOTE : The coefficient hS's & hC's
868b2b66 (kx 2024-12-20 16:11:07 +0300 4204) [ in __ei_sinh__S(), __ei_cosh__C()]
868b2b66 (kx 2024-12-20 16:11:07 +0300 4205) are obtained by a special Remez algorithm.
868b2b66 (kx 2024-12-20 16:11:07 +0300 4206)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4207) ==========================================
868b2b66 (kx 2024-12-20 16:11:07 +0300 4208) В INTERNET я нашел следующие алгоритмы:
868b2b66 (kx 2024-12-20 16:11:07 +0300 4209)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4210) 409 cacm 355 356 14 5 May 1971 e2 A60
868b2b66 (kx 2024-12-20 16:11:07 +0300 4211) ------------------------------------------
868b2b66 (kx 2024-12-20 16:11:07 +0300 4212) H. Schmitt;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4213) Discrete {Chebychev} Curve Fit
868b2b66 (kx 2024-12-20 16:11:07 +0300 4214) approximation;Chebyshev approximation;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4215) Chebyshev curve fitting;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4216) +Chebyshev polynomial;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4217) curve approximation;curve fitting;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4218) exchange algorithm;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4219) +polynomial approximation;Remez algorithm;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4220)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4221) 501 toms 95 97 2 1 March 1976 e2 F K2
868b2b66 (kx 2024-12-20 16:11:07 +0300 4222) ---------------------------------------------
868b2b66 (kx 2024-12-20 16:11:07 +0300 4223) J. C. Simpson;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4224) {FORTRAN} Translation of Algorithm 409
868b2b66 (kx 2024-12-20 16:11:07 +0300 4225) Discrete {Chebyshev} Curve Fit
868b2b66 (kx 2024-12-20 16:11:07 +0300 4226) approximation;polynomial approximation;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4227) exchange algorithm;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4228) +Chebyshev approximation;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4229) polynomial approximation;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4230) R,toms,95,4,1,March,1978,F. Futrell;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4231)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4232) последний из которых я перевел на "С", затем
868b2b66 (kx 2024-12-20 16:11:07 +0300 4233) на язык операций повышенной разрядности.
868b2b66 (kx 2024-12-20 16:11:07 +0300 4234)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4235) ==========================================
868b2b66 (kx 2024-12-20 16:11:07 +0300 4236)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4237) Use Global Variable:
868b2b66 (kx 2024-12-20 16:11:07 +0300 4238)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4239) Use Functions : ei_sinh__S( eiy, eix, nb ); | st-sinh.c
868b2b66 (kx 2024-12-20 16:11:07 +0300 4240) ei_cosh__C( eiy, eix, nb ); | st-cosh.c
868b2b66 (kx 2024-12-20 16:11:07 +0300 4241) ei_copy( eiy, eix, nb ); | mpu-real.c
868b2b66 (kx 2024-12-20 16:11:07 +0300 4242) .
868b2b66 (kx 2024-12-20 16:11:07 +0300 4243) .
868b2b66 (kx 2024-12-20 16:11:07 +0300 4244) .
868b2b66 (kx 2024-12-20 16:11:07 +0300 4245)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4246) Parameters : EMUSHORT *eiy; - указатель на
868b2b66 (kx 2024-12-20 16:11:07 +0300 4247) internal e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300 4248) data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300 4249) TARGET;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4250) EMUSHORT *eix; - указатель на
868b2b66 (kx 2024-12-20 16:11:07 +0300 4251) internal e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300 4252) data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300 4253) SOURCE;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4254) EMUSHORT *eic; - указатель на
868b2b66 (kx 2024-12-20 16:11:07 +0300 4255) internal e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300 4256) data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300 4257) (EIC is the
868b2b66 (kx 2024-12-20 16:11:07 +0300 4258) correction term
868b2b66 (kx 2024-12-20 16:11:07 +0300 4259) for EIX)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4260) SOURCE & TARGET;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4261) int nb; - количество бит в
868b2b66 (kx 2024-12-20 16:11:07 +0300 4262) external e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300 4263) data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300 4264)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4265) Return : [void]
868b2b66 (kx 2024-12-20 16:11:07 +0300 4266)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4267) ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4268) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 4269) EMUSHORT *z = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 4270) *c = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 4271) *p = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 4272) *q = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 4273) *xp = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 4274) *xh = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 4275) *w = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 4276) *x = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 4277) *tx = NULL, /* temp */
868b2b66 (kx 2024-12-20 16:11:07 +0300 4278) *tr = NULL, /* temp */
868b2b66 (kx 2024-12-20 16:11:07 +0300 4279) *half = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 4280) *one = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 4281) *zero = NULL;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4282) EMUSHORT *small;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4283) int np;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4284)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4285)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4286) if( nb < NBR_32 || nb > MPU_MATH_FN_LIMIT )
868b2b66 (kx 2024-12-20 16:11:07 +0300 4287) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 4288) /* error: Invalid size of operand(s) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 4289) __real_error_no = __R_ESIZE__;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4290) __STIND; /* Set REAL ind-produsing operation Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 4291) /* ei_ind( eiy, nb ); */ /* Invalid NB */
868b2b66 (kx 2024-12-20 16:11:07 +0300 4292) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4293) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 4294)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4295) /*******************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 4296) Hight Precision for r32, r64.
868b2b66 (kx 2024-12-20 16:11:07 +0300 4297) *******************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4298) if( nb < NBR_128 ) nb = NBR_128;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4299)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4300) np = internal_np( nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 4301)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4302) /*** Allocate memory for z, c, p, q, xp, xh, w, x, tx, tr . */
868b2b66 (kx 2024-12-20 16:11:07 +0300 4303) z = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 4304) if( !z )
868b2b66 (kx 2024-12-20 16:11:07 +0300 4305) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 4306) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 4307) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4308) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 4309)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4310) c = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 4311) if( !c )
868b2b66 (kx 2024-12-20 16:11:07 +0300 4312) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 4313) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 4314)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4315) /* FREE z *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4316) __mpu_sbrk( -(int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 4317) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4318)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4319) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4320) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 4321)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4322) p = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 4323) if( !p )
868b2b66 (kx 2024-12-20 16:11:07 +0300 4324) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 4325) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 4326)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4327) /* FREE z *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4328) /* FREE c *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4329) __mpu_sbrk( -(int)(2*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 4330) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4331)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4332) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4333) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 4334)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4335) q = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 4336) if( !q )
868b2b66 (kx 2024-12-20 16:11:07 +0300 4337) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 4338) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 4339)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4340) /* FREE z *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4341) /* FREE c *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4342) /* FREE p *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4343) __mpu_sbrk( -(int)(3*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 4344) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4345)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4346) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4347) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 4348)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4349) xp = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 4350) if( !xp )
868b2b66 (kx 2024-12-20 16:11:07 +0300 4351) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 4352) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 4353)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4354) /* FREE z *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4355) /* FREE c *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4356) /* FREE p *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4357) /* FREE q *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4358) __mpu_sbrk( -(int)(4*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 4359) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4360)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4361) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4362) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 4363)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4364) xh = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 4365) if( !xh )
868b2b66 (kx 2024-12-20 16:11:07 +0300 4366) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 4367) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 4368)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4369) /* FREE z *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4370) /* FREE c *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4371) /* FREE p *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4372) /* FREE q *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4373) /* FREE xp ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4374) __mpu_sbrk( -(int)(5*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 4375) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4376)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4377) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4378) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 4379)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4380) w = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 4381) if( !w )
868b2b66 (kx 2024-12-20 16:11:07 +0300 4382) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 4383) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 4384)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4385) /* FREE z *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4386) /* FREE c *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4387) /* FREE p *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4388) /* FREE q *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4389) /* FREE xp ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4390) /* FREE xh ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4391) __mpu_sbrk( -(int)(6*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 4392) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4393)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4394) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4395) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 4396)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4397) x = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 4398) if( !x )
868b2b66 (kx 2024-12-20 16:11:07 +0300 4399) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 4400) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 4401)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4402) /* FREE z *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4403) /* FREE c *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4404) /* FREE p *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4405) /* FREE q *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4406) /* FREE xp ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4407) /* FREE xh ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4408) /* FREE w *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4409) __mpu_sbrk( -(int)(7*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 4410) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4411)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4412) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4413) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 4414)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4415) tx = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 4416) if( !tx )
868b2b66 (kx 2024-12-20 16:11:07 +0300 4417) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 4418) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 4419)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4420) /* FREE z *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4421) /* FREE c *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4422) /* FREE p *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4423) /* FREE q *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4424) /* FREE xp ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4425) /* FREE xh ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4426) /* FREE w *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4427) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4428) __mpu_sbrk( -(int)(8*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 4429) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4430)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4431) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4432) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 4433)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4434) tr = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 4435) if( !tr )
868b2b66 (kx 2024-12-20 16:11:07 +0300 4436) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 4437) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 4438)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4439) /* FREE z *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4440) /* FREE c *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4441) /* FREE p *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4442) /* FREE q *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4443) /* FREE xp ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4444) /* FREE xh ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4445) /* FREE w *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4446) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4447) /* FREE tx ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4448) __mpu_sbrk( -(int)(9*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 4449) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4450)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4451) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4452) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 4453) /************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4454)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4455) /*** Allocate memory for half, one, zero . ******************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4456) half = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 4457) if( !half )
868b2b66 (kx 2024-12-20 16:11:07 +0300 4458) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 4459) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 4460)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4461) /* FREE z *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4462) /* FREE c *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4463) /* FREE p *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4464) /* FREE q *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4465) /* FREE xp ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4466) /* FREE xh ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4467) /* FREE w *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4468) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4469) /* FREE tx ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4470) /* FREE tr ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4471) __mpu_sbrk( -(int)(10*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 4472) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4473)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4474) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4475) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 4476)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4477) one = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 4478) if( !one )
868b2b66 (kx 2024-12-20 16:11:07 +0300 4479) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 4480) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 4481)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4482) /* FREE z *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4483) /* FREE c *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4484) /* FREE p *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4485) /* FREE q *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4486) /* FREE xp ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4487) /* FREE xh ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4488) /* FREE w *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4489) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4490) /* FREE tx ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4491) /* FREE tr ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4492) /* FREE half **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4493) __mpu_sbrk( -(int)(11*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 4494) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4495)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4496) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4497) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 4498)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4499) zero = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 4500) if( !zero )
868b2b66 (kx 2024-12-20 16:11:07 +0300 4501) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 4502) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 4503)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4504) /* FREE z *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4505) /* FREE c *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4506) /* FREE p *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4507) /* FREE q *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4508) /* FREE xp ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4509) /* FREE xh ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4510) /* FREE w *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4511) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4512) /* FREE tx ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4513) /* FREE tr ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4514) /* FREE half **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4515) /* FREE one ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4516) __mpu_sbrk( -(int)(12*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 4517) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4518)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4519) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4520) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 4521) /************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4522)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4523)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4524) _gen_zero( zero, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 4525) _gen_half( half, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 4526) _gen_one ( one, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 4527)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4528) small = _get_epsilon_ptr( nb ); /* See: FLOATP.H */
868b2b66 (kx 2024-12-20 16:11:07 +0300 4529)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4530) ei_copy( x, eix, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 4531) ei_copy( c, eic, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 4532)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4533)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4534) ei_copysign( tx, x, one, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 4535) if( ei_cmp( tx, small, nb ) > 0 ) /* if( x > small ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 4536) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 4537) ei_mul( z, x, x, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 4538) ei_sinh__S( p, z, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 4539) ei_cosh__C( q, z, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 4540)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4541) ei_mul( xp, x, p, nb ); /* xp = x*p; */
868b2b66 (kx 2024-12-20 16:11:07 +0300 4542) ei_mul( xh, x, half, nb ); /* xh = x*half; */
868b2b66 (kx 2024-12-20 16:11:07 +0300 4543)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4544) ei_sub( tx, q, xp, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 4545) ei_sub( w, xh, tx, nb ); /* w = xh-(q-xp); */
868b2b66 (kx 2024-12-20 16:11:07 +0300 4546)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4547) ei_add( p, p, p, nb ); /* p = p + p; */
868b2b66 (kx 2024-12-20 16:11:07 +0300 4548)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4549) ei_add( tx, p, xp, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 4550) ei_sub( tx, q, tx, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 4551) ei_mul( tr, xh, w, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 4552) ei_sub( tx, tr, tx, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 4553) ei_sub( tr, one, w, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 4554) ei_div( tx, tx, tr, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 4555) ei_add( tx, tx, c, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 4556) ei_mul( tx, x, tx, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 4557) ei_add( c, c, tx, nb ); /* c+=x*[(xh*w-(q-(p+xp)))/(one-w)+c]; */
868b2b66 (kx 2024-12-20 16:11:07 +0300 4558)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4559) ei_mul( tr, z, half, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 4560) ei_add( tr, tr, c, nb ); /* return( z*half+c ); */
868b2b66 (kx 2024-12-20 16:11:07 +0300 4561)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4562) ei_copy( eiy, tr, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 4563)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4564) /* FREE z *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4565) /* FREE c *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4566) /* FREE p *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4567) /* FREE q *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4568) /* FREE xp ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4569) /* FREE xh ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4570) /* FREE w *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4571) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4572) /* FREE tx ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4573) /* FREE tr ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4574) /* FREE half **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4575) /* FREE one ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4576) /* FREE zero **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4577) __mpu_sbrk( -(int)(13*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 4578) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4579)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4580) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4581) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 4582) else /* т.е. ( |x| < small ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 4583) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 4584) if( ei_cmp( x, zero, nb ) != 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 4585) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 4586) /* raise the inexact flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 4587) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 4588)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4589) /* return( copysign(zero,x) ); */
868b2b66 (kx 2024-12-20 16:11:07 +0300 4590) ei_copysign( eiy, zero, x, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 4591)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4592) /* FREE z *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4593) /* FREE c *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4594) /* FREE p *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4595) /* FREE q *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4596) /* FREE xp ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4597) /* FREE xh ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4598) /* FREE w *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4599) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4600) /* FREE tx ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4601) /* FREE tr ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4602) /* FREE half **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4603) /* FREE one ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4604) /* FREE zero **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4605) __mpu_sbrk( -(int)(13*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 4606) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4607)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4608) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4609) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 4610)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4611) } /* End of __ei_exp__E() */
868b2b66 (kx 2024-12-20 16:11:07 +0300 4612)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4613)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4614) void ei_expm1( EMUSHORT *eiy, EMUSHORT *eix, int nb )
868b2b66 (kx 2024-12-20 16:11:07 +0300 4615) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 4616)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4617) Description : ei_expm1() Работает с
868b2b66 (kx 2024-12-20 16:11:07 +0300 4618) internal e-type data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300 4619)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4620) Concepts : EI_EXPM1(EIX) RETURN in EIY
868b2b66 (kx 2024-12-20 16:11:07 +0300 4621) THE EXPONENTIAL OF EIX MINUS ONE.
868b2b66 (kx 2024-12-20 16:11:07 +0300 4622)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4623) METHOD :
868b2b66 (kx 2024-12-20 16:11:07 +0300 4624) 1. Argument Reduction: given the input EIX,
868b2b66 (kx 2024-12-20 16:11:07 +0300 4625) find r and integer k such that
868b2b66 (kx 2024-12-20 16:11:07 +0300 4626) EIX = k*ln2 + r, |r| <= 0.5*ln2 .
868b2b66 (kx 2024-12-20 16:11:07 +0300 4627) r will be represented as r = z+c for better
868b2b66 (kx 2024-12-20 16:11:07 +0300 4628) accuracy.
868b2b66 (kx 2024-12-20 16:11:07 +0300 4629)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4630) 2. Compute EI_EXPM1(r) = exp(r)-1 by
868b2b66 (kx 2024-12-20 16:11:07 +0300 4631)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4632) EI_EXPM1(r=z+c) := z + __ei_exp__E(z,c)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4633)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4634) 3. EI_EXPM1(x) = 2^k*(EI_EXPM1(r) + 1-2^-k).
868b2b66 (kx 2024-12-20 16:11:07 +0300 4635)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4636) Remarks:
868b2b66 (kx 2024-12-20 16:11:07 +0300 4637) 1. When k=1 and z < -0.25, we use the
868b2b66 (kx 2024-12-20 16:11:07 +0300 4638) following formula for better accuracy:
868b2b66 (kx 2024-12-20 16:11:07 +0300 4639) EI_EXPM1(x) = 2*((z+0.5)+__ei_exp__E(z,c)).
868b2b66 (kx 2024-12-20 16:11:07 +0300 4640) 2. To avoid rounding error in 1-2^-k where
868b2b66 (kx 2024-12-20 16:11:07 +0300 4641) k is large, we use
868b2b66 (kx 2024-12-20 16:11:07 +0300 4642) EI_EXPM1(x) =
868b2b66 (kx 2024-12-20 16:11:07 +0300 4643) = 2^k*{[z+(__ei_exp__E(z,c)-2^-k )] + 1}
868b2b66 (kx 2024-12-20 16:11:07 +0300 4644) when k > NSBITS(nb).
868b2b66 (kx 2024-12-20 16:11:07 +0300 4645)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4646) ACCURACY : In the absence of rounding error,
868b2b66 (kx 2024-12-20 16:11:07 +0300 4647) the appriximation has absolute error
868b2b66 (kx 2024-12-20 16:11:07 +0300 4648) less than EPSILON [see: mpu-float.h].
868b2b66 (kx 2024-12-20 16:11:07 +0300 4649)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4650)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4651) SPECIAL CASES : expm1(+NaN) = +NaN с выставлением DOMAIN flag;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4652) expm1(-NaN) = -NaN с выставлением DOMAIN flag;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4653) expm1(-inf) = -1 [норма];
868b2b66 (kx 2024-12-20 16:11:07 +0300 4654) expm1(+inf) = +inf [норма];
868b2b66 (kx 2024-12-20 16:11:07 +0300 4655) expm1(0) = 0 [норма];
868b2b66 (kx 2024-12-20 16:11:07 +0300 4656)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4657) Use Global Variable:
868b2b66 (kx 2024-12-20 16:11:07 +0300 4658)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4659) Use Functions : __ei_exp__E( eiy, eix, nb ); | this file
868b2b66 (kx 2024-12-20 16:11:07 +0300 4660) ei_copy( eiy, eix, nb ); | mpu-real.c
868b2b66 (kx 2024-12-20 16:11:07 +0300 4661) .
868b2b66 (kx 2024-12-20 16:11:07 +0300 4662) .
868b2b66 (kx 2024-12-20 16:11:07 +0300 4663) .
868b2b66 (kx 2024-12-20 16:11:07 +0300 4664)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4665) Parameters : EMUSHORT *eiy; - указатель на
868b2b66 (kx 2024-12-20 16:11:07 +0300 4666) internal e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300 4667) data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300 4668) TARGET;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4669) EMUSHORT *eix; - указатель на
868b2b66 (kx 2024-12-20 16:11:07 +0300 4670) internal e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300 4671) data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300 4672) SOURCE;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4673) int nb; - количество бит в
868b2b66 (kx 2024-12-20 16:11:07 +0300 4674) external e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300 4675) data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300 4676)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4677) Return : [void]
868b2b66 (kx 2024-12-20 16:11:07 +0300 4678)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4679) ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4680) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 4681) EMUSHORT *x = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 4682) *z = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 4683) *hi = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 4684) *lo = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 4685) *c = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 4686) *zero = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 4687) *half = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 4688) *one = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 4689) *negone = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 4690) *quart = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 4691) *tx = NULL, /* temp */
868b2b66 (kx 2024-12-20 16:11:07 +0300 4692) *tm = NULL, /* temp */
868b2b66 (kx 2024-12-20 16:11:07 +0300 4693) *tk = NULL; /* temp */
868b2b66 (kx 2024-12-20 16:11:07 +0300 4694)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4695) EMUSHORT *k = NULL, /* for Exponent */
868b2b66 (kx 2024-12-20 16:11:07 +0300 4696) *mk = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 4697) *prec1 = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 4698) *prec2 = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 4699) *kone = NULL; /* temp 1 */
868b2b66 (kx 2024-12-20 16:11:07 +0300 4700) EMUSHORT *ln2hi, *ln2lo, *invln2, *lnhuge, *lntiny;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4701) EMUSHORT prec;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4702) int np, ne, i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4703)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4704)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4705) if( nb < NBR_32 || nb > MPU_MATH_FN_LIMIT )
868b2b66 (kx 2024-12-20 16:11:07 +0300 4706) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 4707) /* error: Invalid size of operand(s) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 4708) __real_invalid_size( (__mpu_char8_t *)"expm1" );
868b2b66 (kx 2024-12-20 16:11:07 +0300 4709) /* ei_ind( eiy, nb ); *//* Invalid NB */
868b2b66 (kx 2024-12-20 16:11:07 +0300 4710) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4711) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 4712)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4713) /*******************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 4714) Hight Precision for r32, r64.
868b2b66 (kx 2024-12-20 16:11:07 +0300 4715) *******************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4716) if( nb < NBR_128 ) nb = NBR_128;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4717)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4718) np = internal_np( nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 4719)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4720) /*** Allocate memory for x . ********************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4721) x = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 4722) if( !x )
868b2b66 (kx 2024-12-20 16:11:07 +0300 4723) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 4724) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 4725) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4726) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 4727) /************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4728)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4729)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4730) ei_copy( x, eix, nb ); /* temp for _mtherr() */
868b2b66 (kx 2024-12-20 16:11:07 +0300 4731)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4732) /***************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 4733) Test for EIX.
868b2b66 (kx 2024-12-20 16:11:07 +0300 4734) ***************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4735) /* EXPM1(InD) must by InD */
868b2b66 (kx 2024-12-20 16:11:07 +0300 4736) if( ei_isind( eix, nb ) )
868b2b66 (kx 2024-12-20 16:11:07 +0300 4737) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 4738) /* "argument domain error" */
868b2b66 (kx 2024-12-20 16:11:07 +0300 4739) /* return: InD */
868b2b66 (kx 2024-12-20 16:11:07 +0300 4740) ei_copy( eiy, eix, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 4741) /***************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 4742) NOTE:
868b2b66 (kx 2024-12-20 16:11:07 +0300 4743) Функция _mtherr() является переходником между
868b2b66 (kx 2024-12-20 16:11:07 +0300 4744) внутренним форматом и внешней,
868b2b66 (kx 2024-12-20 16:11:07 +0300 4745) переопределяемой пользователем, функцией
868b2b66 (kx 2024-12-20 16:11:07 +0300 4746) _math_error(). Кроме основных действий она
868b2b66 (kx 2024-12-20 16:11:07 +0300 4747) выставляет системную переменную errno
868b2b66 (kx 2024-12-20 16:11:07 +0300 4748) следующим образом.
868b2b66 (kx 2024-12-20 16:11:07 +0300 4749)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4750) errno = __mpu_math_errnotab[type];
868b2b66 (kx 2024-12-20 16:11:07 +0300 4751) ***************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4752) _mtherr( eiy, (__mpu_char8_t *)"expm1", __DOMAIN__,
868b2b66 (kx 2024-12-20 16:11:07 +0300 4753) eiy, x, (EMUSHORT *)0, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 4754) __STDOM; /* InD - produsing Domain Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 4755)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4756) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4757) __mpu_sbrk( -(int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 4758) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4759)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4760) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4761) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 4762) /* EXPM1(NaN) must by NaN */
868b2b66 (kx 2024-12-20 16:11:07 +0300 4763) if( ei_isnans( eix, nb ) )
868b2b66 (kx 2024-12-20 16:11:07 +0300 4764) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 4765) /* "argument domain error" */
868b2b66 (kx 2024-12-20 16:11:07 +0300 4766) /* return: NaN */
868b2b66 (kx 2024-12-20 16:11:07 +0300 4767) ei_copy( eiy, eix, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 4768) /***************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 4769) NOTE:
868b2b66 (kx 2024-12-20 16:11:07 +0300 4770) Функция _mtherr() является переходником между
868b2b66 (kx 2024-12-20 16:11:07 +0300 4771) внутренним форматом и внешней,
868b2b66 (kx 2024-12-20 16:11:07 +0300 4772) переопределяемой пользователем, функцией
868b2b66 (kx 2024-12-20 16:11:07 +0300 4773) _math_error(). Кроме основных действий она
868b2b66 (kx 2024-12-20 16:11:07 +0300 4774) выставляет системную переменную errno
868b2b66 (kx 2024-12-20 16:11:07 +0300 4775) следующим образом.
868b2b66 (kx 2024-12-20 16:11:07 +0300 4776)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4777) errno = __mpu_math_errnotab[type];
868b2b66 (kx 2024-12-20 16:11:07 +0300 4778) ***************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4779) _mtherr( eiy, (__mpu_char8_t *)"expm1", __DOMAIN__,
868b2b66 (kx 2024-12-20 16:11:07 +0300 4780) eiy, x, (EMUSHORT *)0, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 4781) __STDOM; /* NaN - produsing Domain Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 4782)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4783) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4784) __mpu_sbrk( -(int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 4785) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4786)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4787) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4788) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 4789)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4790)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4791) ne = internal_ne( nb ) + 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4792)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4793) /*** Allocate memory for z, hi, lo, c . *******************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4794) z = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 4795) if( !z )
868b2b66 (kx 2024-12-20 16:11:07 +0300 4796) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 4797) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 4798)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4799) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4800) __mpu_sbrk( -(int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 4801) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4802)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4803) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4804) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 4805)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4806) hi = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 4807) if( !hi )
868b2b66 (kx 2024-12-20 16:11:07 +0300 4808) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 4809) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 4810)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4811) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4812) /* FREE z *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4813) __mpu_sbrk( -(int)(2*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 4814) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4815)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4816) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4817) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 4818)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4819) lo = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 4820) if( !lo )
868b2b66 (kx 2024-12-20 16:11:07 +0300 4821) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 4822) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 4823)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4824) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4825) /* FREE z *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4826) /* FREE hi ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4827) __mpu_sbrk( -(int)(3*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 4828) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4829)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4830) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4831) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 4832)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4833) c = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 4834) if( !c )
868b2b66 (kx 2024-12-20 16:11:07 +0300 4835) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 4836) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 4837)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4838) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4839) /* FREE z *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4840) /* FREE hi ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4841) /* FREE lo ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4842) __mpu_sbrk( -(int)(4*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 4843) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4844)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4845) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4846) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 4847) /************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4848)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4849) /*** Allocate memory for zero, half, one, negone, quart . ***/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4850) zero = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 4851) if( !zero )
868b2b66 (kx 2024-12-20 16:11:07 +0300 4852) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 4853) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 4854)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4855) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4856) /* FREE z *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4857) /* FREE hi ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4858) /* FREE lo ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4859) /* FREE c *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4860) __mpu_sbrk( -(int)(5*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 4861) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4862)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4863) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4864) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 4865)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4866) half = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 4867) if( !half )
868b2b66 (kx 2024-12-20 16:11:07 +0300 4868) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 4869) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 4870)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4871) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4872) /* FREE z *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4873) /* FREE hi ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4874) /* FREE lo ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4875) /* FREE c *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4876) /* FREE zero **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4877) __mpu_sbrk( -(int)(6*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 4878) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4879)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4880) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4881) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 4882)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4883) one = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 4884) if( !one )
868b2b66 (kx 2024-12-20 16:11:07 +0300 4885) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 4886) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 4887)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4888) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4889) /* FREE z *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4890) /* FREE hi ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4891) /* FREE lo ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4892) /* FREE c *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4893) /* FREE zero **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4894) /* FREE half **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4895) __mpu_sbrk( -(int)(7*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 4896) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4897)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4898) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4899) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 4900)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4901) negone = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 4902) if( !negone )
868b2b66 (kx 2024-12-20 16:11:07 +0300 4903) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 4904) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 4905)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4906) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4907) /* FREE z *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4908) /* FREE hi ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4909) /* FREE lo ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4910) /* FREE c *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4911) /* FREE zero **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4912) /* FREE half **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4913) /* FREE one ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4914) __mpu_sbrk( -(int)(8*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 4915) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4916)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4917) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4918) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 4919)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4920) quart = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 4921) if( !quart )
868b2b66 (kx 2024-12-20 16:11:07 +0300 4922) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 4923) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 4924)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4925) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4926) /* FREE z *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4927) /* FREE hi ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4928) /* FREE lo ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4929) /* FREE c *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4930) /* FREE zero **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4931) /* FREE half **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4932) /* FREE one ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4933) /* FREE negone ************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4934) __mpu_sbrk( -(int)(9*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 4935) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4936)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4937) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4938) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 4939) /************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4940)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4941) /*** Allocate memory for tx, tm, tk . ***********************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4942) tx = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 4943) if( !tx )
868b2b66 (kx 2024-12-20 16:11:07 +0300 4944) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 4945) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 4946)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4947) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4948) /* FREE z *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4949) /* FREE hi ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4950) /* FREE lo ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4951) /* FREE c *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4952) /* FREE zero **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4953) /* FREE half **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4954) /* FREE one ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4955) /* FREE negone ************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4956) /* FREE quart *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4957) __mpu_sbrk( -(int)(10*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 4958) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4959)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4960) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4961) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 4962)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4963) tm = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 4964) if( !tm )
868b2b66 (kx 2024-12-20 16:11:07 +0300 4965) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 4966) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 4967)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4968) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4969) /* FREE z *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4970) /* FREE hi ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4971) /* FREE lo ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4972) /* FREE c *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4973) /* FREE zero **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4974) /* FREE half **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4975) /* FREE one ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4976) /* FREE negone ************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4977) /* FREE quart *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4978) /* FREE tx ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4979) __mpu_sbrk( -(int)(11*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 4980) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4981)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4982) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4983) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 4984)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4985) tk = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 4986) if( !tk )
868b2b66 (kx 2024-12-20 16:11:07 +0300 4987) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 4988) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 4989)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4990) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4991) /* FREE z *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4992) /* FREE hi ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4993) /* FREE lo ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4994) /* FREE c *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4995) /* FREE zero **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4996) /* FREE half **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4997) /* FREE one ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4998) /* FREE negone ************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4999) /* FREE quart *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5000) /* FREE tx ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5001) /* FREE tm ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5002) __mpu_sbrk( -(int)(12*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 5003) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5004)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5005) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5006) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 5007) /************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5008)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5009)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5010) /*** Allocate memory for k, mk, prec1, prec2, kone . ********/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5011) k = (EMUSHORT *)__mpu_sbrk( (int)(ne*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 5012) if( !k )
868b2b66 (kx 2024-12-20 16:11:07 +0300 5013) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 5014) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 5015)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5016) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5017) /* FREE z *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5018) /* FREE hi ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5019) /* FREE lo ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5020) /* FREE c *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5021) /* FREE zero **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5022) /* FREE half **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5023) /* FREE one ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5024) /* FREE negone ************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5025) /* FREE quart *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5026) /* FREE tx ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5027) /* FREE tm ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5028) /* FREE tk ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5029) __mpu_sbrk( -(int)(13*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 5030) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5031)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5032) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5033) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 5034)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5035) mk = (EMUSHORT *)__mpu_sbrk( (int)(ne*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 5036) if( !mk )
868b2b66 (kx 2024-12-20 16:11:07 +0300 5037) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 5038) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 5039)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5040) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5041) /* FREE z *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5042) /* FREE hi ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5043) /* FREE lo ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5044) /* FREE c *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5045) /* FREE zero **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5046) /* FREE half **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5047) /* FREE one ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5048) /* FREE negone ************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5049) /* FREE quart *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5050) /* FREE tx ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5051) /* FREE tm ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5052) /* FREE tk ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5053) __mpu_sbrk( -(int)(13*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 5054) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5055)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5056) /* FREE k *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5057) __mpu_sbrk( -(int)(ne*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 5058) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5059)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5060) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5061) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 5062)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5063) prec1 = (EMUSHORT *)__mpu_sbrk( (int)(ne*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 5064) if( !prec1 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 5065) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 5066) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 5067)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5068) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5069) /* FREE z *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5070) /* FREE hi ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5071) /* FREE lo ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5072) /* FREE c *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5073) /* FREE zero **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5074) /* FREE half **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5075) /* FREE one ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5076) /* FREE negone ************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5077) /* FREE quart *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5078) /* FREE tx ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5079) /* FREE tm ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5080) /* FREE tk ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5081) __mpu_sbrk( -(int)(13*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 5082) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5083)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5084) /* FREE k *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5085) /* FREE mk ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5086) __mpu_sbrk( -(int)(2*ne*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 5087) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5088)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5089) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5090) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 5091)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5092) prec2 = (EMUSHORT *)__mpu_sbrk( (int)(ne*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 5093) if( !prec2 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 5094) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 5095) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 5096)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5097) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5098) /* FREE z *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5099) /* FREE hi ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5100) /* FREE lo ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5101) /* FREE c *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5102) /* FREE zero **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5103) /* FREE half **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5104) /* FREE one ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5105) /* FREE negone ************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5106) /* FREE quart *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5107) /* FREE tx ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5108) /* FREE tm ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5109) /* FREE tk ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5110) __mpu_sbrk( -(int)(13*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 5111) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5112)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5113) /* FREE k *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5114) /* FREE mk ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5115) /* FREE prec1 *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5116) __mpu_sbrk( -(int)(3*ne*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 5117) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5118)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5119) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5120) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 5121)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5122) kone = (EMUSHORT *)__mpu_sbrk( (int)(ne*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 5123) if( !kone )
868b2b66 (kx 2024-12-20 16:11:07 +0300 5124) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 5125) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 5126)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5127) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5128) /* FREE z *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5129) /* FREE hi ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5130) /* FREE lo ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5131) /* FREE c *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5132) /* FREE zero **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5133) /* FREE half **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5134) /* FREE one ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5135) /* FREE negone ************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5136) /* FREE quart *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5137) /* FREE tx ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5138) /* FREE tm ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5139) /* FREE tk ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5140) __mpu_sbrk( -(int)(13*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 5141) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5142)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5143) /* FREE k *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5144) /* FREE mk ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5145) /* FREE prec1 *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5146) /* FREE prec2 *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5147) __mpu_sbrk( -(int)(4*ne*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 5148) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5149)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5150) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5151) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 5152) /************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5153)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5154)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5155) /* _gen( kone = 1 ); */
868b2b66 (kx 2024-12-20 16:11:07 +0300 5156) for( i = 0; i < ne; i++ ) kone[i] = (EMUSHORT)0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5157) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 5158) kone[ne-1] = (EMUSHORT)1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5159) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 5160) kone[0] = (EMUSHORT)1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5161) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 5162)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5163) prec = NSBITS(nb);
868b2b66 (kx 2024-12-20 16:11:07 +0300 5164) ei_cpye_unpack( prec1, (EMUSHORT *)&prec, ne, 1 );
868b2b66 (kx 2024-12-20 16:11:07 +0300 5165) ei_shln( prec2, prec1, ne, ne );
868b2b66 (kx 2024-12-20 16:11:07 +0300 5166)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5167) ln2hi = _get_m_ln2hi_ptr( nb ); /* Service Constant */
868b2b66 (kx 2024-12-20 16:11:07 +0300 5168) ln2lo = _get_m_ln2lo_ptr( nb ); /* Service Constant */
868b2b66 (kx 2024-12-20 16:11:07 +0300 5169) lnhuge = _get_m_ln_huge_ptr( nb ); /* Service Constant */
868b2b66 (kx 2024-12-20 16:11:07 +0300 5170) lntiny = _get_m_ln_tiny_ptr( nb ); /* Service Constant */
868b2b66 (kx 2024-12-20 16:11:07 +0300 5171) invln2 = _get_m_1_ln2_ptr( nb ); /* Math Constant */
868b2b66 (kx 2024-12-20 16:11:07 +0300 5172)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5173) _gen_zero( zero, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 5174) _gen_half( half, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 5175) _gen_one ( one, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 5176) _gen_one ( negone, nb ); /* Befor test +/-inf */
868b2b66 (kx 2024-12-20 16:11:07 +0300 5177) ei_neg ( negone, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 5178) _gen_two ( quart, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 5179) ei_div( quart, half, quart, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 5180) ei_neg ( quart, nb ); /* quart = -0.25; */
868b2b66 (kx 2024-12-20 16:11:07 +0300 5181)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5182) /* ei_copy( x, eix, nb ); */
868b2b66 (kx 2024-12-20 16:11:07 +0300 5183)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5184)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5185) if( ei_cmp( x, lnhuge, nb ) <= 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 5186) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 5187) if( ei_cmp( x, lntiny, nb ) >= 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 5188) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 5189) /********************
868b2b66 (kx 2024-12-20 16:11:07 +0300 5190) Argument reduction
868b2b66 (kx 2024-12-20 16:11:07 +0300 5191) ********************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5192) ei_copysign( tm, half, x, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 5193) ei_mul( tx, invln2, x, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 5194) ei_add( tx, tx, tm, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 5195) /* begin : *********************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 5196) k = _REALtoINT(x/ln(2)).
868b2b66 (kx 2024-12-20 16:11:07 +0300 5197) *******************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5198) ei_rtol_frac( k, /* k = tx; */
868b2b66 (kx 2024-12-20 16:11:07 +0300 5199) (EMUSHORT *)0,
868b2b66 (kx 2024-12-20 16:11:07 +0300 5200) tx, ne, nb ); /* k = _RtoINT(x/ln2); */
868b2b66 (kx 2024-12-20 16:11:07 +0300 5201) ei_ltor( tk, k, nb, ne ); /* tk = k; */
868b2b66 (kx 2024-12-20 16:11:07 +0300 5202) /* end : ***********************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 5203) k = _REALtoINT(x/ln(2)).
868b2b66 (kx 2024-12-20 16:11:07 +0300 5204) *******************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5205) ei_mul( tx, tk, ln2hi, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 5206) ei_sub( hi, x, tx, nb ); /* hi = x-k*ln2hi; */
868b2b66 (kx 2024-12-20 16:11:07 +0300 5207) ei_mul( lo, tk, ln2lo, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 5208) ei_sub( z, hi, lo, nb ); /* z = hi-(lo=k*ln2lo); */
868b2b66 (kx 2024-12-20 16:11:07 +0300 5209) ei_sub( tm, hi, z, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 5210) ei_sub( c, tm, lo, nb ); /* c = (hi-z)-lo; */
868b2b66 (kx 2024-12-20 16:11:07 +0300 5211)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5212) if( ei_cmp0e( k, ne ) == 0 ) /* if( k == 0 ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 5213) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 5214) __ei_exp__E( tx, z, c, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 5215) ei_add( eiy, z, tx, nb ); /* return(z+__ei_exp__E(z,c)); */
868b2b66 (kx 2024-12-20 16:11:07 +0300 5216)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5217) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5218) /* FREE z *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5219) /* FREE hi ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5220) /* FREE lo ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5221) /* FREE c *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5222) /* FREE zero **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5223) /* FREE half **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5224) /* FREE one ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5225) /* FREE negone ************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5226) /* FREE quart *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5227) /* FREE tx ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5228) /* FREE tm ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5229) /* FREE tk ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5230) __mpu_sbrk( -(int)(13*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 5231) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5232)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5233) /* FREE k *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5234) /* FREE mk ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5235) /* FREE prec1 *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5236) /* FREE prec2 *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5237) /* FREE kone **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5238) __mpu_sbrk( -(int)(5*ne*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 5239) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5240)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5241) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5242)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5243) } /* End if( k == 0 ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 5244)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5245) if( ei_cmpe( k, kone, ne ) == 0 ) /* if( k == 1 ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 5246) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 5247) if( ei_cmp( z, quart, nb ) < 0 ) /* if( z < -0.25 ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 5248) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 5249) ei_add( x, z, half, nb ); /* x = z+half; */
868b2b66 (kx 2024-12-20 16:11:07 +0300 5250) __ei_exp__E( tx, z, c, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 5251) ei_add( x, x, tx, nb ); /* x += __ei_exp__E(z,c); */
868b2b66 (kx 2024-12-20 16:11:07 +0300 5252)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5253) ei_add( eiy, x, x, nb ); /* return( x + x ); */
868b2b66 (kx 2024-12-20 16:11:07 +0300 5254)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5255) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5256) /* FREE z *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5257) /* FREE hi ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5258) /* FREE lo ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5259) /* FREE c *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5260) /* FREE zero **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5261) /* FREE half **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5262) /* FREE one ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5263) /* FREE negone ************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5264) /* FREE quart *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5265) /* FREE tx ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5266) /* FREE tm ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5267) /* FREE tk ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5268) __mpu_sbrk( -(int)(13*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 5269) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5270)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5271) /* FREE k *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5272) /* FREE mk ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5273) /* FREE prec1 *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5274) /* FREE prec2 *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5275) /* FREE kone **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5276) __mpu_sbrk( -(int)(5*ne*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 5277) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5278)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5279) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5280) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 5281) else
868b2b66 (kx 2024-12-20 16:11:07 +0300 5282) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 5283) __ei_exp__E( tx, z, c, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 5284) ei_add( z, z, tx, nb ); /* z += __ei_exp__E(z,c); */
868b2b66 (kx 2024-12-20 16:11:07 +0300 5285) ei_add( x, half, z, nb ); /* x = half+z; */
868b2b66 (kx 2024-12-20 16:11:07 +0300 5286)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5287) ei_add( eiy, x, x, nb ); /* return( x + x ); */
868b2b66 (kx 2024-12-20 16:11:07 +0300 5288)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5289) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5290) /* FREE z *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5291) /* FREE hi ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5292) /* FREE lo ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5293) /* FREE c *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5294) /* FREE zero **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5295) /* FREE half **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5296) /* FREE one ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5297) /* FREE negone ************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5298) /* FREE quart *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5299) /* FREE tx ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5300) /* FREE tm ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5301) /* FREE tk ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5302) __mpu_sbrk( -(int)(13*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 5303) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5304)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5305) /* FREE k *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5306) /* FREE mk ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5307) /* FREE prec1 *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5308) /* FREE prec2 *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5309) /* FREE kone **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5310) __mpu_sbrk( -(int)(5*ne*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 5311) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5312)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5313) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5314) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 5315)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5316) } /* End if( k == 1 ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 5317) else
868b2b66 (kx 2024-12-20 16:11:07 +0300 5318) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 5319) ei_nege( mk, k, ne ); /* mk = -k; */
868b2b66 (kx 2024-12-20 16:11:07 +0300 5320) if( ei_cmpe( k, prec1, ne ) <= 0 ) /* if( k <= prec1 ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 5321) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 5322) ei_ldexp( tx, mk, one, ne, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 5323) ei_sub( x, one, tx, nb ); /* x = one-ldexp(one,-k); */
868b2b66 (kx 2024-12-20 16:11:07 +0300 5324) __ei_exp__E( tx, z, c, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 5325) ei_add( z, z, tx, nb ); /* z += __ei_exp__E(z,c); */
868b2b66 (kx 2024-12-20 16:11:07 +0300 5326) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 5327) else if( ei_cmpe( k, prec2, ne ) < 0 ) /* if( k < prec2 ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 5328) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 5329) /* x = __ei_exp__E(z,c)-ldexp(one,-k); */
868b2b66 (kx 2024-12-20 16:11:07 +0300 5330) __ei_exp__E( tx, z, c, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 5331) ei_ldexp( tm, mk, one, ne, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 5332) ei_sub( x, tx, tm, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 5333)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5334) ei_add( x, x, z, nb ); /* x += z; */
868b2b66 (kx 2024-12-20 16:11:07 +0300 5335) ei_copy( z, one, nb ); /* z = one; */
868b2b66 (kx 2024-12-20 16:11:07 +0300 5336) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 5337) else
868b2b66 (kx 2024-12-20 16:11:07 +0300 5338) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 5339) __ei_exp__E( tx, z, c, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 5340) ei_add( x, tx, z, nb ); /* x = __ei_exp__E(z,c)+z; */
868b2b66 (kx 2024-12-20 16:11:07 +0300 5341)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5342) ei_copy( z, one, nb ); /* z = one; */
868b2b66 (kx 2024-12-20 16:11:07 +0300 5343) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 5344)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5345) ei_add( tx, x, z, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 5346) ei_ldexp( eiy, k, tx, ne, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 5347)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5348) /* return( ldexp(x+z,k) ); */
868b2b66 (kx 2024-12-20 16:11:07 +0300 5349)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5350) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5351) /* FREE z *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5352) /* FREE hi ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5353) /* FREE lo ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5354) /* FREE c *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5355) /* FREE zero **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5356) /* FREE half **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5357) /* FREE one ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5358) /* FREE negone ************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5359) /* FREE quart *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5360) /* FREE tx ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5361) /* FREE tm ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5362) /* FREE tk ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5363) __mpu_sbrk( -(int)(13*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 5364) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5365)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5366) /* FREE k *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5367) /* FREE mk ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5368) /* FREE prec1 *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5369) /* FREE prec2 *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5370) /* FREE kone **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5371) __mpu_sbrk( -(int)(5*ne*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 5372) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5373)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5374) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5375) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 5376)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5377) } /* End if( x >= lntiny ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 5378) else
868b2b66 (kx 2024-12-20 16:11:07 +0300 5379) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 5380) /* ( x <= lntiny ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 5381) /****************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 5382) EXPM1(-Infinity) must by -1.0 [exact];
868b2b66 (kx 2024-12-20 16:11:07 +0300 5383) ****************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5384) if( !ei_isinfin( eix, nb ) )
868b2b66 (kx 2024-12-20 16:11:07 +0300 5385) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 5386) /* raise the inexact flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 5387) /* -big# - rounded to -1.0 (inexact) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 5388) /* return: -1.0 ( after if(){} body ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 5389) ei_copy( x, eix, nb ); /* for &eiy == &eix */
868b2b66 (kx 2024-12-20 16:11:07 +0300 5390)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5391) ei_copy( eiy, negone, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 5392) /***************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 5393) NOTE:
868b2b66 (kx 2024-12-20 16:11:07 +0300 5394) Функция _mtherr() является переходником между
868b2b66 (kx 2024-12-20 16:11:07 +0300 5395) внутренним форматом и внешней,
868b2b66 (kx 2024-12-20 16:11:07 +0300 5396) переопределяемой пользователем, функцией
868b2b66 (kx 2024-12-20 16:11:07 +0300 5397) _math_error(). Кроме основных действий она
868b2b66 (kx 2024-12-20 16:11:07 +0300 5398) выставляет системную переменную errno
868b2b66 (kx 2024-12-20 16:11:07 +0300 5399) следующим образом.
868b2b66 (kx 2024-12-20 16:11:07 +0300 5400)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5401) errno = __mpu_math_errnotab[type];
868b2b66 (kx 2024-12-20 16:11:07 +0300 5402) ***************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5403) _mtherr( eiy, /* Non change */
868b2b66 (kx 2024-12-20 16:11:07 +0300 5404) (__mpu_char8_t *)"expm1", __INEXACT__,
868b2b66 (kx 2024-12-20 16:11:07 +0300 5405) eiy, x, (EMUSHORT *)0, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 5406) __STINX; /* -big# - produsing Inexact Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 5407) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 5408) ei_copy( eiy, negone, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 5409)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5410) } /* End of ( x <= lntiny ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 5411)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5412) } /* End if( x <= lnhuge ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 5413) else
868b2b66 (kx 2024-12-20 16:11:07 +0300 5414) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 5415) /* ( x >= lnhuge ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 5416) /****************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 5417) EXPM1(+Infinity) must by +Inf [exact];
868b2b66 (kx 2024-12-20 16:11:07 +0300 5418) ****************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5419) if( !ei_isinfin( eix, nb ) )
868b2b66 (kx 2024-12-20 16:11:07 +0300 5420) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 5421) /* raise the inexact flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 5422) /* +big# - overflow to +Inf */
868b2b66 (kx 2024-12-20 16:11:07 +0300 5423) /* return: +Infinity ( after if(){} body ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 5424) ei_copy( x, eix, nb ); /* for &eiy == &eix */
868b2b66 (kx 2024-12-20 16:11:07 +0300 5425)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5426) ei_infin( eiy, (unsigned)0, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 5427) /***************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 5428) NOTE:
868b2b66 (kx 2024-12-20 16:11:07 +0300 5429) Функция _mtherr() является переходником между
868b2b66 (kx 2024-12-20 16:11:07 +0300 5430) внутренним форматом и внешней,
868b2b66 (kx 2024-12-20 16:11:07 +0300 5431) переопределяемой пользователем, функцией
868b2b66 (kx 2024-12-20 16:11:07 +0300 5432) _math_error(). Кроме основных действий она
868b2b66 (kx 2024-12-20 16:11:07 +0300 5433) выставляет системную переменную __error_no
868b2b66 (kx 2024-12-20 16:11:07 +0300 5434) следующим образом.
868b2b66 (kx 2024-12-20 16:11:07 +0300 5435)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5436) __error_no = __mpu_math_errnotab[type];
868b2b66 (kx 2024-12-20 16:11:07 +0300 5437) ***************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5438) _mtherr( eiy, /* Non change */
868b2b66 (kx 2024-12-20 16:11:07 +0300 5439) (__mpu_char8_t *)"expm1", __INEXACT__,
868b2b66 (kx 2024-12-20 16:11:07 +0300 5440) eiy, x, (EMUSHORT *)0, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 5441) __STINX; /* +big# - produsing Inexact Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 5442) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 5443) ei_infin( eiy, (unsigned)0, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 5444)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5445) } /* End of ( x >= lnhuge ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 5446)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5447) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5448) /* FREE z *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5449) /* FREE hi ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5450) /* FREE lo ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5451) /* FREE c *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5452) /* FREE zero **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5453) /* FREE half **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5454) /* FREE one ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5455) /* FREE negone ************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5456) /* FREE quart *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5457) /* FREE tx ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5458) /* FREE tm ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5459) /* FREE tk ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5460) __mpu_sbrk( -(int)(13*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 5461) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5462)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5463) /* FREE k *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5464) /* FREE mk ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5465) /* FREE prec1 *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5466) /* FREE prec2 *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5467) /* FREE kone **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5468) __mpu_sbrk( -(int)(5*ne*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 5469) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5470)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5471) } /* End of ei_expm1() */
868b2b66 (kx 2024-12-20 16:11:07 +0300 5472)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5473)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5474) void ei_exp( EMUSHORT *eiy, EMUSHORT *eix, int nb )
868b2b66 (kx 2024-12-20 16:11:07 +0300 5475) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 5476)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5477) Description : ei_exp() Работает с
868b2b66 (kx 2024-12-20 16:11:07 +0300 5478) internal e-type data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300 5479)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5480) Concepts : EI_EXP(EIX) RETURN in EIY
868b2b66 (kx 2024-12-20 16:11:07 +0300 5481) THE EXPONENTIAL OF EIX.
868b2b66 (kx 2024-12-20 16:11:07 +0300 5482)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5483) METHOD :
868b2b66 (kx 2024-12-20 16:11:07 +0300 5484) 1. Argument Reduction: given the input EIX,
868b2b66 (kx 2024-12-20 16:11:07 +0300 5485) find r and integer k such that
868b2b66 (kx 2024-12-20 16:11:07 +0300 5486) EIX = k*ln2 + r, |r| <= 0.5*ln2 .
868b2b66 (kx 2024-12-20 16:11:07 +0300 5487) r will be represented as r = z+c for better
868b2b66 (kx 2024-12-20 16:11:07 +0300 5488) accuracy.
868b2b66 (kx 2024-12-20 16:11:07 +0300 5489)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5490) 2. Compute EXP(r) by
868b2b66 (kx 2024-12-20 16:11:07 +0300 5491)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5492) EXP(r) = 1 + r + r*R1/(2-R1),
868b2b66 (kx 2024-12-20 16:11:07 +0300 5493)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5494) where
868b2b66 (kx 2024-12-20 16:11:07 +0300 5495)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5496) R1 = x - x^2*(p1+x^2*(p2+x^2*( ... ))).
868b2b66 (kx 2024-12-20 16:11:07 +0300 5497)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5498) 3. EI_EXP(x) = 2^k * EXP(r).
868b2b66 (kx 2024-12-20 16:11:07 +0300 5499)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5500) EI_EXP__E() : Построение ряда:
868b2b66 (kx 2024-12-20 16:11:07 +0300 5501) ==============================================================
868b2b66 (kx 2024-12-20 16:11:07 +0300 5502) Известно, что
868b2b66 (kx 2024-12-20 16:11:07 +0300 5503)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5504) exp(x) = 1 + x + (1/2!)*x^2 + (1/3!)*x^3 + ... .
868b2b66 (kx 2024-12-20 16:11:07 +0300 5505)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5506) Мы имеем:
868b2b66 (kx 2024-12-20 16:11:07 +0300 5507)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5508) exp(x) = 1 + x + x*R1/(2-R1);
868b2b66 (kx 2024-12-20 16:11:07 +0300 5509)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5510) следовательно
868b2b66 (kx 2024-12-20 16:11:07 +0300 5511)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5512) x*R1/(2-R1) = (1/2!)*x^2 + (1/3!)*x^3 + ... = E.
868b2b66 (kx 2024-12-20 16:11:07 +0300 5513)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5514) тогда
868b2b66 (kx 2024-12-20 16:11:07 +0300 5515)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5516) (2-R1)/x*R1 = 1/E,
868b2b66 (kx 2024-12-20 16:11:07 +0300 5517) 2/(x*R1) - 1/x = 1/E
868b2b66 (kx 2024-12-20 16:11:07 +0300 5518)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5519) далее
868b2b66 (kx 2024-12-20 16:11:07 +0300 5520)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5521) 2/(x*R1) = (x+E)/(E*x),
868b2b66 (kx 2024-12-20 16:11:07 +0300 5522) (x*R1)/2 = (E*x)/(x+E),
868b2b66 (kx 2024-12-20 16:11:07 +0300 5523) R1 = (2*E*x)/(x*(x+E)).
868b2b66 (kx 2024-12-20 16:11:07 +0300 5524)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5525) Это значит, что
868b2b66 (kx 2024-12-20 16:11:07 +0300 5526) (2/2!)*x^3 + (2/3!)*x^4 + (2/4!)*x^5 + ...
868b2b66 (kx 2024-12-20 16:11:07 +0300 5527) R1 = --------------------------------------------------.
868b2b66 (kx 2024-12-20 16:11:07 +0300 5528) x^2 + (1/2!)*x^3 + (1/3!)*x^4 + (1/4!)*x^5 + ...
868b2b66 (kx 2024-12-20 16:11:07 +0300 5529)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5530) Разделив полином числителя на полином знаменателя можно
868b2b66 (kx 2024-12-20 16:11:07 +0300 5531) получить формулы вычисления коэффициентов p1, p2, p3, ...
868b2b66 (kx 2024-12-20 16:11:07 +0300 5532) полинома
868b2b66 (kx 2024-12-20 16:11:07 +0300 5533)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5534) R1 = p1*z + p2*z^2 + p3*z^3 + ... ,
868b2b66 (kx 2024-12-20 16:11:07 +0300 5535)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5536) где z = x*x.
868b2b66 (kx 2024-12-20 16:11:07 +0300 5537)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5538) Вот все, что нужно для APPROX(), чтобы получить p1, p2, p3, ...
868b2b66 (kx 2024-12-20 16:11:07 +0300 5539) на интервале [0, ln(2)/2] по флгоритму Ремеза.
868b2b66 (kx 2024-12-20 16:11:07 +0300 5540) ==============================================================
868b2b66 (kx 2024-12-20 16:11:07 +0300 5541)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5542) ACCURACY : In the absence of rounding error,
868b2b66 (kx 2024-12-20 16:11:07 +0300 5543) the appriximation has absolute error
868b2b66 (kx 2024-12-20 16:11:07 +0300 5544) less than EPSILON [see: FLOATP.H].
868b2b66 (kx 2024-12-20 16:11:07 +0300 5545)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5546)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5547) SPECIAL CASES : exp(+NaN) = +NaN с выставлением DOMAIN flag;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5548) exp(-NaN) = -NaN с выставлением DOMAIN flag;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5549) exp(-inf) = 0 [норма];
868b2b66 (kx 2024-12-20 16:11:07 +0300 5550) exp(+inf) = +inf [норма];
868b2b66 (kx 2024-12-20 16:11:07 +0300 5551) exp(0) = 1 [норма];
868b2b66 (kx 2024-12-20 16:11:07 +0300 5552)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5553) Use Global Variable:
868b2b66 (kx 2024-12-20 16:11:07 +0300 5554)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5555) Use Functions : ei_exp__E( eiy, eix, nb ); | st-exp.c
868b2b66 (kx 2024-12-20 16:11:07 +0300 5556) ei_copy( eiy, eix, nb ); | mpu-real.c
868b2b66 (kx 2024-12-20 16:11:07 +0300 5557) .
868b2b66 (kx 2024-12-20 16:11:07 +0300 5558) .
868b2b66 (kx 2024-12-20 16:11:07 +0300 5559) .
868b2b66 (kx 2024-12-20 16:11:07 +0300 5560)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5561) Parameters : EMUSHORT *eiy; - указатель на
868b2b66 (kx 2024-12-20 16:11:07 +0300 5562) internal e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300 5563) data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300 5564) TARGET;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5565) EMUSHORT *eix; - указатель на
868b2b66 (kx 2024-12-20 16:11:07 +0300 5566) internal e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300 5567) data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300 5568) SOURCE;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5569) int nb; - количество бит в
868b2b66 (kx 2024-12-20 16:11:07 +0300 5570) external e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300 5571) data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300 5572)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5573) Return : [void]
868b2b66 (kx 2024-12-20 16:11:07 +0300 5574)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5575) ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5576) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 5577) EMUSHORT *x = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 5578) *z = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 5579) *hi = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 5580) *lo = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 5581) *c = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 5582) *zero = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 5583) *half = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 5584) *one = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 5585) *two = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 5586) *tx = NULL, /* temp */
868b2b66 (kx 2024-12-20 16:11:07 +0300 5587) *tm = NULL, /* temp */
868b2b66 (kx 2024-12-20 16:11:07 +0300 5588) *tk = NULL; /* temp */
868b2b66 (kx 2024-12-20 16:11:07 +0300 5589)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5590) EMUSHORT *k = NULL; /* for Exponent */
868b2b66 (kx 2024-12-20 16:11:07 +0300 5591)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5592) EMUSHORT *ln2hi, *ln2lo, *invln2, *lnhuge, *lntiny;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5593) int np, ne;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5594)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5595)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5596) if( nb < NBR_32 || nb > MPU_MATH_FN_LIMIT )
868b2b66 (kx 2024-12-20 16:11:07 +0300 5597) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 5598) /* error: Invalid size of operand(s) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 5599) __real_invalid_size( (__mpu_char8_t *)"exp" );
868b2b66 (kx 2024-12-20 16:11:07 +0300 5600) /* ei_ind( eiy, nb ); *//* Invalid NB */
868b2b66 (kx 2024-12-20 16:11:07 +0300 5601) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5602) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 5603)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5604) /*******************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 5605) Hight Precision for r32, r64.
868b2b66 (kx 2024-12-20 16:11:07 +0300 5606) *******************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5607) if( nb < NBR_128 ) nb = NBR_128;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5608)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5609) np = internal_np( nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 5610)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5611) /*** Allocate memory for x . ********************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5612) x = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 5613) if( !x )
868b2b66 (kx 2024-12-20 16:11:07 +0300 5614) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 5615) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 5616) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5617) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 5618) /************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5619)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5620)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5621) ei_copy( x, eix, nb ); /* temp for _mtherr() */
868b2b66 (kx 2024-12-20 16:11:07 +0300 5622)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5623) /***************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 5624) Test for EIX.
868b2b66 (kx 2024-12-20 16:11:07 +0300 5625) ***************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5626) /* EXP(InD) must by InD */
868b2b66 (kx 2024-12-20 16:11:07 +0300 5627) if( ei_isind( eix, nb ) )
868b2b66 (kx 2024-12-20 16:11:07 +0300 5628) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 5629) /* "argument domain error" */
868b2b66 (kx 2024-12-20 16:11:07 +0300 5630) /* return: InD */
868b2b66 (kx 2024-12-20 16:11:07 +0300 5631) ei_copy( eiy, eix, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 5632) /***************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 5633) NOTE:
868b2b66 (kx 2024-12-20 16:11:07 +0300 5634) Функция _mtherr() является переходником между
868b2b66 (kx 2024-12-20 16:11:07 +0300 5635) внутренним форматом и внешней,
868b2b66 (kx 2024-12-20 16:11:07 +0300 5636) переопределяемой пользователем, функцией
868b2b66 (kx 2024-12-20 16:11:07 +0300 5637) _math_error(). Кроме основных действий она
868b2b66 (kx 2024-12-20 16:11:07 +0300 5638) выставляет системную переменную errno
868b2b66 (kx 2024-12-20 16:11:07 +0300 5639) следующим образом.
868b2b66 (kx 2024-12-20 16:11:07 +0300 5640)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5641) errno = __mpu_math_errnotab[type];
868b2b66 (kx 2024-12-20 16:11:07 +0300 5642) ***************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5643) _mtherr( eiy, (__mpu_char8_t *)"exp", __DOMAIN__,
868b2b66 (kx 2024-12-20 16:11:07 +0300 5644) eiy, x, (EMUSHORT *)0, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 5645) __STDOM; /* InD - produsing Domain Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 5646)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5647) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5648) __mpu_sbrk( -(int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 5649) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5650)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5651) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5652) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 5653) /* EXP(NaN) must by NaN */
868b2b66 (kx 2024-12-20 16:11:07 +0300 5654) if( ei_isnans( eix, nb ) )
868b2b66 (kx 2024-12-20 16:11:07 +0300 5655) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 5656) /* "argument domain error" */
868b2b66 (kx 2024-12-20 16:11:07 +0300 5657) /* return: NaN */
868b2b66 (kx 2024-12-20 16:11:07 +0300 5658) ei_copy( eiy, eix, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 5659) /***************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 5660) NOTE:
868b2b66 (kx 2024-12-20 16:11:07 +0300 5661) Функция _mtherr() является переходником между
868b2b66 (kx 2024-12-20 16:11:07 +0300 5662) внутренним форматом и внешней,
868b2b66 (kx 2024-12-20 16:11:07 +0300 5663) переопределяемой пользователем, функцией
868b2b66 (kx 2024-12-20 16:11:07 +0300 5664) _math_error(). Кроме основных действий она
868b2b66 (kx 2024-12-20 16:11:07 +0300 5665) выставляет системную переменную errno
868b2b66 (kx 2024-12-20 16:11:07 +0300 5666) следующим образом.
868b2b66 (kx 2024-12-20 16:11:07 +0300 5667)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5668) errno = __mpu_math_errnotab[type];
868b2b66 (kx 2024-12-20 16:11:07 +0300 5669) ***************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5670) _mtherr( eiy, (__mpu_char8_t *)"exp", __DOMAIN__,
868b2b66 (kx 2024-12-20 16:11:07 +0300 5671) eiy, x, (EMUSHORT *)0, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 5672) __STDOM; /* NaN - produsing Domain Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 5673)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5674) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5675) __mpu_sbrk( -(int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 5676) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5677)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5678) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5679) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 5680)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5681)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5682) ne = internal_ne( nb ) + 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5683)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5684) /*** Allocate memory for z, hi, lo, c . *******************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5685) z = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 5686) if( !z )
868b2b66 (kx 2024-12-20 16:11:07 +0300 5687) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 5688) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 5689)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5690) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5691) __mpu_sbrk( -(int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 5692) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5693)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5694) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5695) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 5696)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5697) hi = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 5698) if( !hi )
868b2b66 (kx 2024-12-20 16:11:07 +0300 5699) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 5700) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 5701)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5702) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5703) /* FREE z *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5704) __mpu_sbrk( -(int)(2*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 5705) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5706)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5707) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5708) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 5709)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5710) lo = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 5711) if( !lo )
868b2b66 (kx 2024-12-20 16:11:07 +0300 5712) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 5713) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 5714)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5715) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5716) /* FREE z *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5717) /* FREE hi ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5718) __mpu_sbrk( -(int)(3*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 5719) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5720)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5721) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5722) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 5723)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5724) c = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 5725) if( !c )
868b2b66 (kx 2024-12-20 16:11:07 +0300 5726) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 5727) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 5728)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5729) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5730) /* FREE z *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5731) /* FREE hi ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5732) /* FREE lo ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5733) __mpu_sbrk( -(int)(4*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 5734) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5735)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5736) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5737) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 5738) /************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5739)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5740) /*** Allocate memory for zero, half, one, two . *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5741) zero = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 5742) if( !zero )
868b2b66 (kx 2024-12-20 16:11:07 +0300 5743) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 5744) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 5745)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5746) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5747) /* FREE z *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5748) /* FREE hi ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5749) /* FREE lo ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5750) /* FREE c *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5751) __mpu_sbrk( -(int)(5*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 5752) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5753)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5754) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5755) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 5756)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5757) half = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 5758) if( !half )
868b2b66 (kx 2024-12-20 16:11:07 +0300 5759) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 5760) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 5761)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5762) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5763) /* FREE z *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5764) /* FREE hi ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5765) /* FREE lo ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5766) /* FREE c *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5767) /* FREE zero **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5768) __mpu_sbrk( -(int)(6*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 5769) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5770)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5771) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5772) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 5773)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5774) one = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 5775) if( !one )
868b2b66 (kx 2024-12-20 16:11:07 +0300 5776) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 5777) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 5778)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5779) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5780) /* FREE z *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5781) /* FREE hi ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5782) /* FREE lo ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5783) /* FREE c *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5784) /* FREE zero **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5785) /* FREE half **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5786) __mpu_sbrk( -(int)(7*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 5787) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5788)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5789) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5790) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 5791)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5792) two = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 5793) if( !two )
868b2b66 (kx 2024-12-20 16:11:07 +0300 5794) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 5795) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 5796)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5797) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5798) /* FREE z *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5799) /* FREE hi ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5800) /* FREE lo ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5801) /* FREE c *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5802) /* FREE zero **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5803) /* FREE half **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5804) /* FREE one ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5805) __mpu_sbrk( -(int)(8*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 5806) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5807)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5808) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5809) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 5810) /************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5811)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5812) /*** Allocate memory for tx, tm, tk . ***********************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5813) tx = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 5814) if( !tx )
868b2b66 (kx 2024-12-20 16:11:07 +0300 5815) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 5816) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 5817)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5818) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5819) /* FREE z *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5820) /* FREE hi ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5821) /* FREE lo ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5822) /* FREE c *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5823) /* FREE zero **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5824) /* FREE half **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5825) /* FREE one ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5826) /* FREE two ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5827) __mpu_sbrk( -(int)(9*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 5828) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5829)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5830) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5831) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 5832)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5833) tm = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 5834) if( !tm )
868b2b66 (kx 2024-12-20 16:11:07 +0300 5835) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 5836) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 5837)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5838) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5839) /* FREE z *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5840) /* FREE hi ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5841) /* FREE lo ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5842) /* FREE c *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5843) /* FREE zero **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5844) /* FREE half **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5845) /* FREE one ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5846) /* FREE two ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5847) /* FREE tx ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5848) __mpu_sbrk( -(int)(10*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 5849) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5850)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5851) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5852) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 5853)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5854) tk = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 5855) if( !tk )
868b2b66 (kx 2024-12-20 16:11:07 +0300 5856) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 5857) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 5858)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5859) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5860) /* FREE z *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5861) /* FREE hi ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5862) /* FREE lo ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5863) /* FREE c *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5864) /* FREE zero **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5865) /* FREE half **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5866) /* FREE one ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5867) /* FREE two ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5868) /* FREE tx ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5869) /* FREE tm ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5870) __mpu_sbrk( -(int)(11*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 5871) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5872)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5873) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5874) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 5875) /************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5876)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5877)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5878) /*** Allocate memory for k . ********************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5879) k = (EMUSHORT *)__mpu_sbrk( (int)(ne*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 5880) if( !k )
868b2b66 (kx 2024-12-20 16:11:07 +0300 5881) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 5882) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 5883)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5884) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5885) /* FREE z *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5886) /* FREE hi ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5887) /* FREE lo ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5888) /* FREE c *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5889) /* FREE zero **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5890) /* FREE half **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5891) /* FREE one ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5892) /* FREE two ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5893) /* FREE tx ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5894) /* FREE tm ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5895) /* FREE tk ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5896) __mpu_sbrk( -(int)(12*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 5897) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5898)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5899) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5900) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 5901) /************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5902)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5903) ln2hi = _get_m_ln2hi_ptr( nb ); /* Service Constant */
868b2b66 (kx 2024-12-20 16:11:07 +0300 5904) ln2lo = _get_m_ln2lo_ptr( nb ); /* Service Constant */
868b2b66 (kx 2024-12-20 16:11:07 +0300 5905) lnhuge = _get_m_ln_huge_ptr( nb ); /* Service Constant */
868b2b66 (kx 2024-12-20 16:11:07 +0300 5906) lntiny = _get_m_ln_tiny_ptr( nb ); /* Service Constant */
868b2b66 (kx 2024-12-20 16:11:07 +0300 5907) invln2 = _get_m_1_ln2_ptr( nb ); /* Math Constant */
868b2b66 (kx 2024-12-20 16:11:07 +0300 5908)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5909) _gen_zero( zero, nb ); /* Befor test +/-inf */
868b2b66 (kx 2024-12-20 16:11:07 +0300 5910) _gen_half( half, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 5911) _gen_one ( one, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 5912) _gen_two ( two, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 5913)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5914) /* ei_copy( x, eix, nb ); */
868b2b66 (kx 2024-12-20 16:11:07 +0300 5915)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5916)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5917) if( ei_cmp( x, lnhuge, nb ) <= 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 5918) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 5919) if( ei_cmp( x, lntiny, nb ) >= 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 5920) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 5921) /*************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 5922) Argument reduction: x --> x - k*ln2
868b2b66 (kx 2024-12-20 16:11:07 +0300 5923) *************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5924) ei_copysign( tm, half, x, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 5925) ei_mul( tx, invln2, x, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 5926) ei_add( tx, tx, tm, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 5927) /* begin : *********************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 5928) k = _REALtoINT(x/ln(2)).
868b2b66 (kx 2024-12-20 16:11:07 +0300 5929) *******************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5930) ei_rtol_frac( k, /* k = tx; */
868b2b66 (kx 2024-12-20 16:11:07 +0300 5931) (EMUSHORT *)0,
868b2b66 (kx 2024-12-20 16:11:07 +0300 5932) tx, ne, nb ); /* k = _RtoINT(x/ln2); */
868b2b66 (kx 2024-12-20 16:11:07 +0300 5933) ei_ltor( tk, k, nb, ne ); /* tk = k; */
868b2b66 (kx 2024-12-20 16:11:07 +0300 5934) /* end : ***********************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 5935) k = _REALtoINT(x/ln(2)).
868b2b66 (kx 2024-12-20 16:11:07 +0300 5936) *******************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5937)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5938) /*****************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 5939) Express x-k*ln2 as hi-lo and let x = hi-lo rounded.
868b2b66 (kx 2024-12-20 16:11:07 +0300 5940) *****************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5941) ei_mul( tx, tk, ln2hi, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 5942) ei_sub( hi, x, tx, nb ); /* hi = x-k*ln2hi; */
868b2b66 (kx 2024-12-20 16:11:07 +0300 5943) ei_mul( lo, tk, ln2lo, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 5944) ei_sub( x, hi, lo, nb ); /* x = hi-(lo=k*ln2lo); */
868b2b66 (kx 2024-12-20 16:11:07 +0300 5945)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5946) /********************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 5947) return( 2^k*[1+x+x*c/(2+c)] );
868b2b66 (kx 2024-12-20 16:11:07 +0300 5948) ********************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5949) ei_mul( z, x, x, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 5950) ei_exp__E( tx, z, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 5951) ei_sub( c, x, tx, nb ); /* c = x - ei_exp__E(z); */
868b2b66 (kx 2024-12-20 16:11:07 +0300 5952)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5953) ei_mul( tx, x, c, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 5954) ei_sub( tm, two, c, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 5955) ei_div( tx, tx, tm, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 5956) ei_sub( tx, lo, tx, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 5957) ei_sub( tx, hi, tx, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 5958) ei_add( tx, one, tx, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 5959) /* return( ldexp(1.0+(hi-(lo-(x*c)/(2.0-c))), k) ); */
868b2b66 (kx 2024-12-20 16:11:07 +0300 5960) ei_ldexp( eiy, k, tx, ne, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 5961)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5962) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5963) /* FREE z *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5964) /* FREE hi ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5965) /* FREE lo ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5966) /* FREE c *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5967) /* FREE zero **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5968) /* FREE half **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5969) /* FREE one ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5970) /* FREE two ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5971) /* FREE tx ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5972) /* FREE tm ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5973) /* FREE tk ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5974) __mpu_sbrk( -(int)(12*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 5975) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5976)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5977) /* FREE k *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5978) __mpu_sbrk( -(int)(ne*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 5979) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5980)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5981) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5982)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5983) } /* End if( x >= lntiny ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 5984) else
868b2b66 (kx 2024-12-20 16:11:07 +0300 5985) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 5986) /* ( x <= lntiny ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 5987) /****************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 5988) EXP(-Infinity) must by 0.0 [exact];
868b2b66 (kx 2024-12-20 16:11:07 +0300 5989) ****************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5990) if( !ei_isinfin( eix, nb ) )
868b2b66 (kx 2024-12-20 16:11:07 +0300 5991) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 5992) /* raise the inexact flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 5993) /* -big# - underflows to ZERO */
868b2b66 (kx 2024-12-20 16:11:07 +0300 5994) /* return: 0.0 ( after if(){} body ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 5995) ei_copy( x, eix, nb ); /* for &eiy == &eix */
868b2b66 (kx 2024-12-20 16:11:07 +0300 5996)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5997) ei_copy( eiy, zero, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 5998) /***************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 5999) NOTE:
868b2b66 (kx 2024-12-20 16:11:07 +0300 6000) Функция _mtherr() является переходником между
868b2b66 (kx 2024-12-20 16:11:07 +0300 6001) внутренним форматом и внешней,
868b2b66 (kx 2024-12-20 16:11:07 +0300 6002) переопределяемой пользователем, функцией
868b2b66 (kx 2024-12-20 16:11:07 +0300 6003) _math_error(). Кроме основных действий она
868b2b66 (kx 2024-12-20 16:11:07 +0300 6004) выставляет системную переменную errno
868b2b66 (kx 2024-12-20 16:11:07 +0300 6005) следующим образом.
868b2b66 (kx 2024-12-20 16:11:07 +0300 6006)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6007) errno = __mpu_math_errnotab[type];
868b2b66 (kx 2024-12-20 16:11:07 +0300 6008) ***************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6009) _mtherr( eiy, /* Non change */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6010) (__mpu_char8_t *)"exp", __INEXACT__,
868b2b66 (kx 2024-12-20 16:11:07 +0300 6011) eiy, x, (EMUSHORT *)0, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 6012)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6013) __STINX; /* -big# - produsing Inexact Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6014) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 6015) ei_copy( eiy, zero, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 6016)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6017) } /* End of ( x <= lntiny ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6018)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6019) } /* End if( x <= lnhuge ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6020) else
868b2b66 (kx 2024-12-20 16:11:07 +0300 6021) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 6022) /* ( x >= lnhuge ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6023) /****************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 6024) EXP(+Infinity) must by +Inf [exact];
868b2b66 (kx 2024-12-20 16:11:07 +0300 6025) ****************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6026) if( !ei_isinfin( eix, nb ) )
868b2b66 (kx 2024-12-20 16:11:07 +0300 6027) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 6028) /* raise the inexact flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6029) /* +big# - overflows to +Inf */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6030) /* return: +Infinity ( after if(){} body ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6031) ei_copy( x, eix, nb ); /* for &eiy == &eix */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6032)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6033) ei_infin( eiy, (unsigned)0, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 6034) /***************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 6035) NOTE:
868b2b66 (kx 2024-12-20 16:11:07 +0300 6036) Функция _mtherr() является переходником между
868b2b66 (kx 2024-12-20 16:11:07 +0300 6037) внутренним форматом и внешней,
868b2b66 (kx 2024-12-20 16:11:07 +0300 6038) переопределяемой пользователем, функцией
868b2b66 (kx 2024-12-20 16:11:07 +0300 6039) _math_error(). Кроме основных действий она
868b2b66 (kx 2024-12-20 16:11:07 +0300 6040) выставляет системную переменную errno
868b2b66 (kx 2024-12-20 16:11:07 +0300 6041) следующим образом.
868b2b66 (kx 2024-12-20 16:11:07 +0300 6042)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6043) errno = __mpu_math_errnotab[type];
868b2b66 (kx 2024-12-20 16:11:07 +0300 6044) ***************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6045) _mtherr( eiy, /* Non change */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6046) (__mpu_char8_t *)"exp", __INEXACT__,
868b2b66 (kx 2024-12-20 16:11:07 +0300 6047) eiy, x, (EMUSHORT *)0, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 6048)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6049) __STINX; /* +big# - produsing Inexact Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6050) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 6051) ei_infin( eiy, (unsigned)0, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 6052)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6053) } /* End of ( x >= lnhuge ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6054)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6055) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6056) /* FREE z *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6057) /* FREE hi ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6058) /* FREE lo ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6059) /* FREE c *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6060) /* FREE zero **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6061) /* FREE half **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6062) /* FREE one ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6063) /* FREE two ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6064) /* FREE tx ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6065) /* FREE tm ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6066) /* FREE tk ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6067) __mpu_sbrk( -(int)(12*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 6068) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6069)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6070) /* FREE k *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6071) __mpu_sbrk( -(int)(ne*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 6072) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6073)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6074) } /* End of ei_exp() */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6075)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6076)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6077) static void __ei_exp__D( EMUSHORT *eiy, EMUSHORT *eix, EMUSHORT *eic, int nb )
868b2b66 (kx 2024-12-20 16:11:07 +0300 6078) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 6079)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6080) Return:
868b2b66 (kx 2024-12-20 16:11:07 +0300 6081)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6082) EXP( r=x+c ) for |c| < |x|
868b2b66 (kx 2024-12-20 16:11:07 +0300 6083)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6084) with no overlap (без перекрытия).
868b2b66 (kx 2024-12-20 16:11:07 +0300 6085) ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6086) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 6087) EMUSHORT *x = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 6088) *z = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 6089) *hi = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 6090) *lo = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 6091) *c = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 6092) *zero = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 6093) *half = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 6094) *one = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 6095) *two = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 6096) *tx = NULL, /* temp */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6097) *tm = NULL, /* temp */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6098) *tk = NULL; /* temp */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6099)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6100) EMUSHORT *k = NULL; /* for Exponent */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6101)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6102) EMUSHORT *ln2hi, *ln2lo, *invln2, *lnhuge, *lntiny;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6103) int np, ne;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6104)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6105)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6106) if( nb < NBR_32 || nb > MPU_MATH_FN_LIMIT )
868b2b66 (kx 2024-12-20 16:11:07 +0300 6107) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 6108) /* error: Invalid size of operand(s) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6109) __real_error_no = __R_ESIZE__;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6110) __STIND; /* Set REAL ind-produsing operation Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6111) /* ei_ind( eiy, nb ); *//* Invalid NB */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6112) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6113) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 6114)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6115) /*******************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 6116) Hight Precision for r32, r64.
868b2b66 (kx 2024-12-20 16:11:07 +0300 6117) *******************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6118) if( nb < NBR_128 ) nb = NBR_128;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6119)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6120) np = internal_np( nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 6121)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6122) /*** Allocate memory for x . ********************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6123) x = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 6124) if( !x )
868b2b66 (kx 2024-12-20 16:11:07 +0300 6125) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 6126) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6127) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6128) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 6129) /************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6130)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6131)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6132) ei_copy( x, eix, nb ); /* temp for _mtherr() */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6133)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6134) /***************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 6135) Test for EIX.
868b2b66 (kx 2024-12-20 16:11:07 +0300 6136) ***************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6137) /* EXP__D(InD) must by InD */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6138) if( ei_isind( eix, nb ) )
868b2b66 (kx 2024-12-20 16:11:07 +0300 6139) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 6140) /* "argument domain error" */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6141) /* return: InD */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6142) ei_copy( eiy, eix, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 6143) /***************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 6144) NOTE:
868b2b66 (kx 2024-12-20 16:11:07 +0300 6145) Функция _mtherr() является переходником между
868b2b66 (kx 2024-12-20 16:11:07 +0300 6146) внутренним форматом и внешней,
868b2b66 (kx 2024-12-20 16:11:07 +0300 6147) переопределяемой пользователем, функцией
868b2b66 (kx 2024-12-20 16:11:07 +0300 6148) _math_error(). Кроме основных действий она
868b2b66 (kx 2024-12-20 16:11:07 +0300 6149) выставляет системную переменную errno
868b2b66 (kx 2024-12-20 16:11:07 +0300 6150) следующим образом.
868b2b66 (kx 2024-12-20 16:11:07 +0300 6151)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6152) errno = __mpu_math_errnotab[type];
868b2b66 (kx 2024-12-20 16:11:07 +0300 6153) ***************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6154) _mtherr( eiy, (__mpu_char8_t *)"__ei_exp__D", __DOMAIN__,
868b2b66 (kx 2024-12-20 16:11:07 +0300 6155) eiy, x, eic, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 6156) __STDOM; /* InD - produsing Domain Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6157)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6158) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6159) __mpu_sbrk( -(int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 6160) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6161)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6162) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6163) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 6164) /* EXP__D(NaN) must by NaN */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6165) if( ei_isnans( eix, nb ) )
868b2b66 (kx 2024-12-20 16:11:07 +0300 6166) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 6167) /* "argument domain error" */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6168) /* return: NaN */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6169) ei_copy( eiy, eix, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 6170) /***************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 6171) NOTE:
868b2b66 (kx 2024-12-20 16:11:07 +0300 6172) Функция _mtherr() является переходником между
868b2b66 (kx 2024-12-20 16:11:07 +0300 6173) внутренним форматом и внешней,
868b2b66 (kx 2024-12-20 16:11:07 +0300 6174) переопределяемой пользователем, функцией
868b2b66 (kx 2024-12-20 16:11:07 +0300 6175) _math_error(). Кроме основных действий она
868b2b66 (kx 2024-12-20 16:11:07 +0300 6176) выставляет системную переменную errno
868b2b66 (kx 2024-12-20 16:11:07 +0300 6177) следующим образом.
868b2b66 (kx 2024-12-20 16:11:07 +0300 6178)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6179) errno = __mpu_math_errnotab[type];
868b2b66 (kx 2024-12-20 16:11:07 +0300 6180) ***************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6181) _mtherr( eiy, (__mpu_char8_t *)"__ei_exp__D", __DOMAIN__,
868b2b66 (kx 2024-12-20 16:11:07 +0300 6182) eiy, x, eic, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 6183) __STDOM; /* NaN - produsing Domain Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6184)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6185) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6186) __mpu_sbrk( -(int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 6187) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6188)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6189) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6190) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 6191)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6192)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6193) ne = internal_ne( nb ) + 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6194)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6195) /*** Allocate memory for z, hi, lo, c . *******************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6196) z = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 6197) if( !z )
868b2b66 (kx 2024-12-20 16:11:07 +0300 6198) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 6199) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6200)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6201) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6202) __mpu_sbrk( -(int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 6203) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6204)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6205) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6206) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 6207)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6208) hi = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 6209) if( !hi )
868b2b66 (kx 2024-12-20 16:11:07 +0300 6210) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 6211) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6212)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6213) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6214) /* FREE z *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6215) __mpu_sbrk( -(int)(2*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 6216) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6217)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6218) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6219) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 6220)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6221) lo = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 6222) if( !lo )
868b2b66 (kx 2024-12-20 16:11:07 +0300 6223) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 6224) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6225)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6226) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6227) /* FREE z *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6228) /* FREE hi ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6229) __mpu_sbrk( -(int)(3*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 6230) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6231)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6232) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6233) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 6234)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6235) c = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 6236) if( !c )
868b2b66 (kx 2024-12-20 16:11:07 +0300 6237) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 6238) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6239)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6240) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6241) /* FREE z *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6242) /* FREE hi ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6243) /* FREE lo ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6244) __mpu_sbrk( -(int)(4*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 6245) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6246)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6247) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6248) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 6249) /************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6250)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6251) /*** Allocate memory for zero, half, one, two . *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6252) zero = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 6253) if( !zero )
868b2b66 (kx 2024-12-20 16:11:07 +0300 6254) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 6255) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6256)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6257) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6258) /* FREE z *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6259) /* FREE hi ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6260) /* FREE lo ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6261) /* FREE c *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6262) __mpu_sbrk( -(int)(5*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 6263) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6264)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6265) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6266) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 6267)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6268) half = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 6269) if( !half )
868b2b66 (kx 2024-12-20 16:11:07 +0300 6270) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 6271) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6272)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6273) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6274) /* FREE z *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6275) /* FREE hi ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6276) /* FREE lo ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6277) /* FREE c *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6278) /* FREE zero **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6279) __mpu_sbrk( -(int)(6*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 6280) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6281)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6282) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6283) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 6284)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6285) one = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 6286) if( !one )
868b2b66 (kx 2024-12-20 16:11:07 +0300 6287) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 6288) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6289)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6290) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6291) /* FREE z *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6292) /* FREE hi ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6293) /* FREE lo ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6294) /* FREE c *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6295) /* FREE zero **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6296) /* FREE half **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6297) __mpu_sbrk( -(int)(7*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 6298) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6299)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6300) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6301) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 6302)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6303) two = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 6304) if( !two )
868b2b66 (kx 2024-12-20 16:11:07 +0300 6305) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 6306) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6307)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6308) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6309) /* FREE z *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6310) /* FREE hi ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6311) /* FREE lo ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6312) /* FREE c *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6313) /* FREE zero **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6314) /* FREE half **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6315) /* FREE one ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6316) __mpu_sbrk( -(int)(8*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 6317) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6318)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6319) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6320) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 6321) /************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6322)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6323) /*** Allocate memory for tx, tm, tk . ***********************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6324) tx = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 6325) if( !tx )
868b2b66 (kx 2024-12-20 16:11:07 +0300 6326) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 6327) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6328)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6329) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6330) /* FREE z *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6331) /* FREE hi ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6332) /* FREE lo ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6333) /* FREE c *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6334) /* FREE zero **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6335) /* FREE half **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6336) /* FREE one ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6337) /* FREE two ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6338) __mpu_sbrk( -(int)(9*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 6339) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6340)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6341) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6342) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 6343)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6344) tm = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 6345) if( !tm )
868b2b66 (kx 2024-12-20 16:11:07 +0300 6346) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 6347) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6348)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6349) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6350) /* FREE z *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6351) /* FREE hi ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6352) /* FREE lo ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6353) /* FREE c *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6354) /* FREE zero **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6355) /* FREE half **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6356) /* FREE one ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6357) /* FREE two ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6358) /* FREE tx ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6359) __mpu_sbrk( -(int)(10*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 6360) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6361)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6362) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6363) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 6364)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6365) tk = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 6366) if( !tk )
868b2b66 (kx 2024-12-20 16:11:07 +0300 6367) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 6368) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6369)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6370) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6371) /* FREE z *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6372) /* FREE hi ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6373) /* FREE lo ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6374) /* FREE c *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6375) /* FREE zero **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6376) /* FREE half **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6377) /* FREE one ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6378) /* FREE two ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6379) /* FREE tx ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6380) /* FREE tm ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6381) __mpu_sbrk( -(int)(11*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 6382) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6383)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6384) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6385) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 6386) /************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6387)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6388)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6389) /*** Allocate memory for k . ********************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6390) k = (EMUSHORT *)__mpu_sbrk( (int)(ne*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 6391) if( !k )
868b2b66 (kx 2024-12-20 16:11:07 +0300 6392) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 6393) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6394)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6395) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6396) /* FREE z *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6397) /* FREE hi ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6398) /* FREE lo ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6399) /* FREE c *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6400) /* FREE zero **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6401) /* FREE half **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6402) /* FREE one ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6403) /* FREE two ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6404) /* FREE tx ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6405) /* FREE tm ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6406) /* FREE tk ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6407) __mpu_sbrk( -(int)(12*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 6408) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6409)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6410) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6411) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 6412) /************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6413)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6414) ln2hi = _get_m_ln2hi_ptr( nb ); /* Service Constant */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6415) ln2lo = _get_m_ln2lo_ptr( nb ); /* Service Constant */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6416) lnhuge = _get_m_ln_huge_ptr( nb ); /* Service Constant */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6417) lntiny = _get_m_ln_tiny_ptr( nb ); /* Service Constant */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6418) invln2 = _get_m_1_ln2_ptr( nb ); /* Math Constant */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6419)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6420) _gen_zero( zero, nb ); /* Befor test +/-inf */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6421) _gen_half( half, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 6422) _gen_one ( one, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 6423) _gen_two ( two, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 6424)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6425) /* ei_copy( x, eix, nb ); */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6426) ei_copy( c, eic, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 6427)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6428)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6429) if( ei_cmp( x, lnhuge, nb ) <= 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 6430) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 6431) if( ei_cmp( x, lntiny, nb ) >= 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 6432) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 6433) /*************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 6434) Argument reduction: x --> x - k*ln2
868b2b66 (kx 2024-12-20 16:11:07 +0300 6435) *************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6436) ei_copysign( tm, half, x, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 6437) ei_mul( tx, invln2, x, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 6438) ei_add( tx, tx, tm, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 6439) /* begin : *********************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 6440) k = _REALtoINT(x/ln(2)).
868b2b66 (kx 2024-12-20 16:11:07 +0300 6441) *******************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6442) ei_rtol_frac( k, /* k = tx; */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6443) (EMUSHORT *)0,
868b2b66 (kx 2024-12-20 16:11:07 +0300 6444) tx, ne, nb ); /* k = _RtoINT(x/ln2); */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6445) ei_ltor( tk, k, nb, ne ); /* tk = k; */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6446) /* end : ***********************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 6447) k = _REALtoINT(x/ln(2)).
868b2b66 (kx 2024-12-20 16:11:07 +0300 6448) *******************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6449)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6450) /*********************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 6451) Express (x+c)-k*ln2 as hi-lo and let x = hi-lo rounded.
868b2b66 (kx 2024-12-20 16:11:07 +0300 6452) *********************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6453) ei_mul( tx, tk, ln2hi, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 6454) ei_sub( hi, x, tx, nb ); /* hi = x-k*ln2hi; */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6455) ei_mul( lo, tk, ln2lo, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 6456) ei_sub( lo, lo, c, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 6457) ei_sub( x, hi, lo, nb ); /* x = hi-(lo=k*ln2lo-c); */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6458)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6459) /********************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 6460) return( 2^k*[1+x+x*c/(2+c)] );
868b2b66 (kx 2024-12-20 16:11:07 +0300 6461) ********************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6462) ei_mul( z, x, x, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 6463) ei_exp__E( tx, z, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 6464) ei_sub( c, x, tx, nb ); /* c = x - ei_exp__E(z); */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6465)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6466) ei_mul( tx, x, c, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 6467) ei_sub( tm, two, c, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 6468) ei_div( c, tx, tm, nb ); /* c = (x*c)/(2.0-c); */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6469)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6470) ei_sub( tx, lo, c, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 6471) ei_sub( tx, hi, tx, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 6472) ei_add( tx, one, tx, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 6473) /* return( ldexp(1.0 + (hi - (lo - c)), k) ); */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6474) ei_ldexp( eiy, k, tx, ne, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 6475)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6476)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6477) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6478) /* FREE z *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6479) /* FREE hi ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6480) /* FREE lo ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6481) /* FREE c *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6482) /* FREE zero **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6483) /* FREE half **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6484) /* FREE one ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6485) /* FREE two ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6486) /* FREE tx ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6487) /* FREE tm ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6488) /* FREE tk ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6489) __mpu_sbrk( -(int)(12*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 6490) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6491)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6492) /* FREE k *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6493) __mpu_sbrk( -(int)(ne*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 6494) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6495)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6496) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6497)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6498) } /* End if( x >= lntiny ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6499) else
868b2b66 (kx 2024-12-20 16:11:07 +0300 6500) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 6501) /* ( x <= lntiny ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6502) /****************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 6503) EXP__D(-Infinity) must by 0.0 [exact];
868b2b66 (kx 2024-12-20 16:11:07 +0300 6504) ****************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6505) if( !ei_isinfin( eix, nb ) )
868b2b66 (kx 2024-12-20 16:11:07 +0300 6506) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 6507) /* raise the inexact flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6508) /* -big# - underflows to ZERO */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6509) /* return: 0.0 ( after if(){} body ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6510) ei_copy( x, eix, nb ); /* for &eiy == &eix */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6511)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6512) ei_copy( eiy, zero, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 6513) /***************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 6514) NOTE:
868b2b66 (kx 2024-12-20 16:11:07 +0300 6515) Функция _mtherr() является переходником между
868b2b66 (kx 2024-12-20 16:11:07 +0300 6516) внутренним форматом и внешней,
868b2b66 (kx 2024-12-20 16:11:07 +0300 6517) переопределяемой пользователем, функцией
868b2b66 (kx 2024-12-20 16:11:07 +0300 6518) _math_error(). Кроме основных действий она
868b2b66 (kx 2024-12-20 16:11:07 +0300 6519) выставляет системную переменную errno
868b2b66 (kx 2024-12-20 16:11:07 +0300 6520) следующим образом.
868b2b66 (kx 2024-12-20 16:11:07 +0300 6521)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6522) errno = __mpu_math_errnotab[type];
868b2b66 (kx 2024-12-20 16:11:07 +0300 6523) ***************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6524) _mtherr( eiy, /* Non change */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6525) (__mpu_char8_t *)"__ei_exp__D", __INEXACT__,
868b2b66 (kx 2024-12-20 16:11:07 +0300 6526) eiy, x, eic, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 6527) __STINX; /* -big# - produsing Inexact Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6528) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 6529) ei_copy( eiy, zero, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 6530)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6531) } /* End of ( x <= lntiny ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6532)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6533) } /* End if( x <= lnhuge ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6534) else
868b2b66 (kx 2024-12-20 16:11:07 +0300 6535) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 6536) /* ( x >= lnhuge ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6537) /****************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 6538) EXP__D(+Infinity) must by +Inf [exact];
868b2b66 (kx 2024-12-20 16:11:07 +0300 6539) ****************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6540) if( !ei_isinfin( eix, nb ) )
868b2b66 (kx 2024-12-20 16:11:07 +0300 6541) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 6542) /* raise the inexact flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6543) /* +big# - overflows to +Inf */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6544) /* return: +Infinity ( after if(){} body ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6545) ei_copy( x, eix, nb ); /* for &eiy == &eix */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6546)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6547) ei_infin( eiy, (unsigned)0, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 6548) /***************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 6549) NOTE:
868b2b66 (kx 2024-12-20 16:11:07 +0300 6550) Функция _mtherr() является переходником между
868b2b66 (kx 2024-12-20 16:11:07 +0300 6551) внутренним форматом и внешней,
868b2b66 (kx 2024-12-20 16:11:07 +0300 6552) переопределяемой пользователем, функцией
868b2b66 (kx 2024-12-20 16:11:07 +0300 6553) _math_error(). Кроме основных действий она
868b2b66 (kx 2024-12-20 16:11:07 +0300 6554) выставляет системную переменную errno
868b2b66 (kx 2024-12-20 16:11:07 +0300 6555) следующим образом.
868b2b66 (kx 2024-12-20 16:11:07 +0300 6556)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6557) errno = __mpu_math_errnotab[type];
868b2b66 (kx 2024-12-20 16:11:07 +0300 6558) ***************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6559) _mtherr( eiy, /* Non change */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6560) (__mpu_char8_t *)"__ei_exp__D", __INEXACT__,
868b2b66 (kx 2024-12-20 16:11:07 +0300 6561) eiy, x, eic, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 6562) __STINX; /* +big# - produsing Inexact Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6563) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 6564) ei_infin( eiy, (unsigned)0, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 6565)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6566) } /* End of ( x >= lnhuge ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6567)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6568)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6569) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6570) /* FREE z *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6571) /* FREE hi ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6572) /* FREE lo ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6573) /* FREE c *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6574) /* FREE zero **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6575) /* FREE half **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6576) /* FREE one ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6577) /* FREE two ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6578) /* FREE tx ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6579) /* FREE tm ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6580) /* FREE tk ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6581) __mpu_sbrk( -(int)(12*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 6582) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6583)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6584) /* FREE k *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6585) __mpu_sbrk( -(int)(ne*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 6586) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6587)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6588) } /* End of __ei_exp__D() */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6589)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6590)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6591) void ei_atan2( EMUSHORT *eic, EMUSHORT *eiy, EMUSHORT *eix, int nb )
868b2b66 (kx 2024-12-20 16:11:07 +0300 6592) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 6593)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6594) Description : ei_atan2() Работает с
868b2b66 (kx 2024-12-20 16:11:07 +0300 6595) internal e-type data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300 6596)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6597) Concepts : ATAN2( EIY,EIX ) RETURN ARG( EIX+iEIY).
868b2b66 (kx 2024-12-20 16:11:07 +0300 6598)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6599) METHOD :
868b2b66 (kx 2024-12-20 16:11:07 +0300 6600) 1. Reduce y to positive
868b2b66 (kx 2024-12-20 16:11:07 +0300 6601) by atan2(y,x)=-atan2(-y,x).
868b2b66 (kx 2024-12-20 16:11:07 +0300 6602) 2. Reduce x to positive by
868b2b66 (kx 2024-12-20 16:11:07 +0300 6603) (if x and y are unexceptional):
868b2b66 (kx 2024-12-20 16:11:07 +0300 6604) ARG(x+iy) = arctan(y/x) ... if x>0,
868b2b66 (kx 2024-12-20 16:11:07 +0300 6605) ARG(x+iy) = pi-arctan[y/(-x)] ... if x<0,
868b2b66 (kx 2024-12-20 16:11:07 +0300 6606) 3. According to the integer k=4t+0.25
868b2b66 (kx 2024-12-20 16:11:07 +0300 6607) truncated, t=y/x, the argument
868b2b66 (kx 2024-12-20 16:11:07 +0300 6608) is further reduced to one of the following
868b2b66 (kx 2024-12-20 16:11:07 +0300 6609) intervals and the arctangent of y/x
868b2b66 (kx 2024-12-20 16:11:07 +0300 6610) is evaluated by the corresponding formula:
868b2b66 (kx 2024-12-20 16:11:07 +0300 6611)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6612) [0,7/16] atan(y/x) = t - t^3*(a1+t^2*(a2+...(a10+t^2*a11)...)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6613) [7/16,11/16] atan(y/x) = atan(1/2) + atan( (y-x/2)/(x+y/2) )
868b2b66 (kx 2024-12-20 16:11:07 +0300 6614) [11/16,19/16] atan(y/x) = atan( 1 ) + atan( (y-x)/(x+y) )
868b2b66 (kx 2024-12-20 16:11:07 +0300 6615) [19/16,39/16] atan(y/x) = atan(3/2) + atan( (y-1.5x)/(x+1.5y) )
868b2b66 (kx 2024-12-20 16:11:07 +0300 6616) [39/16,INF] atan(y/x) = atan(INF) + atan( -x/y )
868b2b66 (kx 2024-12-20 16:11:07 +0300 6617)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6618) EI_ATAN2__A() : Построение ряда:
868b2b66 (kx 2024-12-20 16:11:07 +0300 6619) ==============================================================
868b2b66 (kx 2024-12-20 16:11:07 +0300 6620) Известно, что
868b2b66 (kx 2024-12-20 16:11:07 +0300 6621)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6622) atan(x) = x - (1/3)*x^3 + (1/5)*x^5 - (1/7)*x^7 + ... .
868b2b66 (kx 2024-12-20 16:11:07 +0300 6623)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6624) Мы имеем следующий способ
868b2b66 (kx 2024-12-20 16:11:07 +0300 6625)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6626) atan(t) = t - t*(z*a1+z^2*a2+z^3*a3...) = t - t*A,
868b2b66 (kx 2024-12-20 16:11:07 +0300 6627)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6628) где
868b2b66 (kx 2024-12-20 16:11:07 +0300 6629)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6630) z = t*t.
868b2b66 (kx 2024-12-20 16:11:07 +0300 6631)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6632) Следовательно
868b2b66 (kx 2024-12-20 16:11:07 +0300 6633)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6634) a1 = +1/3; a2 = -1/5; a3 = +1/7; a4 = -1/9; ... .
868b2b66 (kx 2024-12-20 16:11:07 +0300 6635)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6636) Вот все, что нужно для APPROX(), чтобы получить a1, a2, a3, ...
868b2b66 (kx 2024-12-20 16:11:07 +0300 6637) на интервале [-7/16, +7/16] по флгоритму Ремеза.
868b2b66 (kx 2024-12-20 16:11:07 +0300 6638) ==============================================================
868b2b66 (kx 2024-12-20 16:11:07 +0300 6639)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6640) ACCURACY : In the absence of rounding error,
868b2b66 (kx 2024-12-20 16:11:07 +0300 6641) the appriximation has absolute error
868b2b66 (kx 2024-12-20 16:11:07 +0300 6642) less than EPSILON [see: FLOATP.H].
868b2b66 (kx 2024-12-20 16:11:07 +0300 6643) Atan2(y,x) returns (PI/pi) * the exact ARG(x+iy)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6644) nearly rounded, where pi is rounded value
868b2b66 (kx 2024-12-20 16:11:07 +0300 6645) of exact PI.
868b2b66 (kx 2024-12-20 16:11:07 +0300 6646)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6647) NOTE : The coefficient A's
868b2b66 (kx 2024-12-20 16:11:07 +0300 6648) [ in ei_atan2__A()]
868b2b66 (kx 2024-12-20 16:11:07 +0300 6649) are obtained by a special Remez algorithm.
868b2b66 (kx 2024-12-20 16:11:07 +0300 6650)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6651) ==========================================
868b2b66 (kx 2024-12-20 16:11:07 +0300 6652) В INTERNET я нашел следующие алгоритмы:
868b2b66 (kx 2024-12-20 16:11:07 +0300 6653)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6654) 409 cacm 355 356 14 5 May 1971 e2 A60
868b2b66 (kx 2024-12-20 16:11:07 +0300 6655) ------------------------------------------
868b2b66 (kx 2024-12-20 16:11:07 +0300 6656) H. Schmitt;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6657) Discrete {Chebychev} Curve Fit
868b2b66 (kx 2024-12-20 16:11:07 +0300 6658) approximation;Chebyshev approximation;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6659) Chebyshev curve fitting;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6660) +Chebyshev polynomial;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6661) curve approximation;curve fitting;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6662) exchange algorithm;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6663) +polynomial approximation;Remez algorithm;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6664)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6665) 501 toms 95 97 2 1 March 1976 e2 F K2
868b2b66 (kx 2024-12-20 16:11:07 +0300 6666) ---------------------------------------------
868b2b66 (kx 2024-12-20 16:11:07 +0300 6667) J. C. Simpson;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6668) {FORTRAN} Translation of Algorithm 409
868b2b66 (kx 2024-12-20 16:11:07 +0300 6669) Discrete {Chebyshev} Curve Fit
868b2b66 (kx 2024-12-20 16:11:07 +0300 6670) approximation;polynomial approximation;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6671) exchange algorithm;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6672) +Chebyshev approximation;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6673) polynomial approximation;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6674) R,toms,95,4,1,March,1978,F. Futrell;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6675)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6676) последний из которых я перевел на "С", затем
868b2b66 (kx 2024-12-20 16:11:07 +0300 6677) на язык операций повышенной разрядности.
868b2b66 (kx 2024-12-20 16:11:07 +0300 6678)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6679) ==========================================
868b2b66 (kx 2024-12-20 16:11:07 +0300 6680)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6681) SPECIAL CASES :
868b2b66 (kx 2024-12-20 16:11:07 +0300 6682) Notations:
868b2b66 (kx 2024-12-20 16:11:07 +0300 6683) atan2(y,x) == ARG (x+iy) == ARG(x,y).
868b2b66 (kx 2024-12-20 16:11:07 +0300 6684)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6685) ARG( NAN, (anything) ) is NaN;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6686) ARG( (anything), NaN ) is NaN;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6687) ARG(+(anything but NaN), +-0) is +-0 ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6688) ARG(-(anything but NaN), +-0) is +-PI;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6689) ARG( 0, +-(anything but 0 and NaN) ) is +-PI/2;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6690) ARG(+INF,+-(anything but INF and NaN) ) is +-0 ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6691) ARG(-INF,+-(anything but INF and NaN) ) is +-PI;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6692) ARG(+INF,+-INF ) is +- PI/4;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6693) ARG(-INF,+-INF ) is +-3PI/4;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6694) ARG(
868b2b66 (kx 2024-12-20 16:11:07 +0300 6695) (anything but,0,NaN,and INF),+-INF
868b2b66 (kx 2024-12-20 16:11:07 +0300 6696) ) is +-PI/2;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6697)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6698) Use Global Variable:
868b2b66 (kx 2024-12-20 16:11:07 +0300 6699)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6700) Use Functions : ei_atan2__A( eiy, eix, nb ); | st-atan2.c
868b2b66 (kx 2024-12-20 16:11:07 +0300 6701) ei_copy( eiy, eix, nb ); | mpu-real.c
868b2b66 (kx 2024-12-20 16:11:07 +0300 6702) .
868b2b66 (kx 2024-12-20 16:11:07 +0300 6703) .
868b2b66 (kx 2024-12-20 16:11:07 +0300 6704) .
868b2b66 (kx 2024-12-20 16:11:07 +0300 6705)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6706) Parameters : EMUSHORT *eic; - указатель на
868b2b66 (kx 2024-12-20 16:11:07 +0300 6707) internal e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300 6708) data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300 6709) TARGET;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6710) EMUSHORT *eiy; - указатель на
868b2b66 (kx 2024-12-20 16:11:07 +0300 6711) internal e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300 6712) data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300 6713) SOURCE;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6714) EMUSHORT *eix; - указатель на
868b2b66 (kx 2024-12-20 16:11:07 +0300 6715) internal e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300 6716) data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300 6717) SOURCE;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6718) int nb; - количество бит в
868b2b66 (kx 2024-12-20 16:11:07 +0300 6719) external e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300 6720) data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300 6721)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6722) Return : [void]
868b2b66 (kx 2024-12-20 16:11:07 +0300 6723)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6724) ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6725) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 6726) EMUSHORT *x = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 6727) *y = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 6728) *z = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 6729) *hi = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 6730) *lo = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 6731) *t = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 6732) *signy = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 6733) *signx = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 6734) *zero = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 6735) *one = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 6736) *two = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 6737) *small = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 6738) *big = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 6739) *tx = NULL, /* temp */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6740) *ty = NULL; /* temp */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6741)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6742) EMUSHORT *k = NULL, /* for Exponent */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6743) *m = NULL, /* for Exponent */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6744) *kt = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 6745) *mk = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 6746) *prec1 = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 6747) *mprec2 = NULL;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6748)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6749) EMUSHORT *pi, *pi_2, *pi_4, *pi3_4;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6750) EMUSHORT *athfhi, *athflo, *at1fhi, *at1flo;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6751) EMUSHORT *c39_16, *c1_16;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6752) EMUSHORT prec, j;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6753) int np, ne;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6754)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6755)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6756) if( nb < NBR_32 || nb > MPU_MATH_FN_LIMIT )
868b2b66 (kx 2024-12-20 16:11:07 +0300 6757) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 6758) /* error: Invalid size of operand(s) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6759) __real_invalid_size( (__mpu_char8_t *)"atan2" );
868b2b66 (kx 2024-12-20 16:11:07 +0300 6760) /* ei_ind( eiy, nb ); *//* Invalid NB */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6761) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6762) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 6763)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6764) /*******************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 6765) Hight Precision for r32, r64.
868b2b66 (kx 2024-12-20 16:11:07 +0300 6766) *******************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6767) if( nb < NBR_128 ) nb = NBR_128;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6768)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6769) np = internal_np( nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 6770)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6771) /*** Allocate memory for x, y . *****************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6772) x = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 6773) if( !x )
868b2b66 (kx 2024-12-20 16:11:07 +0300 6774) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 6775) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6776) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6777) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 6778)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6779) y = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 6780) if( !y )
868b2b66 (kx 2024-12-20 16:11:07 +0300 6781) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 6782) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6783)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6784) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6785) __mpu_sbrk( -(int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 6786) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6787)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6788) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6789) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 6790) /************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6791)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6792)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6793) ei_copy( y, eiy, nb ); /* temp for _mtherr() */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6794) ei_copy( x, eix, nb ); /* temp for _mtherr() */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6795)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6796) /***************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 6797) Test for EIX, EIY.
868b2b66 (kx 2024-12-20 16:11:07 +0300 6798) ***************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6799) /*
868b2b66 (kx 2024-12-20 16:11:07 +0300 6800) if x or y is InD ATAN2(x,y) must by InD.
868b2b66 (kx 2024-12-20 16:11:07 +0300 6801) ******************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6802) if( ei_isind( eix, nb ) )
868b2b66 (kx 2024-12-20 16:11:07 +0300 6803) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 6804) /* "argument domain error" */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6805) /* return: InD */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6806) ei_copy( eic, eix, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 6807) /***************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 6808) NOTE:
868b2b66 (kx 2024-12-20 16:11:07 +0300 6809) Функция _mtherr() является переходником между
868b2b66 (kx 2024-12-20 16:11:07 +0300 6810) внутренним форматом и внешней,
868b2b66 (kx 2024-12-20 16:11:07 +0300 6811) переопределяемой пользователем, функцией
868b2b66 (kx 2024-12-20 16:11:07 +0300 6812) _math_error(). Кроме основных действий она
868b2b66 (kx 2024-12-20 16:11:07 +0300 6813) выставляет системную переменную errno
868b2b66 (kx 2024-12-20 16:11:07 +0300 6814) следующим образом.
868b2b66 (kx 2024-12-20 16:11:07 +0300 6815)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6816) errno = __mpu_math_errnotab[type];
868b2b66 (kx 2024-12-20 16:11:07 +0300 6817) ***************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6818) _mtherr( eic, (__mpu_char8_t *)"atan2", __DOMAIN__,
868b2b66 (kx 2024-12-20 16:11:07 +0300 6819) eic, y, x, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 6820) __STDOM; /* InD - produsing Domain Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6821)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6822) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6823) /* FREE y *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6824) __mpu_sbrk( -(int)(2*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 6825) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6826)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6827) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6828) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 6829) if( ei_isind( eiy, nb ) )
868b2b66 (kx 2024-12-20 16:11:07 +0300 6830) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 6831) /* "argument domain error" */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6832) /* return: InD */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6833) ei_copy( eic, eiy, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 6834) /***************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 6835) NOTE:
868b2b66 (kx 2024-12-20 16:11:07 +0300 6836) Функция _mtherr() является переходником между
868b2b66 (kx 2024-12-20 16:11:07 +0300 6837) внутренним форматом и внешней,
868b2b66 (kx 2024-12-20 16:11:07 +0300 6838) переопределяемой пользователем, функцией
868b2b66 (kx 2024-12-20 16:11:07 +0300 6839) _math_error(). Кроме основных действий она
868b2b66 (kx 2024-12-20 16:11:07 +0300 6840) выставляет системную переменную errno
868b2b66 (kx 2024-12-20 16:11:07 +0300 6841) следующим образом.
868b2b66 (kx 2024-12-20 16:11:07 +0300 6842)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6843) errno = __mpu_math_errnotab[type];
868b2b66 (kx 2024-12-20 16:11:07 +0300 6844) ***************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6845) _mtherr( eic, (__mpu_char8_t *)"atan2", __DOMAIN__,
868b2b66 (kx 2024-12-20 16:11:07 +0300 6846) eic, y, x, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 6847) __STDOM; /* InD - produsing Domain Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6848)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6849) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6850) /* FREE y *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6851) __mpu_sbrk( -(int)(2*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 6852) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6853)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6854) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6855) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 6856)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6857) /*
868b2b66 (kx 2024-12-20 16:11:07 +0300 6858) if x or y is NaN ATAN2(x,y) must by NaN.
868b2b66 (kx 2024-12-20 16:11:07 +0300 6859) ******************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6860) if( ei_isnans( eix, nb ) )
868b2b66 (kx 2024-12-20 16:11:07 +0300 6861) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 6862) /* "argument domain error" */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6863) /* return: NaN */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6864) ei_copy( eic, eix, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 6865) /***************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 6866) NOTE:
868b2b66 (kx 2024-12-20 16:11:07 +0300 6867) Функция _mtherr() является переходником между
868b2b66 (kx 2024-12-20 16:11:07 +0300 6868) внутренним форматом и внешней,
868b2b66 (kx 2024-12-20 16:11:07 +0300 6869) переопределяемой пользователем, функцией
868b2b66 (kx 2024-12-20 16:11:07 +0300 6870) _math_error(). Кроме основных действий она
868b2b66 (kx 2024-12-20 16:11:07 +0300 6871) выставляет системную переменную errno
868b2b66 (kx 2024-12-20 16:11:07 +0300 6872) следующим образом.
868b2b66 (kx 2024-12-20 16:11:07 +0300 6873)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6874) errno = __mpu_math_errnotab[type];
868b2b66 (kx 2024-12-20 16:11:07 +0300 6875) ***************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6876) _mtherr( eic, (__mpu_char8_t *)"atan2", __DOMAIN__,
868b2b66 (kx 2024-12-20 16:11:07 +0300 6877) eic, y, x, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 6878) __STDOM; /* NaN - produsing Domain Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6879)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6880) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6881) /* FREE y *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6882) __mpu_sbrk( -(int)(2*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 6883) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6884)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6885) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6886) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 6887) if( ei_isnans( eiy, nb ) )
868b2b66 (kx 2024-12-20 16:11:07 +0300 6888) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 6889) /* "argument domain error" */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6890) /* return: NaN */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6891) ei_copy( eic, eiy, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 6892) /***************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 6893) NOTE:
868b2b66 (kx 2024-12-20 16:11:07 +0300 6894) Функция _mtherr() является переходником между
868b2b66 (kx 2024-12-20 16:11:07 +0300 6895) внутренним форматом и внешней,
868b2b66 (kx 2024-12-20 16:11:07 +0300 6896) переопределяемой пользователем, функцией
868b2b66 (kx 2024-12-20 16:11:07 +0300 6897) _math_error(). Кроме основных действий она
868b2b66 (kx 2024-12-20 16:11:07 +0300 6898) выставляет системную переменную errno
868b2b66 (kx 2024-12-20 16:11:07 +0300 6899) следующим образом.
868b2b66 (kx 2024-12-20 16:11:07 +0300 6900)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6901) errno = __mpu_math_errnotab[type];
868b2b66 (kx 2024-12-20 16:11:07 +0300 6902) ***************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6903) _mtherr( eic, (__mpu_char8_t *)"atan2", __DOMAIN__,
868b2b66 (kx 2024-12-20 16:11:07 +0300 6904) eic, y, x, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 6905) __STDOM; /* NaN - produsing Domain Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6906)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6907) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6908) /* FREE y *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6909) __mpu_sbrk( -(int)(2*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 6910) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6911)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6912) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6913) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 6914)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6915)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6916) ne = internal_ne( nb ) + 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6917)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6918) /*** Allocate memory for z, hi, lo, t, signy, signx . *******/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6919) z = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 6920) if( !z )
868b2b66 (kx 2024-12-20 16:11:07 +0300 6921) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 6922) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6923)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6924) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6925) /* FREE y *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6926) __mpu_sbrk( -(int)(2*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 6927) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6928)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6929) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6930) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 6931)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6932) hi = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 6933) if( !hi )
868b2b66 (kx 2024-12-20 16:11:07 +0300 6934) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 6935) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6936)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6937) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6938) /* FREE y *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6939) /* FREE z *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6940) __mpu_sbrk( -(int)(3*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 6941) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6942)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6943) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6944) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 6945)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6946) lo = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 6947) if( !lo )
868b2b66 (kx 2024-12-20 16:11:07 +0300 6948) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 6949) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6950)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6951) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6952) /* FREE y *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6953) /* FREE z *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6954) /* FREE hi ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6955) __mpu_sbrk( -(int)(4*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 6956) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6957)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6958) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6959) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 6960)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6961) t = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 6962) if( !t )
868b2b66 (kx 2024-12-20 16:11:07 +0300 6963) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 6964) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6965)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6966) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6967) /* FREE y *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6968) /* FREE z *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6969) /* FREE hi ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6970) /* FREE lo ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6971) __mpu_sbrk( -(int)(5*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 6972) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6973)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6974) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6975) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 6976)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6977) signy = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 6978) if( !signy )
868b2b66 (kx 2024-12-20 16:11:07 +0300 6979) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 6980) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6981)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6982) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6983) /* FREE y *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6984) /* FREE z *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6985) /* FREE hi ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6986) /* FREE lo ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6987) /* FREE t *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6988) __mpu_sbrk( -(int)(6*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 6989) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6990)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6991) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6992) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 6993)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6994) signx = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 6995) if( !signx )
868b2b66 (kx 2024-12-20 16:11:07 +0300 6996) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 6997) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6998)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6999) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7000) /* FREE y *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7001) /* FREE z *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7002) /* FREE hi ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7003) /* FREE lo ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7004) /* FREE t *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7005) /* FREE signy *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7006) __mpu_sbrk( -(int)(7*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 7007) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7008)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7009) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7010) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 7011) /************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7012)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7013) /*** Allocate memory for zero, one, two, small, big . *******/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7014) zero = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 7015) if( !zero )
868b2b66 (kx 2024-12-20 16:11:07 +0300 7016) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 7017) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 7018)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7019) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7020) /* FREE y *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7021) /* FREE z *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7022) /* FREE hi ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7023) /* FREE lo ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7024) /* FREE t *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7025) /* FREE signy *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7026) /* FREE signx *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7027) __mpu_sbrk( -(int)(8*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 7028) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7029)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7030) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7031) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 7032)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7033) one = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 7034) if( !one )
868b2b66 (kx 2024-12-20 16:11:07 +0300 7035) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 7036) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 7037)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7038) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7039) /* FREE y *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7040) /* FREE z *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7041) /* FREE hi ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7042) /* FREE lo ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7043) /* FREE t *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7044) /* FREE signy *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7045) /* FREE signx *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7046) /* FREE zero **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7047) __mpu_sbrk( -(int)(9*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 7048) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7049)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7050) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7051) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 7052)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7053) two = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 7054) if( !two )
868b2b66 (kx 2024-12-20 16:11:07 +0300 7055) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 7056) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 7057)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7058) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7059) /* FREE y *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7060) /* FREE z *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7061) /* FREE hi ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7062) /* FREE lo ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7063) /* FREE t *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7064) /* FREE signy *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7065) /* FREE signx *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7066) /* FREE zero **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7067) /* FREE one ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7068) __mpu_sbrk( -(int)(10*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 7069) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7070)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7071) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7072) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 7073)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7074) small = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 7075) if( !small )
868b2b66 (kx 2024-12-20 16:11:07 +0300 7076) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 7077) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 7078)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7079) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7080) /* FREE y *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7081) /* FREE z *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7082) /* FREE hi ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7083) /* FREE lo ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7084) /* FREE t *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7085) /* FREE signy *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7086) /* FREE signx *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7087) /* FREE zero **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7088) /* FREE one ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7089) /* FREE two ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7090) __mpu_sbrk( -(int)(11*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 7091) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7092)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7093) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7094) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 7095)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7096) big = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 7097) if( !big )
868b2b66 (kx 2024-12-20 16:11:07 +0300 7098) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 7099) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 7100)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7101) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7102) /* FREE y *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7103) /* FREE z *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7104) /* FREE hi ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7105) /* FREE lo ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7106) /* FREE t *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7107) /* FREE signy *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7108) /* FREE signx *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7109) /* FREE zero **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7110) /* FREE one ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7111) /* FREE two ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7112) /* FREE small *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7113) __mpu_sbrk( -(int)(12*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 7114) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7115)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7116) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7117) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 7118) /************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7119)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7120) /*** Allocate memory for tx, ty . ***************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7121) tx = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 7122) if( !tx )
868b2b66 (kx 2024-12-20 16:11:07 +0300 7123) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 7124) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 7125)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7126) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7127) /* FREE y *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7128) /* FREE z *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7129) /* FREE hi ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7130) /* FREE lo ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7131) /* FREE t *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7132) /* FREE signy *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7133) /* FREE signx *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7134) /* FREE zero **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7135) /* FREE one ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7136) /* FREE two ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7137) /* FREE small *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7138) /* FREE big ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7139) __mpu_sbrk( -(int)(13*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 7140) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7141)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7142) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7143) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 7144)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7145) ty = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 7146) if( !ty )
868b2b66 (kx 2024-12-20 16:11:07 +0300 7147) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 7148) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 7149)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7150) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7151) /* FREE y *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7152) /* FREE z *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7153) /* FREE hi ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7154) /* FREE lo ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7155) /* FREE t *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7156) /* FREE signy *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7157) /* FREE signx *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7158) /* FREE zero **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7159) /* FREE one ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7160) /* FREE two ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7161) /* FREE small *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7162) /* FREE big ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7163) /* FREE tx ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7164) __mpu_sbrk( -(int)(14*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 7165) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7166)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7167) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7168) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 7169) /************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7170)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7171) /*** Allocate memory for k, m, kt, mk, prec1, mprec2 . ******/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7172) k = (EMUSHORT *)__mpu_sbrk( (int)(ne*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 7173) if( !k )
868b2b66 (kx 2024-12-20 16:11:07 +0300 7174) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 7175) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 7176)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7177) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7178) /* FREE y *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7179) /* FREE z *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7180) /* FREE hi ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7181) /* FREE lo ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7182) /* FREE t *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7183) /* FREE signy *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7184) /* FREE signx *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7185) /* FREE zero **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7186) /* FREE one ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7187) /* FREE two ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7188) /* FREE small *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7189) /* FREE big ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7190) /* FREE tx ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7191) /* FREE ty ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7192) __mpu_sbrk( -(int)(15*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 7193) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7194)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7195) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7196) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 7197)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7198) m = (EMUSHORT *)__mpu_sbrk( (int)(ne*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 7199) if( !m )
868b2b66 (kx 2024-12-20 16:11:07 +0300 7200) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 7201) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 7202)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7203) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7204) /* FREE y *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7205) /* FREE z *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7206) /* FREE hi ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7207) /* FREE lo ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7208) /* FREE t *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7209) /* FREE signy *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7210) /* FREE signx *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7211) /* FREE zero **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7212) /* FREE one ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7213) /* FREE two ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7214) /* FREE small *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7215) /* FREE big ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7216) /* FREE tx ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7217) /* FREE ty ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7218) __mpu_sbrk( -(int)(15*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 7219) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7220)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7221) /* FREE k *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7222) __mpu_sbrk( -(int)(ne*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 7223) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7224)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7225) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7226) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 7227)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7228) kt = (EMUSHORT *)__mpu_sbrk( (int)(ne*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 7229) if( !kt )
868b2b66 (kx 2024-12-20 16:11:07 +0300 7230) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 7231) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 7232)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7233) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7234) /* FREE y *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7235) /* FREE z *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7236) /* FREE hi ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7237) /* FREE lo ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7238) /* FREE t *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7239) /* FREE signy *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7240) /* FREE signx *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7241) /* FREE zero **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7242) /* FREE one ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7243) /* FREE two ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7244) /* FREE small *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7245) /* FREE big ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7246) /* FREE tx ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7247) /* FREE ty ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7248) __mpu_sbrk( -(int)(15*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 7249) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7250)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7251) /* FREE k *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7252) /* FREE m *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7253) __mpu_sbrk( -(int)(2*ne*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 7254) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7255)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7256) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7257) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 7258)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7259) mk = (EMUSHORT *)__mpu_sbrk( (int)(ne*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 7260) if( !mk )
868b2b66 (kx 2024-12-20 16:11:07 +0300 7261) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 7262) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 7263)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7264) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7265) /* FREE y *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7266) /* FREE z *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7267) /* FREE hi ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7268) /* FREE lo ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7269) /* FREE t *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7270) /* FREE signy *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7271) /* FREE signx *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7272) /* FREE zero **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7273) /* FREE one ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7274) /* FREE two ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7275) /* FREE small *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7276) /* FREE big ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7277) /* FREE tx ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7278) /* FREE ty ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7279) __mpu_sbrk( -(int)(15*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 7280) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7281)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7282) /* FREE k *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7283) /* FREE m *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7284) /* FREE kt ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7285) __mpu_sbrk( -(int)(3*ne*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 7286) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7287)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7288) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7289) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 7290)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7291) prec1 = (EMUSHORT *)__mpu_sbrk( (int)(ne*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 7292) if( !prec1 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 7293) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 7294) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 7295)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7296) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7297) /* FREE y *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7298) /* FREE z *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7299) /* FREE hi ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7300) /* FREE lo ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7301) /* FREE t *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7302) /* FREE signy *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7303) /* FREE signx *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7304) /* FREE zero **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7305) /* FREE one ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7306) /* FREE two ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7307) /* FREE small *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7308) /* FREE big ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7309) /* FREE tx ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7310) /* FREE ty ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7311) __mpu_sbrk( -(int)(15*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 7312) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7313)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7314) /* FREE k *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7315) /* FREE m *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7316) /* FREE kt ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7317) /* FREE mk ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7318) __mpu_sbrk( -(int)(4*ne*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 7319) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7320)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7321) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7322) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 7323)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7324) mprec2 = (EMUSHORT *)__mpu_sbrk( (int)(ne*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 7325) if( !mprec2 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 7326) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 7327) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 7328)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7329) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7330) /* FREE y *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7331) /* FREE z *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7332) /* FREE hi ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7333) /* FREE lo ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7334) /* FREE t *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7335) /* FREE signy *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7336) /* FREE signx *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7337) /* FREE zero **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7338) /* FREE one ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7339) /* FREE two ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7340) /* FREE small *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7341) /* FREE big ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7342) /* FREE tx ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7343) /* FREE ty ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7344) __mpu_sbrk( -(int)(15*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 7345) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7346)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7347) /* FREE k *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7348) /* FREE m *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7349) /* FREE kt ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7350) /* FREE mk ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7351) /* FREE prec1 *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7352) __mpu_sbrk( -(int)(5*ne*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 7353) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7354)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7355) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7356) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 7357) /************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7358)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7359)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7360) _gen_zero( zero, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 7361) _gen_one ( one, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 7362) _gen_two ( two, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 7363) /*********************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 7364) small: 1.0 + small^2 == 1.0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7365) big : big = 1/(small^2);
868b2b66 (kx 2024-12-20 16:11:07 +0300 7366) *********************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7367) ei_sqrt( small, _get_epsilon_ptr( nb ), nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 7368) ei_div( big, one, _get_epsilon_ptr( nb ), nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 7369)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7370) pi = _get_m_pi_ptr ( nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 7371) pi_2 = _get_m_pi_2_ptr ( nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 7372) pi_4 = _get_m_pi_4_ptr ( nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 7373) pi3_4 = _get_m_3pi_4_ptr( nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 7374)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7375) /* Service Constants */
868b2b66 (kx 2024-12-20 16:11:07 +0300 7376) athfhi = _get_m_athfhi_ptr( nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 7377) athflo = _get_m_athflo_ptr( nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 7378) at1fhi = _get_m_at1fhi_ptr( nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 7379) at1flo = _get_m_at1flo_ptr( nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 7380) c39_16 = _get_m_39_16_ptr ( nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 7381) c1_16 = _get_m_1_16_ptr ( nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 7382)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7383) /* ei_copy( y, eiy, nb ); */
868b2b66 (kx 2024-12-20 16:11:07 +0300 7384) /* ei_copy( x, eix, nb ); */
868b2b66 (kx 2024-12-20 16:11:07 +0300 7385)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7386)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7387) /************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 7388) Copy down the sign of EIY and EIX.
868b2b66 (kx 2024-12-20 16:11:07 +0300 7389) ************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7390) ei_copysign( signy, one, y, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 7391) ei_copysign( signx, one, x, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 7392)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7393) /**************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 7394) If x is 1.0, goto begin.
868b2b66 (kx 2024-12-20 16:11:07 +0300 7395) **************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7396) if( ei_cmp( x, one, nb ) == 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 7397) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 7398) ei_copysign( y, y, one, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 7399) ei_copy( t, y, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 7400) if( !ei_isinfin( t, nb ) ) goto begin;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7401) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 7402)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7403) /*************
868b2b66 (kx 2024-12-20 16:11:07 +0300 7404) If y is 0.0
868b2b66 (kx 2024-12-20 16:11:07 +0300 7405) *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7406) if( ei_cmp( y, zero, nb ) == 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 7407) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 7408) if( ei_cmp( signx, one, nb ) == 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 7409) ei_copy( eic, y, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 7410) else
868b2b66 (kx 2024-12-20 16:11:07 +0300 7411) ei_copysign( eic, pi, signy, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 7412)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7413)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7414) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7415) /* FREE y *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7416) /* FREE z *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7417) /* FREE hi ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7418) /* FREE lo ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7419) /* FREE t *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7420) /* FREE signy *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7421) /* FREE signx *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7422) /* FREE zero **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7423) /* FREE one ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7424) /* FREE two ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7425) /* FREE small *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7426) /* FREE big ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7427) /* FREE tx ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7428) /* FREE ty ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7429) __mpu_sbrk( -(int)(15*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 7430) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7431)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7432) /* FREE k *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7433) /* FREE m *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7434) /* FREE kt ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7435) /* FREE mk ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7436) /* FREE prec1 *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7437) /* FREE mprec2 ************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7438) __mpu_sbrk( -(int)(6*ne*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 7439) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7440)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7441) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7442) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 7443)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7444) /*************
868b2b66 (kx 2024-12-20 16:11:07 +0300 7445) If x is 0.0
868b2b66 (kx 2024-12-20 16:11:07 +0300 7446) *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7447) if( ei_cmp( x, zero, nb ) == 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 7448) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 7449) ei_copysign( eic, pi_2, signy, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 7450)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7451) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7452) /* FREE y *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7453) /* FREE z *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7454) /* FREE hi ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7455) /* FREE lo ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7456) /* FREE t *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7457) /* FREE signy *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7458) /* FREE signx *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7459) /* FREE zero **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7460) /* FREE one ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7461) /* FREE two ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7462) /* FREE small *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7463) /* FREE big ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7464) /* FREE tx ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7465) /* FREE ty ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7466) __mpu_sbrk( -(int)(15*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 7467) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7468)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7469) /* FREE k *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7470) /* FREE m *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7471) /* FREE kt ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7472) /* FREE mk ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7473) /* FREE prec1 *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7474) /* FREE mprec2 ************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7475) __mpu_sbrk( -(int)(6*ne*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 7476) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7477)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7478) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7479) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 7480)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7481) /********************
868b2b66 (kx 2024-12-20 16:11:07 +0300 7482) When x is Infinity
868b2b66 (kx 2024-12-20 16:11:07 +0300 7483) ********************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7484) if( ei_isinfin( x, nb ) )
868b2b66 (kx 2024-12-20 16:11:07 +0300 7485) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 7486) if( ei_isinfin( y, nb ) )
868b2b66 (kx 2024-12-20 16:11:07 +0300 7487) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 7488) if( ei_cmp( signx, one, nb ) == 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 7489) ei_copysign( eic, pi_4, signy, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 7490) else
868b2b66 (kx 2024-12-20 16:11:07 +0300 7491) ei_copysign( eic, pi3_4, signy, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 7492)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7493) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7494) /* FREE y *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7495) /* FREE z *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7496) /* FREE hi ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7497) /* FREE lo ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7498) /* FREE t *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7499) /* FREE signy *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7500) /* FREE signx *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7501) /* FREE zero **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7502) /* FREE one ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7503) /* FREE two ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7504) /* FREE small *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7505) /* FREE big ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7506) /* FREE tx ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7507) /* FREE ty ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7508) __mpu_sbrk( -(int)(15*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 7509) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7510)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7511) /* FREE k *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7512) /* FREE m *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7513) /* FREE kt ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7514) /* FREE mk ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7515) /* FREE prec1 *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7516) /* FREE mprec2 ************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7517) __mpu_sbrk( -(int)(6*ne*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 7518) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7519)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7520) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7521) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 7522) else
868b2b66 (kx 2024-12-20 16:11:07 +0300 7523) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 7524) if( ei_cmp( signx, one, nb ) == 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 7525) ei_copysign( eic, zero, signy, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 7526) else
868b2b66 (kx 2024-12-20 16:11:07 +0300 7527) ei_copysign( eic, pi, signy, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 7528)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7529) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7530) /* FREE y *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7531) /* FREE z *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7532) /* FREE hi ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7533) /* FREE lo ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7534) /* FREE t *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7535) /* FREE signy *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7536) /* FREE signx *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7537) /* FREE zero **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7538) /* FREE one ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7539) /* FREE two ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7540) /* FREE small *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7541) /* FREE big ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7542) /* FREE tx ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7543) /* FREE ty ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7544) __mpu_sbrk( -(int)(15*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 7545) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7546)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7547) /* FREE k *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7548) /* FREE m *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7549) /* FREE kt ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7550) /* FREE mk ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7551) /* FREE prec1 *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7552) /* FREE mprec2 ************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7553) __mpu_sbrk( -(int)(6*ne*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 7554) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7555)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7556) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7557) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 7558)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7559) } /* End if( x == Infinity ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 7560)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7561) /********************
868b2b66 (kx 2024-12-20 16:11:07 +0300 7562) When y is Infinity
868b2b66 (kx 2024-12-20 16:11:07 +0300 7563) ********************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7564) if( ei_isinfin( y, nb ) )
868b2b66 (kx 2024-12-20 16:11:07 +0300 7565) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 7566) ei_copysign( eic, pi_2, signy, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 7567)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7568) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7569) /* FREE y *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7570) /* FREE z *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7571) /* FREE hi ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7572) /* FREE lo ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7573) /* FREE t *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7574) /* FREE signy *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7575) /* FREE signx *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7576) /* FREE zero **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7577) /* FREE one ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7578) /* FREE two ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7579) /* FREE small *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7580) /* FREE big ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7581) /* FREE tx ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7582) /* FREE ty ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7583) __mpu_sbrk( -(int)(15*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 7584) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7585)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7586) /* FREE k *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7587) /* FREE m *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7588) /* FREE kt ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7589) /* FREE mk ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7590) /* FREE prec1 *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7591) /* FREE mprec2 ************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7592) __mpu_sbrk( -(int)(6*ne*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 7593) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7594)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7595) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7596)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7597) } /* End if( y == Infinity ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 7598)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7599) /*************
868b2b66 (kx 2024-12-20 16:11:07 +0300 7600) Compute y/x
868b2b66 (kx 2024-12-20 16:11:07 +0300 7601) *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7602) /* prec1 = NSBITS(nb); mprec2 = -(3/2)*NSBITS(nb); */
868b2b66 (kx 2024-12-20 16:11:07 +0300 7603) prec = NSBITS(nb);
868b2b66 (kx 2024-12-20 16:11:07 +0300 7604) ei_cpye_unpack( prec1, (EMUSHORT *)&prec, ne, 1 );
868b2b66 (kx 2024-12-20 16:11:07 +0300 7605) prec /= 2;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7606) ei_cpye_unpack( mprec2, (EMUSHORT *)&prec, ne, 1 );
868b2b66 (kx 2024-12-20 16:11:07 +0300 7607) ei_adde( mprec2, mprec2, prec1, ne );
868b2b66 (kx 2024-12-20 16:11:07 +0300 7608) ei_nege( mprec2, mprec2, ne );
868b2b66 (kx 2024-12-20 16:11:07 +0300 7609)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7610) ei_copysign( y, y, one, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 7611) ei_copysign( x, x, one, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 7612)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7613) ei_logb( k, y, ne, nb ); /* k = logb( y ); */
868b2b66 (kx 2024-12-20 16:11:07 +0300 7614) ei_logb( kt, x, ne, nb ); /* kt = logb( x ); */
868b2b66 (kx 2024-12-20 16:11:07 +0300 7615) ei_sube( m, k, kt, ne ); /* m = (k=logb(y)) - logb(x); */
868b2b66 (kx 2024-12-20 16:11:07 +0300 7616)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7617) ei_nege( mk, k, ne ); /* mk = -k; */
868b2b66 (kx 2024-12-20 16:11:07 +0300 7618) if( ei_cmpe( m, prec1, ne ) > 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 7619) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 7620) ei_add( t, big, big, nb ); /* t = big+big; */
868b2b66 (kx 2024-12-20 16:11:07 +0300 7621) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 7622) else if( ei_cmpe( m, mprec2, ne ) < 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 7623) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 7624) ei_div( t, y, x, nb ); /* t = y/x; */
868b2b66 (kx 2024-12-20 16:11:07 +0300 7625) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 7626) else
868b2b66 (kx 2024-12-20 16:11:07 +0300 7627) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 7628) ei_div( t, y, x, nb ); /* t = y/x; */
868b2b66 (kx 2024-12-20 16:11:07 +0300 7629) ei_ldexp( y, mk, y, ne, nb ); /* y = ldexp( y, -k ); */
868b2b66 (kx 2024-12-20 16:11:07 +0300 7630) ei_ldexp( x, mk, x, ne, nb ); /* x = ldexp( x, -k ); */
868b2b66 (kx 2024-12-20 16:11:07 +0300 7631) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 7632)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7633)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7634) /*************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 7635) BEGIN ARGUMENT REDUCTION:
868b2b66 (kx 2024-12-20 16:11:07 +0300 7636) *************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7637) begin:
868b2b66 (kx 2024-12-20 16:11:07 +0300 7638) if( ei_cmp( t, c39_16, nb ) < 0 ) /* if( t < 39/16 ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 7639) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 7640) /* truncate 4(t+1/16) to integer for branching */
868b2b66 (kx 2024-12-20 16:11:07 +0300 7641) ei_add( tx, t, c1_16, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 7642) ei_mul( tx, tx, two, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 7643) ei_mul( tx, tx, two, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 7644) ei_rtol_frac( (EMUSHORT *)&j, /* j = 4*(t+0.0625); */
868b2b66 (kx 2024-12-20 16:11:07 +0300 7645) (EMUSHORT *)0, tx, 1, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 7646) switch( j )
868b2b66 (kx 2024-12-20 16:11:07 +0300 7647) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 7648) /* t is in [0, 7/16] */
868b2b66 (kx 2024-12-20 16:11:07 +0300 7649) case 0:
868b2b66 (kx 2024-12-20 16:11:07 +0300 7650) case 1:
868b2b66 (kx 2024-12-20 16:11:07 +0300 7651) if( ei_cmp( t, small, nb ) < 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 7652) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 7653) if( ei_cmp( signx, zero, nb ) > 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 7654) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 7655) ei_copysign( eic, t, signy, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 7656) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 7657) else
868b2b66 (kx 2024-12-20 16:11:07 +0300 7658) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 7659) ei_sub( t, pi, t, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 7660) ei_copysign( eic, t, signy, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 7661) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 7662)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7663) /* raise the inexact flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 7664) /* big+small */
868b2b66 (kx 2024-12-20 16:11:07 +0300 7665) ei_copy( y, eiy, nb ); /* for &eiy == &eic */
868b2b66 (kx 2024-12-20 16:11:07 +0300 7666) ei_copy( x, eix, nb ); /* for &eix == &eic */
868b2b66 (kx 2024-12-20 16:11:07 +0300 7667)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7668) /***************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 7669) NOTE:
868b2b66 (kx 2024-12-20 16:11:07 +0300 7670) Функция _mtherr() является переходником между
868b2b66 (kx 2024-12-20 16:11:07 +0300 7671) внутренним форматом и внешней,
868b2b66 (kx 2024-12-20 16:11:07 +0300 7672) переопределяемой пользователем, функцией
868b2b66 (kx 2024-12-20 16:11:07 +0300 7673) _math_error(). Кроме основных действий она
868b2b66 (kx 2024-12-20 16:11:07 +0300 7674) выставляет системную переменную errno
868b2b66 (kx 2024-12-20 16:11:07 +0300 7675) следующим образом.
868b2b66 (kx 2024-12-20 16:11:07 +0300 7676)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7677) errno = __mpu_math_errnotab[type];
868b2b66 (kx 2024-12-20 16:11:07 +0300 7678) ***************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7679) _mtherr( (EMUSHORT *)0, /* Non change */
868b2b66 (kx 2024-12-20 16:11:07 +0300 7680) (__mpu_char8_t *)"atan2", __INEXACT__,
868b2b66 (kx 2024-12-20 16:11:07 +0300 7681) eic, y, x, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 7682) __STINX; /* produsing Inexact Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 7683)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7684) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7685) /* FREE y *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7686) /* FREE z *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7687) /* FREE hi ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7688) /* FREE lo ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7689) /* FREE t *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7690) /* FREE signy *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7691) /* FREE signx *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7692) /* FREE zero **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7693) /* FREE one ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7694) /* FREE two ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7695) /* FREE small *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7696) /* FREE big ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7697) /* FREE tx ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7698) /* FREE ty ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7699) __mpu_sbrk( -(int)(15*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 7700) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7701)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7702) /* FREE k *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7703) /* FREE m *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7704) /* FREE kt ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7705) /* FREE mk ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7706) /* FREE prec1 *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7707) /* FREE mprec2 ************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7708) __mpu_sbrk( -(int)(6*ne*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 7709) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7710)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7711) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7712) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 7713)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7714) ei_copy( hi, zero, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 7715) ei_copy( lo, zero, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 7716) break;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7717)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7718) /* t is in [7/16, 11/16] */
868b2b66 (kx 2024-12-20 16:11:07 +0300 7719) case 2:
868b2b66 (kx 2024-12-20 16:11:07 +0300 7720) ei_copy( hi, athfhi, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 7721) ei_copy( lo, athflo, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 7722) ei_add( z, x, x, nb ); /* z = x+x; */
868b2b66 (kx 2024-12-20 16:11:07 +0300 7723) ei_add( ty, y, y, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 7724) ei_sub( ty, ty, x, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 7725) ei_add( tx, z, y, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 7726) ei_div( t, ty, tx, nb ); /* t = ((y+y)-x)/(z+y); */
868b2b66 (kx 2024-12-20 16:11:07 +0300 7727) break;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7728)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7729) /* t is in [11/16, 19/16] */
868b2b66 (kx 2024-12-20 16:11:07 +0300 7730) case 3:
868b2b66 (kx 2024-12-20 16:11:07 +0300 7731) case 4:
868b2b66 (kx 2024-12-20 16:11:07 +0300 7732) ei_copy( hi, pi_4, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 7733) ei_copy( lo, zero, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 7734) ei_sub( ty, y, x, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 7735) ei_add( tx, x, y, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 7736) ei_div( t, ty, tx, nb ); /* t = (y-x)/(x+y); */
868b2b66 (kx 2024-12-20 16:11:07 +0300 7737) break;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7738)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7739) /* t is in [19/16, 39/16] */
868b2b66 (kx 2024-12-20 16:11:07 +0300 7740) default:
868b2b66 (kx 2024-12-20 16:11:07 +0300 7741) ei_copy( hi, at1fhi, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 7742) ei_copy( lo, at1flo, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 7743) ei_sub( z, y, x, nb ); /* z = y-x; */
868b2b66 (kx 2024-12-20 16:11:07 +0300 7744) ei_add( ty, y, y, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 7745) ei_add( y, ty, y, nb ); /* y = y+y+y; */
868b2b66 (kx 2024-12-20 16:11:07 +0300 7746) ei_add( t, x, x, nb ); /* t = x+x; */
868b2b66 (kx 2024-12-20 16:11:07 +0300 7747) ei_add( ty, z, z, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 7748) ei_sub( ty, ty, x, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 7749) ei_add( tx, t, y, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 7750) ei_div( t, ty, tx, nb ); /* t = ((z+z)-x)/(t+y); */
868b2b66 (kx 2024-12-20 16:11:07 +0300 7751) break;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7752)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7753) } /* End of switch( j ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 7754)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7755) } /* End if( t < 39/16 ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 7756) else
868b2b66 (kx 2024-12-20 16:11:07 +0300 7757) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 7758) ei_copy( hi, pi_2, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 7759) ei_copy( lo, zero, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 7760)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7761) /* t is in [39/16, big] */
868b2b66 (kx 2024-12-20 16:11:07 +0300 7762) if( ei_cmp( t, big, nb ) <= 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 7763) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 7764) ei_copy( tx, x, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 7765) ei_neg( tx, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 7766) ei_div( t, tx, y, nb ); /* t = -x/y; */
868b2b66 (kx 2024-12-20 16:11:07 +0300 7767) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 7768) /* t is in [big, Infinity] */
868b2b66 (kx 2024-12-20 16:11:07 +0300 7769) else
868b2b66 (kx 2024-12-20 16:11:07 +0300 7770) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 7771) /* raise the inexact flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 7772) /* big+small */
868b2b66 (kx 2024-12-20 16:11:07 +0300 7773) /***************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 7774) NOTE:
868b2b66 (kx 2024-12-20 16:11:07 +0300 7775) Функция _mtherr() является переходником между
868b2b66 (kx 2024-12-20 16:11:07 +0300 7776) внутренним форматом и внешней,
868b2b66 (kx 2024-12-20 16:11:07 +0300 7777) переопределяемой пользователем, функцией
868b2b66 (kx 2024-12-20 16:11:07 +0300 7778) _math_error(). Кроме основных действий она
868b2b66 (kx 2024-12-20 16:11:07 +0300 7779) выставляет системную переменную errno
868b2b66 (kx 2024-12-20 16:11:07 +0300 7780) следующим образом.
868b2b66 (kx 2024-12-20 16:11:07 +0300 7781)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7782) errno = __mpu_math_errnotab[type];
868b2b66 (kx 2024-12-20 16:11:07 +0300 7783) ***************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7784) _mtherr( (EMUSHORT *)0, /* Non change */
868b2b66 (kx 2024-12-20 16:11:07 +0300 7785) (__mpu_char8_t *)"atan2", __INEXACT__,
868b2b66 (kx 2024-12-20 16:11:07 +0300 7786) (EMUSHORT *)0, eiy, eix, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 7787) __STINX; /* produsing Inexact Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 7788)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7789) ei_copy( t, zero, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 7790) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 7791) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 7792) /*************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 7793) :END OF ARGUMENT REDUCTION.
868b2b66 (kx 2024-12-20 16:11:07 +0300 7794) *************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7795)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7796)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7797) /*************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 7798) COMPUTE ATAN(t) FOR t in [-7/16, 7/16].
868b2b66 (kx 2024-12-20 16:11:07 +0300 7799) *************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7800) ei_mul( z, t, t, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 7801) ei_atan2__A( tx, z, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 7802) ei_mul( z, t, tx, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 7803)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7804) ei_sub( z, lo, z, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 7805) ei_add( z, z, t, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 7806) ei_add( z, z, hi, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 7807)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7808) if( ei_cmp( signx, zero, nb ) > 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 7809) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 7810) ei_copysign( eic, z, signy, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 7811) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 7812) else
868b2b66 (kx 2024-12-20 16:11:07 +0300 7813) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 7814) ei_sub( z, pi, z, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 7815) ei_copysign( eic, z, signy, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 7816) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 7817)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7818)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7819) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7820) /* FREE y *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7821) /* FREE z *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7822) /* FREE hi ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7823) /* FREE lo ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7824) /* FREE t *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7825) /* FREE signy *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7826) /* FREE signx *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7827) /* FREE zero **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7828) /* FREE one ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7829) /* FREE two ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7830) /* FREE small *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7831) /* FREE big ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7832) /* FREE tx ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7833) /* FREE ty ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7834) __mpu_sbrk( -(int)(15*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 7835) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7836)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7837) /* FREE k *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7838) /* FREE m *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7839) /* FREE kt ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7840) /* FREE mk ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7841) /* FREE prec1 *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7842) /* FREE mprec2 ************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7843) __mpu_sbrk( -(int)(6*ne*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 7844) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7845)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7846) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7847)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7848) } /* End of ei_atan2() */
868b2b66 (kx 2024-12-20 16:11:07 +0300 7849)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7850)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7851) void ei_atan( EMUSHORT *eiy, EMUSHORT *eix, int nb )
868b2b66 (kx 2024-12-20 16:11:07 +0300 7852) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 7853) EMUSHORT *one = NULL;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7854) int np;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7855)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7856) np = internal_np( nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 7857)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7858) /*** Allocate memory for one . ******************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7859) one = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 7860) if( !one )
868b2b66 (kx 2024-12-20 16:11:07 +0300 7861) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 7862) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 7863) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7864) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 7865) /************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7866)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7867) _gen_one( one, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 7868) ei_atan2( eiy, eix, one, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 7869)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7870) /* FREE one ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7871) __mpu_sbrk( -(int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 7872) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7873)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7874) } /* End of ei_atan() */
868b2b66 (kx 2024-12-20 16:11:07 +0300 7875)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7876)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7877) void ei_sinh( EMUSHORT *eiy, EMUSHORT *eix, int nb )
868b2b66 (kx 2024-12-20 16:11:07 +0300 7878) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 7879)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7880) Description : ei_sinh() Работает с
868b2b66 (kx 2024-12-20 16:11:07 +0300 7881) internal e-type data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300 7882)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7883) Concepts : SINH(EIX) RETURN THE HYPERBOLIC SINE OF EIX.
868b2b66 (kx 2024-12-20 16:11:07 +0300 7884)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7885) METHOD :
868b2b66 (kx 2024-12-20 16:11:07 +0300 7886) 1. Reduce x to non-negative by
868b2b66 (kx 2024-12-20 16:11:07 +0300 7887) sinh(-x) = - sinh(x).
868b2b66 (kx 2024-12-20 16:11:07 +0300 7888) 2.
868b2b66 (kx 2024-12-20 16:11:07 +0300 7889)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7890) expm1(x) + expm1(x)/(expm1(x)+1)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7891) 0 <= x <= lnovfl: sinh(x) = --------------------------------;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7892) 2
868b2b66 (kx 2024-12-20 16:11:07 +0300 7893)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7894) lnovfl <=x<= lnovfl+ln2: sinh(x) = expm1(x)/2 (avoid overflow);
868b2b66 (kx 2024-12-20 16:11:07 +0300 7895)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7896) lnovfl+ln2 < x < INF: overflow to INF;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7897)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7898) ACCURACY : In the absence of rounding error,
868b2b66 (kx 2024-12-20 16:11:07 +0300 7899) the appriximation has absolute error
868b2b66 (kx 2024-12-20 16:11:07 +0300 7900) less than EPSILON [see: FLOATP.H].
868b2b66 (kx 2024-12-20 16:11:07 +0300 7901)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7902) NOTE :
868b2b66 (kx 2024-12-20 16:11:07 +0300 7903)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7904) SPECIAL CASES : sinh(-InD) = -InD с выставлением DOMAIN flag;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7905) sinh(+NaN) = +NaN с выставлением DOMAIN flag;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7906) sinh(-NaN) = -NaN с выставлением DOMAIN flag;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7907) sinh(-inf) = -Inf [норма];
868b2b66 (kx 2024-12-20 16:11:07 +0300 7908) sinh(+inf) = +inf [норма];
868b2b66 (kx 2024-12-20 16:11:07 +0300 7909) sinh(+big#)= +Inf с выставлением OVERFLOW flag;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7910) sinh(-big#)= -Inf с выставлением OVERFLOW flag;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7911) sinh(0) = 0 [норма];
868b2b66 (kx 2024-12-20 16:11:07 +0300 7912)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7913) Use Global Variable:
868b2b66 (kx 2024-12-20 16:11:07 +0300 7914)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7915) Use Functions : ei_expm1( eiy, eix, nb ); | this file
868b2b66 (kx 2024-12-20 16:11:07 +0300 7916) ei_copy( eiy, eix, nb ); | mpu-real.c
868b2b66 (kx 2024-12-20 16:11:07 +0300 7917) .
868b2b66 (kx 2024-12-20 16:11:07 +0300 7918) .
868b2b66 (kx 2024-12-20 16:11:07 +0300 7919) .
868b2b66 (kx 2024-12-20 16:11:07 +0300 7920)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7921) Parameters : EMUSHORT *eiy; - указатель на
868b2b66 (kx 2024-12-20 16:11:07 +0300 7922) internal e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300 7923) data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300 7924) TARGET;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7925) EMUSHORT *eix; - указатель на
868b2b66 (kx 2024-12-20 16:11:07 +0300 7926) internal e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300 7927) data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300 7928) SOURCE;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7929) int nb; - количество бит в
868b2b66 (kx 2024-12-20 16:11:07 +0300 7930) external e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300 7931) data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300 7932)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7933) Return : [void]
868b2b66 (kx 2024-12-20 16:11:07 +0300 7934)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7935) ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7936) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 7937) EMUSHORT *x = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 7938) *t = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 7939) *sign = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 7940) *ln2p = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 7941) *one = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 7942) *half = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 7943) *tr = NULL; /* temp */
868b2b66 (kx 2024-12-20 16:11:07 +0300 7944)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7945) EMUSHORT *max = NULL; /* for MAX_BIN_Exponent */
868b2b66 (kx 2024-12-20 16:11:07 +0300 7946) EMUSHORT *ln2, *lnovfl;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7947) int np, ne;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7948)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7949)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7950) if( nb < NBR_32 || nb > MPU_MATH_FN_LIMIT )
868b2b66 (kx 2024-12-20 16:11:07 +0300 7951) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 7952) /* error: Invalid size of operand(s) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 7953) __real_invalid_size( (__mpu_char8_t *)"sinh" );
868b2b66 (kx 2024-12-20 16:11:07 +0300 7954) /* ei_ind( eiy, nb ); */ /* Invalid NB */
868b2b66 (kx 2024-12-20 16:11:07 +0300 7955) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7956) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 7957)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7958) /*******************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 7959) Hight Precision for r32, r64.
868b2b66 (kx 2024-12-20 16:11:07 +0300 7960) *******************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7961) if( nb < NBR_128 ) nb = NBR_128;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7962)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7963) np = internal_np( nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 7964)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7965) /*** Allocate memory for x . ********************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7966) x = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 7967) if( !x )
868b2b66 (kx 2024-12-20 16:11:07 +0300 7968) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 7969) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 7970) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7971) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 7972) /************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7973)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7974)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7975) ei_copy( x, eix, nb ); /* temp for _mtherr() */
868b2b66 (kx 2024-12-20 16:11:07 +0300 7976)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7977) /***************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 7978) Test for EIX.
868b2b66 (kx 2024-12-20 16:11:07 +0300 7979) ***************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7980) /* SINH(InD) must by InD */
868b2b66 (kx 2024-12-20 16:11:07 +0300 7981) if( ei_isind( eix, nb ) )
868b2b66 (kx 2024-12-20 16:11:07 +0300 7982) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 7983) /* "argument domain error" */
868b2b66 (kx 2024-12-20 16:11:07 +0300 7984) /* return: InD */
868b2b66 (kx 2024-12-20 16:11:07 +0300 7985) ei_copy( eiy, eix, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 7986) /***************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 7987) NOTE:
868b2b66 (kx 2024-12-20 16:11:07 +0300 7988) Функция _mtherr() является переходником между
868b2b66 (kx 2024-12-20 16:11:07 +0300 7989) внутренним форматом и внешней,
868b2b66 (kx 2024-12-20 16:11:07 +0300 7990) переопределяемой пользователем, функцией
868b2b66 (kx 2024-12-20 16:11:07 +0300 7991) _math_error(). Кроме основных действий она
868b2b66 (kx 2024-12-20 16:11:07 +0300 7992) выставляет системную переменную errno
868b2b66 (kx 2024-12-20 16:11:07 +0300 7993) следующим образом.
868b2b66 (kx 2024-12-20 16:11:07 +0300 7994)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7995) errno = __mpu_math_errnotab[type];
868b2b66 (kx 2024-12-20 16:11:07 +0300 7996) ***************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7997) _mtherr( eiy, (__mpu_char8_t *)"sinh", __DOMAIN__,
868b2b66 (kx 2024-12-20 16:11:07 +0300 7998) eiy, x, (EMUSHORT *)0, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 7999) __STDOM; /* InD - produsing Domain Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 8000)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8001) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8002) __mpu_sbrk( -(int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 8003) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8004)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8005) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8006) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 8007) /* SINH(NaN) must by NaN */
868b2b66 (kx 2024-12-20 16:11:07 +0300 8008) if( ei_isnans( eix, nb ) )
868b2b66 (kx 2024-12-20 16:11:07 +0300 8009) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 8010) /* "argument domain error" */
868b2b66 (kx 2024-12-20 16:11:07 +0300 8011) /* return: NaN */
868b2b66 (kx 2024-12-20 16:11:07 +0300 8012) ei_copy( eiy, eix, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 8013) /***************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 8014) NOTE:
868b2b66 (kx 2024-12-20 16:11:07 +0300 8015) Функция _mtherr() является переходником между
868b2b66 (kx 2024-12-20 16:11:07 +0300 8016) внутренним форматом и внешней,
868b2b66 (kx 2024-12-20 16:11:07 +0300 8017) переопределяемой пользователем, функцией
868b2b66 (kx 2024-12-20 16:11:07 +0300 8018) _math_error(). Кроме основных действий она
868b2b66 (kx 2024-12-20 16:11:07 +0300 8019) выставляет системную переменную errno
868b2b66 (kx 2024-12-20 16:11:07 +0300 8020) следующим образом.
868b2b66 (kx 2024-12-20 16:11:07 +0300 8021)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8022) errno = __mpu_math_errnotab[type];
868b2b66 (kx 2024-12-20 16:11:07 +0300 8023) ***************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8024) _mtherr( eiy, (__mpu_char8_t *)"sinh", __DOMAIN__,
868b2b66 (kx 2024-12-20 16:11:07 +0300 8025) eiy, x, (EMUSHORT *)0, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 8026) __STDOM; /* NaN - produsing Domain Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 8027)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8028) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8029) __mpu_sbrk( -(int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 8030) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8031)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8032) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8033) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 8034)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8035) /*
868b2b66 (kx 2024-12-20 16:11:07 +0300 8036) SINH(+Infinity) must by +Infinity;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8037) SINH(-Infinity) must by -Infinity;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8038) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 8039) if( ei_isinfin( eix, nb ) )
868b2b66 (kx 2024-12-20 16:11:07 +0300 8040) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 8041) /* Normal Exit */
868b2b66 (kx 2024-12-20 16:11:07 +0300 8042) ei_copy( eiy, eix, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 8043)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8044) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8045) __mpu_sbrk( -(int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 8046) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8047)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8048) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8049) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 8050)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8051)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8052) ne = internal_ne( nb ) + 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8053)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8054) /*** Allocate memory for t, sign, ln2p, one, half, tr . *****/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8055) t = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 8056) if( !t )
868b2b66 (kx 2024-12-20 16:11:07 +0300 8057) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 8058) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 8059)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8060) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8061) __mpu_sbrk( -(int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 8062) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8063)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8064) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8065) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 8066)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8067) sign = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 8068) if( !sign )
868b2b66 (kx 2024-12-20 16:11:07 +0300 8069) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 8070) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 8071)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8072) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8073) /* FREE t *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8074) __mpu_sbrk( -(int)(2*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 8075) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8076)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8077) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8078) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 8079)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8080) ln2p = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 8081) if( !ln2p )
868b2b66 (kx 2024-12-20 16:11:07 +0300 8082) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 8083) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 8084)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8085) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8086) /* FREE t *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8087) /* FREE sign **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8088) __mpu_sbrk( -(int)(3*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 8089) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8090)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8091) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8092) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 8093)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8094) one = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 8095) if( !one )
868b2b66 (kx 2024-12-20 16:11:07 +0300 8096) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 8097) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 8098)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8099) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8100) /* FREE t *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8101) /* FREE sign **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8102) /* FREE ln2p **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8103) __mpu_sbrk( -(int)(4*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 8104) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8105)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8106) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8107) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 8108)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8109) half = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 8110) if( !half )
868b2b66 (kx 2024-12-20 16:11:07 +0300 8111) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 8112) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 8113)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8114) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8115) /* FREE t *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8116) /* FREE sign **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8117) /* FREE ln2p **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8118) /* FREE one ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8119) __mpu_sbrk( -(int)(5*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 8120) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8121)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8122) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8123) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 8124)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8125) tr = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 8126) if( !tr )
868b2b66 (kx 2024-12-20 16:11:07 +0300 8127) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 8128) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 8129)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8130) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8131) /* FREE t *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8132) /* FREE sign **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8133) /* FREE ln2p **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8134) /* FREE one ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8135) /* FREE half **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8136) __mpu_sbrk( -(int)(6*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 8137) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8138)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8139) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8140) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 8141) /************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8142)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8143) /*** Allocate memory for max . ******************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8144) max = (EMUSHORT *)__mpu_sbrk( (int)(ne*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 8145) if( !max )
868b2b66 (kx 2024-12-20 16:11:07 +0300 8146) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 8147) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 8148)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8149) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8150) /* FREE t *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8151) /* FREE sign **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8152) /* FREE ln2p **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8153) /* FREE one ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8154) /* FREE half **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8155) /* FREE tr ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8156) __mpu_sbrk( -(int)(7*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 8157) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8158)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8159) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8160) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 8161) /************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8162)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8163)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8164) ln2 = _get_m_ln2_ptr( nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 8165)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8166) ei_cpye( max, _get_max_2_exp_ptr( nb ), ne, ne );
868b2b66 (kx 2024-12-20 16:11:07 +0300 8167)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8168) _gen_half( half, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 8169) _gen_one ( one, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 8170)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8171) /* Service Constant: */
868b2b66 (kx 2024-12-20 16:11:07 +0300 8172) lnovfl = _get_m_ln_huge_ptr( nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 8173)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8174) ei_add( ln2p, lnovfl, ln2, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 8175)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8176) /* ei_copy( x, eix, nb ); */
868b2b66 (kx 2024-12-20 16:11:07 +0300 8177)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8178)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8179) ei_copysign( sign, one, x, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 8180) ei_copysign( x, x, one, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 8181)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8182) if( ei_cmp( x, lnovfl, nb ) < 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 8183) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 8184) ei_expm1( t, x, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 8185) /* return( copysign((t+t/(one+t))*half, sign) ); */
868b2b66 (kx 2024-12-20 16:11:07 +0300 8186) ei_add( tr, one, t, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 8187) ei_div( tr, t, tr, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 8188) ei_add( tr, t, tr, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 8189) ei_mul( tr, tr, half, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 8190) ei_copysign( eiy, tr, sign, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 8191)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8192) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8193) /* FREE t *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8194) /* FREE sign **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8195) /* FREE ln2p **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8196) /* FREE one ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8197) /* FREE half **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8198) /* FREE tr ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8199) __mpu_sbrk( -(int)(7*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 8200) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8201)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8202) /* FREE max ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8203) __mpu_sbrk( -(int)(ne*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 8204) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8205)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8206) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8207) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 8208) else
868b2b66 (kx 2024-12-20 16:11:07 +0300 8209) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 8210) if( ei_cmp( x, ln2p, nb ) <= 0 ) /* if( x <= lnovfl+ln2 ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 8211) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 8212) /*
868b2b66 (kx 2024-12-20 16:11:07 +0300 8213) Substract x by ln(2^(max+1)) and return 2^max*exp(x)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8214) to avoid unnecessary overflow.
868b2b66 (kx 2024-12-20 16:11:07 +0300 8215) ******************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8216) ei_sub( tr, x, lnovfl, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 8217) ei_expm1( tr, tr, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 8218) ei_add( tr, one, tr, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 8219) ei_ldexp( tr, max, tr, ne, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 8220) ei_copysign( eiy, tr, sign, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 8221)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8222) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8223) /* FREE t *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8224) /* FREE sign **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8225) /* FREE ln2p **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8226) /* FREE one ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8227) /* FREE half **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8228) /* FREE tr ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8229) __mpu_sbrk( -(int)(7*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 8230) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8231)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8232) /* FREE max ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8233) __mpu_sbrk( -(int)(ne*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 8234) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8235)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8236) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8237) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 8238) else
868b2b66 (kx 2024-12-20 16:11:07 +0300 8239) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 8240) /* SINH(+-big#) overflow to +-Infinity */
868b2b66 (kx 2024-12-20 16:11:07 +0300 8241) /* return: +-Infinity */
868b2b66 (kx 2024-12-20 16:11:07 +0300 8242) ei_copy( x, eix, nb ); /* for &eiy == &eix */
868b2b66 (kx 2024-12-20 16:11:07 +0300 8243)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8244) ei_expm1( tr, x, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 8245) ei_mul( eiy, tr, sign, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 8246)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8247) /***************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 8248) NOTE:
868b2b66 (kx 2024-12-20 16:11:07 +0300 8249) Функция _mtherr() является переходником между
868b2b66 (kx 2024-12-20 16:11:07 +0300 8250) внутренним форматом и внешней,
868b2b66 (kx 2024-12-20 16:11:07 +0300 8251) переопределяемой пользователем, функцией
868b2b66 (kx 2024-12-20 16:11:07 +0300 8252) _math_error(). Кроме основных действий она
868b2b66 (kx 2024-12-20 16:11:07 +0300 8253) выставляет системную переменную __error_no
868b2b66 (kx 2024-12-20 16:11:07 +0300 8254) следующим образом.
868b2b66 (kx 2024-12-20 16:11:07 +0300 8255)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8256) __error_no = __mpu_math_errnotab[type];
868b2b66 (kx 2024-12-20 16:11:07 +0300 8257) ***************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8258) _mtherr( eiy, (__mpu_char8_t *)"sinh", __OVERFLOW__,
868b2b66 (kx 2024-12-20 16:11:07 +0300 8259) eiy, x, (EMUSHORT *)0, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 8260) __STOVF; /* +-big# - produsing Overflow Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 8261)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8262) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8263) /* FREE t *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8264) /* FREE sign **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8265) /* FREE ln2p **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8266) /* FREE one ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8267) /* FREE half **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8268) /* FREE tr ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8269) __mpu_sbrk( -(int)(7*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 8270) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8271)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8272) /* FREE max ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8273) __mpu_sbrk( -(int)(ne*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 8274) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8275)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8276) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8277)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8278) } /* End if/else( x <= lnovfl+ln2 ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 8279)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8280) } /* Enf if/else( x < lnovfl ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 8281)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8282) } /* End of ei_sinh() */
868b2b66 (kx 2024-12-20 16:11:07 +0300 8283)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8284)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8285) void ei_cosh( EMUSHORT *eiy, EMUSHORT *eix, int nb )
868b2b66 (kx 2024-12-20 16:11:07 +0300 8286) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 8287)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8288) Description : ei_cosh() Работает с
868b2b66 (kx 2024-12-20 16:11:07 +0300 8289) internal e-type data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300 8290)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8291) Concepts : COSH(EIX) RETURN THE HYPERBOLIC COSINE OF EIX.
868b2b66 (kx 2024-12-20 16:11:07 +0300 8292)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8293) METHOD :
868b2b66 (kx 2024-12-20 16:11:07 +0300 8294) 1. Replace x by |x|.
868b2b66 (kx 2024-12-20 16:11:07 +0300 8295) 2.
868b2b66 (kx 2024-12-20 16:11:07 +0300 8296) 0 <= x <= ln2/2 :
868b2b66 (kx 2024-12-20 16:11:07 +0300 8297) [ exp(x) - 1 ]^2
868b2b66 (kx 2024-12-20 16:11:07 +0300 8298) cosh(x) = 1 + -------------------;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8299) 2*exp(x)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8300)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8301) ln2/2 <= x <= thovfl :
868b2b66 (kx 2024-12-20 16:11:07 +0300 8302) exp(x) + 1/exp(x)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8303) cosh(x) = -------------------;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8304) 2
868b2b66 (kx 2024-12-20 16:11:07 +0300 8305)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8306) thovfl <= x <= lnovfl: cosh(x) = exp(x)/2;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8307)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8308) lnovfl<=x<=lnovfl+ln2: cosh(x) = exp(x)/2
868b2b66 (kx 2024-12-20 16:11:07 +0300 8309) (avoid overflow);
868b2b66 (kx 2024-12-20 16:11:07 +0300 8310)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8311) ln2+lnovfl < x < INF : overflow to INF;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8312)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8313) ACCURACY : In the absence of rounding error,
868b2b66 (kx 2024-12-20 16:11:07 +0300 8314) the appriximation has absolute error
868b2b66 (kx 2024-12-20 16:11:07 +0300 8315) less than EPSILON [see: mpu-floatp.h].
868b2b66 (kx 2024-12-20 16:11:07 +0300 8316)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8317) NOTE : thovfl = log1p(2.0/EPSILON-2.0) / 2.0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8318) [small == EPSILON].
868b2b66 (kx 2024-12-20 16:11:07 +0300 8319)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8320) SPECIAL CASES : cosh(-InD) = -InD с выставлением DOMAIN flag;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8321) cosh(+NaN) = +NaN с выставлением DOMAIN flag;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8322) cosh(-NaN) = -NaN с выставлением DOMAIN flag;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8323) cosh(-inf) = +Inf [норма];
868b2b66 (kx 2024-12-20 16:11:07 +0300 8324) cosh(+inf) = +Inf [норма];
868b2b66 (kx 2024-12-20 16:11:07 +0300 8325) cosh(+big#)= +Inf с выставлением OVERFLOW flag;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8326) cosh(-big#)= +Inf с выставлением OVERFLOW flag;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8327) cosh(0) = 1.0 [норма];
868b2b66 (kx 2024-12-20 16:11:07 +0300 8328)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8329) Use Global Variable:
868b2b66 (kx 2024-12-20 16:11:07 +0300 8330)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8331) Use Functions : ei_exp( eiy, eix, nb ); | this file
868b2b66 (kx 2024-12-20 16:11:07 +0300 8332) __ei_exp__E( eiy, eix, eic, nb ); | this file
868b2b66 (kx 2024-12-20 16:11:07 +0300 8333) ei_copy( eiy, eix, nb ); | mpu-real.c
868b2b66 (kx 2024-12-20 16:11:07 +0300 8334) .
868b2b66 (kx 2024-12-20 16:11:07 +0300 8335) .
868b2b66 (kx 2024-12-20 16:11:07 +0300 8336) .
868b2b66 (kx 2024-12-20 16:11:07 +0300 8337)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8338) Parameters : EMUSHORT *eiy; - указатель на
868b2b66 (kx 2024-12-20 16:11:07 +0300 8339) internal e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300 8340) data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300 8341) TARGET;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8342) EMUSHORT *eix; - указатель на
868b2b66 (kx 2024-12-20 16:11:07 +0300 8343) internal e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300 8344) data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300 8345) SOURCE;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8346) int nb; - количество бит в
868b2b66 (kx 2024-12-20 16:11:07 +0300 8347) external e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300 8348) data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300 8349)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8350) Return : [void]
868b2b66 (kx 2024-12-20 16:11:07 +0300 8351)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8352) ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8353) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 8354) EMUSHORT *x = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 8355) *t = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 8356) *ln2p = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 8357) *ln2_2 = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 8358) *zero = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 8359) *half = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 8360) *one = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 8361) *two = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 8362) *tr = NULL; /* temp */
868b2b66 (kx 2024-12-20 16:11:07 +0300 8363)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8364) EMUSHORT *max = NULL; /* for MAX_BIN_Exponent */
868b2b66 (kx 2024-12-20 16:11:07 +0300 8365) EMUSHORT *ln2, *lnovfl, *thovfl, *small;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8366) int np, ne;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8367)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8368)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8369) if( nb < NBR_32 || nb > MPU_MATH_FN_LIMIT )
868b2b66 (kx 2024-12-20 16:11:07 +0300 8370) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 8371) /* error: Invalid size of operand(s) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 8372) __real_invalid_size( (__mpu_char8_t *)"cosh" );
868b2b66 (kx 2024-12-20 16:11:07 +0300 8373) /* ei_ind( eiy, nb ); */ /* Invalid NB */
868b2b66 (kx 2024-12-20 16:11:07 +0300 8374) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8375) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 8376)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8377) /*******************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 8378) Hight Precision for r32, r64.
868b2b66 (kx 2024-12-20 16:11:07 +0300 8379) *******************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8380) if( nb < NBR_128 ) nb = NBR_128;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8381)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8382) np = internal_np( nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 8383)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8384) /*** Allocate memory for x . ********************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8385) x = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 8386) if( !x )
868b2b66 (kx 2024-12-20 16:11:07 +0300 8387) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 8388) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 8389) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8390) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 8391) /************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8392)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8393)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8394) ei_copy( x, eix, nb ); /* temp for _mtherr() */
868b2b66 (kx 2024-12-20 16:11:07 +0300 8395)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8396) /***************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 8397) Test for EIX.
868b2b66 (kx 2024-12-20 16:11:07 +0300 8398) ***************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8399) /* COSH(InD) must by InD */
868b2b66 (kx 2024-12-20 16:11:07 +0300 8400) if( ei_isind( eix, nb ) )
868b2b66 (kx 2024-12-20 16:11:07 +0300 8401) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 8402) /* "argument domain error" */
868b2b66 (kx 2024-12-20 16:11:07 +0300 8403) /* return: InD */
868b2b66 (kx 2024-12-20 16:11:07 +0300 8404) ei_copy( eiy, eix, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 8405) /***************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 8406) NOTE:
868b2b66 (kx 2024-12-20 16:11:07 +0300 8407) Функция _mtherr() является переходником между
868b2b66 (kx 2024-12-20 16:11:07 +0300 8408) внутренним форматом и внешней,
868b2b66 (kx 2024-12-20 16:11:07 +0300 8409) переопределяемой пользователем, функцией
868b2b66 (kx 2024-12-20 16:11:07 +0300 8410) _math_error(). Кроме основных действий она
868b2b66 (kx 2024-12-20 16:11:07 +0300 8411) выставляет системную переменную errno
868b2b66 (kx 2024-12-20 16:11:07 +0300 8412) следующим образом.
868b2b66 (kx 2024-12-20 16:11:07 +0300 8413)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8414) errno = __mpu_math_errnotab[type];
868b2b66 (kx 2024-12-20 16:11:07 +0300 8415) ***************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8416) _mtherr( eiy, (__mpu_char8_t *)"cosh", __DOMAIN__,
868b2b66 (kx 2024-12-20 16:11:07 +0300 8417) eiy, x, (EMUSHORT *)0, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 8418) __STDOM; /* InD - produsing Domain Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 8419)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8420) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8421) __mpu_sbrk( -(int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 8422) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8423)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8424) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8425) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 8426) /* COSH(NaN) must by NaN */
868b2b66 (kx 2024-12-20 16:11:07 +0300 8427) if( ei_isnans( eix, nb ) )
868b2b66 (kx 2024-12-20 16:11:07 +0300 8428) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 8429) /* "argument domain error" */
868b2b66 (kx 2024-12-20 16:11:07 +0300 8430) /* return: NaN */
868b2b66 (kx 2024-12-20 16:11:07 +0300 8431) ei_copy( eiy, eix, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 8432) /***************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 8433) NOTE:
868b2b66 (kx 2024-12-20 16:11:07 +0300 8434) Функция _mtherr() является переходником между
868b2b66 (kx 2024-12-20 16:11:07 +0300 8435) внутренним форматом и внешней,
868b2b66 (kx 2024-12-20 16:11:07 +0300 8436) переопределяемой пользователем, функцией
868b2b66 (kx 2024-12-20 16:11:07 +0300 8437) _math_error(). Кроме основных действий она
868b2b66 (kx 2024-12-20 16:11:07 +0300 8438) выставляет системную переменную errno
868b2b66 (kx 2024-12-20 16:11:07 +0300 8439) следующим образом.
868b2b66 (kx 2024-12-20 16:11:07 +0300 8440)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8441) errno = __mpu_math_errnotab[type];
868b2b66 (kx 2024-12-20 16:11:07 +0300 8442) ***************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8443) _mtherr( eiy, (__mpu_char8_t *)"cosh", __DOMAIN__,
868b2b66 (kx 2024-12-20 16:11:07 +0300 8444) eiy, x, (EMUSHORT *)0, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 8445) __STDOM; /* NaN - produsing Domain Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 8446)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8447) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8448) __mpu_sbrk( -(int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 8449) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8450)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8451) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8452) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 8453)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8454) /*
868b2b66 (kx 2024-12-20 16:11:07 +0300 8455) COSH(+Infinity) must by +Infinity;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8456) COSH(-Infinity) must by -Infinity;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8457) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 8458) if( ei_isinfin( eix, nb ) )
868b2b66 (kx 2024-12-20 16:11:07 +0300 8459) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 8460) /* Normal Exit */
868b2b66 (kx 2024-12-20 16:11:07 +0300 8461) ei_copy( eiy, eix, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 8462)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8463) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8464) __mpu_sbrk( -(int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 8465) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8466)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8467) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8468) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 8469)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8470)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8471) ne = internal_ne( nb ) + 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8472)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8473) /*** Allocate memory for t, ln2p, ln2_2, tr . ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8474) t = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 8475) if( !t )
868b2b66 (kx 2024-12-20 16:11:07 +0300 8476) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 8477) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 8478)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8479) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8480) __mpu_sbrk( -(int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 8481) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8482)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8483) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8484) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 8485)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8486) ln2p = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 8487) if( !ln2p )
868b2b66 (kx 2024-12-20 16:11:07 +0300 8488) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 8489) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 8490)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8491) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8492) /* FREE t *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8493) __mpu_sbrk( -(int)(2*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 8494) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8495)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8496) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8497) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 8498)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8499) ln2_2 = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 8500) if( !ln2_2 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 8501) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 8502) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 8503)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8504) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8505) /* FREE t *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8506) /* FREE ln2p **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8507) __mpu_sbrk( -(int)(3*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 8508) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8509)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8510) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8511) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 8512)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8513) tr = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 8514) if( !tr )
868b2b66 (kx 2024-12-20 16:11:07 +0300 8515) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 8516) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 8517)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8518) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8519) /* FREE t *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8520) /* FREE ln2p **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8521) /* FREE ln2_2 *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8522) __mpu_sbrk( -(int)(4*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 8523) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8524)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8525) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8526) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 8527) /************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8528)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8529) /*** Allocate memory for zero, half, one, two . *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8530) zero = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 8531) if( !zero )
868b2b66 (kx 2024-12-20 16:11:07 +0300 8532) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 8533) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 8534)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8535) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8536) /* FREE t *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8537) /* FREE ln2p **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8538) /* FREE ln2_2 *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8539) /* FREE tr ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8540) __mpu_sbrk( -(int)(5*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 8541) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8542)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8543) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8544) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 8545)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8546) half = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 8547) if( !half )
868b2b66 (kx 2024-12-20 16:11:07 +0300 8548) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 8549) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 8550)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8551) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8552) /* FREE t *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8553) /* FREE ln2p **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8554) /* FREE ln2_2 *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8555) /* FREE tr ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8556) /* FREE zero **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8557) __mpu_sbrk( -(int)(6*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 8558) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8559)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8560) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8561) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 8562)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8563) one = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 8564) if( !one )
868b2b66 (kx 2024-12-20 16:11:07 +0300 8565) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 8566) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 8567)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8568) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8569) /* FREE t *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8570) /* FREE ln2p **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8571) /* FREE ln2_2 *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8572) /* FREE tr ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8573) /* FREE zero **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8574) /* FREE half **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8575) __mpu_sbrk( -(int)(7*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 8576) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8577)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8578) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8579) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 8580)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8581) two = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 8582) if( !two )
868b2b66 (kx 2024-12-20 16:11:07 +0300 8583) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 8584) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 8585)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8586) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8587) /* FREE t *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8588) /* FREE ln2p **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8589) /* FREE ln2_2 *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8590) /* FREE tr ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8591) /* FREE zero **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8592) /* FREE half **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8593) /* FREE one ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8594) __mpu_sbrk( -(int)(8*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 8595) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8596)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8597) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8598) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 8599) /************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8600)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8601) /*** Allocate memory for max . ******************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8602) max = (EMUSHORT *)__mpu_sbrk( (int)(ne*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 8603) if( !max )
868b2b66 (kx 2024-12-20 16:11:07 +0300 8604) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 8605) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 8606)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8607) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8608) /* FREE t *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8609) /* FREE ln2p **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8610) /* FREE ln2_2 *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8611) /* FREE tr ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8612) /* FREE zero **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8613) /* FREE half **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8614) /* FREE one ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8615) /* FREE two ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8616) __mpu_sbrk( -(int)(9*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 8617) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8618)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8619) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8620) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 8621) /************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8622)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8623)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8624) ln2 = _get_m_ln2_ptr( nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 8625) small = _get_epsilon_ptr( nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 8626)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8627) ei_cpye( max, _get_max_2_exp_ptr( nb ), ne, ne );
868b2b66 (kx 2024-12-20 16:11:07 +0300 8628)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8629) _gen_zero( zero, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 8630) _gen_half( half, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 8631) _gen_one ( one, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 8632) _gen_two ( two, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 8633)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8634) /* Service Constant: */
868b2b66 (kx 2024-12-20 16:11:07 +0300 8635) lnovfl = _get_m_ln_huge_ptr( nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 8636) thovfl = _get_m_thovfl_ptr( nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 8637)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8638) ei_add( ln2p, lnovfl, ln2, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 8639) ei_div( ln2_2, ln2, two, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 8640)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8641)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8642) ei_copysign( x, x, one, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 8643)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8644) if( ei_cmp( x, thovfl, nb ) <= 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 8645) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 8646) if( ei_cmp( x, ln2_2, nb ) < 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 8647) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 8648) if( ei_cmp( x, small, nb ) < 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 8649) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 8650) ei_add( eiy, one, x, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 8651)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8652) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8653) /* FREE t *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8654) /* FREE ln2p **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8655) /* FREE ln2_2 *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8656) /* FREE tr ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8657) /* FREE zero **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8658) /* FREE half **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8659) /* FREE one ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8660) /* FREE two ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8661) __mpu_sbrk( -(int)(9*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 8662) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8663)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8664) /* FREE max ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8665) __mpu_sbrk( -(int)(ne*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 8666) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8667)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8668) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8669) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 8670) else
868b2b66 (kx 2024-12-20 16:11:07 +0300 8671) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 8672) __ei_exp__E( tr, x, zero, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 8673) ei_add( t, x, tr, nb ); /* t = x+__ei_exp__E(x,0.0); */
868b2b66 (kx 2024-12-20 16:11:07 +0300 8674) ei_add( x, t, t, nb ); /* x = t+t; */
868b2b66 (kx 2024-12-20 16:11:07 +0300 8675) ei_add( tr, two, x, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 8676) ei_div( tr, t, tr, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 8677) ei_mul( tr, t, tr, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 8678) ei_add( eiy, one, tr, nb ); /* return(one+t*t/(2.0+x)); */
868b2b66 (kx 2024-12-20 16:11:07 +0300 8679)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8680) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8681) /* FREE t *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8682) /* FREE ln2p **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8683) /* FREE ln2_2 *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8684) /* FREE tr ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8685) /* FREE zero **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8686) /* FREE half **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8687) /* FREE one ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8688) /* FREE two ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8689) __mpu_sbrk( -(int)(9*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 8690) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8691)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8692) /* FREE max ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8693) __mpu_sbrk( -(int)(ne*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 8694) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8695)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8696) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8697) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 8698) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 8699) else
868b2b66 (kx 2024-12-20 16:11:07 +0300 8700) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 8701) /*******************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 8702) for x lies in [ln2/2, thovfl]
868b2b66 (kx 2024-12-20 16:11:07 +0300 8703) *******************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8704) ei_exp( t, x, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 8705) /* return( (t+one/t)*half ); */
868b2b66 (kx 2024-12-20 16:11:07 +0300 8706) ei_div( tr, one, t, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 8707) ei_add( tr, t, tr, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 8708) ei_mul( eiy, tr, half, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 8709)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8710) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8711) /* FREE t *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8712) /* FREE ln2p **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8713) /* FREE ln2_2 *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8714) /* FREE tr ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8715) /* FREE zero **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8716) /* FREE half **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8717) /* FREE one ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8718) /* FREE two ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8719) __mpu_sbrk( -(int)(9*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 8720) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8721)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8722) /* FREE max ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8723) __mpu_sbrk( -(int)(ne*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 8724) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8725)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8726) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8727) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 8728)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8729) } /* End if( x <= thovfl ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 8730)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8731)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8732) /* if( lnovfl <= x && x <= lnovfl+ln2 ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 8733) if( (ei_cmp( lnovfl, x, nb ) <= 0) &&
868b2b66 (kx 2024-12-20 16:11:07 +0300 8734) (ei_cmp( x, ln2p, nb ) <= 0) )
868b2b66 (kx 2024-12-20 16:11:07 +0300 8735) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 8736) /*
868b2b66 (kx 2024-12-20 16:11:07 +0300 8737) Substract x by ln(2^(max+1)) and return 2^max*exp(x)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8738) to avoid unnecessary overflow.
868b2b66 (kx 2024-12-20 16:11:07 +0300 8739) ******************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8740) ei_sub( tr, x, lnovfl, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 8741) ei_exp( tr, tr, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 8742) ei_ldexp( eiy, max, tr, ne, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 8743)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8744) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8745) /* FREE t *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8746) /* FREE ln2p **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8747) /* FREE ln2_2 *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8748) /* FREE tr ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8749) /* FREE zero **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8750) /* FREE half **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8751) /* FREE one ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8752) /* FREE two ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8753) __mpu_sbrk( -(int)(9*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 8754) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8755)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8756) /* FREE max ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8757) __mpu_sbrk( -(int)(ne*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 8758) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8759)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8760) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8761) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 8762) else
868b2b66 (kx 2024-12-20 16:11:07 +0300 8763) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 8764) ei_copy( t, eix, nb ); /* for &eiy == &eix */
868b2b66 (kx 2024-12-20 16:11:07 +0300 8765)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8766) ei_exp( tr, x, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 8767) /* new version: */ ei_mul( eiy, tr, half, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 8768)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8769) if( ei_cmp( x, ln2p, nb ) > 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 8770) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 8771) /* for large (x != +-Infinity), cosh(x) = exp(x)/2; */
868b2b66 (kx 2024-12-20 16:11:07 +0300 8772) /* COSH(+-big#) overflow to +-Infinity */
868b2b66 (kx 2024-12-20 16:11:07 +0300 8773) /* return: +-Infinity ( after if(){} body ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 8774) /* previus version: ei_mul( eiy, tr, half, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 8775) for _mtherr() */
868b2b66 (kx 2024-12-20 16:11:07 +0300 8776) /***************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 8777) NOTE:
868b2b66 (kx 2024-12-20 16:11:07 +0300 8778) Функция _mtherr() является переходником между
868b2b66 (kx 2024-12-20 16:11:07 +0300 8779) внутренним форматом и внешней,
868b2b66 (kx 2024-12-20 16:11:07 +0300 8780) переопределяемой пользователем, функцией
868b2b66 (kx 2024-12-20 16:11:07 +0300 8781) _math_error(). Кроме основных действий она
868b2b66 (kx 2024-12-20 16:11:07 +0300 8782) выставляет системную переменную errno
868b2b66 (kx 2024-12-20 16:11:07 +0300 8783) следующим образом.
868b2b66 (kx 2024-12-20 16:11:07 +0300 8784)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8785) errno = __mpu_math_errnotab[type];
868b2b66 (kx 2024-12-20 16:11:07 +0300 8786) ***************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8787) _mtherr( eiy, /* previus version: No change */
868b2b66 (kx 2024-12-20 16:11:07 +0300 8788) (__mpu_char8_t *)"cosh", __OVERFLOW__,
868b2b66 (kx 2024-12-20 16:11:07 +0300 8789) eiy, t, (EMUSHORT *)0, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 8790) __STOVF; /* +-big# - produsing Overflow Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 8791) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 8792) /* previus version: ei_mul( eiy, tr, half, nb ); */
868b2b66 (kx 2024-12-20 16:11:07 +0300 8793)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8794) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8795) /* FREE t *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8796) /* FREE ln2p **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8797) /* FREE ln2_2 *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8798) /* FREE tr ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8799) /* FREE zero **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8800) /* FREE half **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8801) /* FREE one ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8802) /* FREE two ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8803) __mpu_sbrk( -(int)(9*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 8804) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8805)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8806) /* FREE max ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8807) __mpu_sbrk( -(int)(ne*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 8808) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8809)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8810) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8811)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8812) } /* End if/else( lnovfl <= x && x <= lnovfl+ln2 ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 8813)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8814) } /* End of ei_cosh() */
868b2b66 (kx 2024-12-20 16:11:07 +0300 8815)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8816)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8817) void ei_tanh( EMUSHORT *eiy, EMUSHORT *eix, int nb )
868b2b66 (kx 2024-12-20 16:11:07 +0300 8818) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 8819)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8820) Description : ei_tanh() Работает с
868b2b66 (kx 2024-12-20 16:11:07 +0300 8821) internal e-type data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300 8822)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8823) Concepts : TANH(EIX) RETURN THE HYPERBOLIC TANGENT OF EIX.
868b2b66 (kx 2024-12-20 16:11:07 +0300 8824)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8825) METHOD :
868b2b66 (kx 2024-12-20 16:11:07 +0300 8826) 1. Reduce x to non-negative by
868b2b66 (kx 2024-12-20 16:11:07 +0300 8827) tanh(-x) = -tanh(x).
868b2b66 (kx 2024-12-20 16:11:07 +0300 8828) 2.
868b2b66 (kx 2024-12-20 16:11:07 +0300 8829) 0<x<=small : tanh(x) = x; [inexact];
868b2b66 (kx 2024-12-20 16:11:07 +0300 8830)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8831) -expm1(-2x)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8832) small<x<=1 : tanh(x) = ----------------;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8833) expm1(-2x) + 2
868b2b66 (kx 2024-12-20 16:11:07 +0300 8834)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8835) 2
868b2b66 (kx 2024-12-20 16:11:07 +0300 8836) 1<=x<=thovfl : tanh(x) = 1 - ---------------;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8837) expm1(2x) + 2
868b2b66 (kx 2024-12-20 16:11:07 +0300 8838)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8839) thovfl<x<=INF: tanh(x) = 1.; [inexact];
868b2b66 (kx 2024-12-20 16:11:07 +0300 8840)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8841) ACCURACY : In the absence of rounding error,
868b2b66 (kx 2024-12-20 16:11:07 +0300 8842) the appriximation has absolute error
868b2b66 (kx 2024-12-20 16:11:07 +0300 8843) less than EPSILON [see: FLOATP.H].
868b2b66 (kx 2024-12-20 16:11:07 +0300 8844)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8845) NOTE : thovfl = log1p(2.0/EPSILON-2.0) / 2.0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8846) [1+small^2 == 1].
868b2b66 (kx 2024-12-20 16:11:07 +0300 8847)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8848) SPECIAL CASES : tanh(-InD) = -InD с выставлением DOMAIN flag;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8849) tanh(+NaN) = +NaN с выставлением DOMAIN flag;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8850) tanh(-NaN) = -NaN с выставлением DOMAIN flag;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8851) tanh(+inf) = +1.0 [норма];
868b2b66 (kx 2024-12-20 16:11:07 +0300 8852) tanh(-inf) = -1.0 [норма];
868b2b66 (kx 2024-12-20 16:11:07 +0300 8853) tanh(+big#)= +1.0 с выставлением INEXACT flag;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8854) tanh(-big#)= -1.0 с выставлением INEXACT flag;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8855) tanh(0) = 0.0 [норма];
868b2b66 (kx 2024-12-20 16:11:07 +0300 8856)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8857) Use Global Variable:
868b2b66 (kx 2024-12-20 16:11:07 +0300 8858)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8859) Use Functions : ei_exp( eiy, eix, nb ); | this file
868b2b66 (kx 2024-12-20 16:11:07 +0300 8860) ei_copy( eiy, eix, nb ); | mpu-real.c
868b2b66 (kx 2024-12-20 16:11:07 +0300 8861) .
868b2b66 (kx 2024-12-20 16:11:07 +0300 8862) .
868b2b66 (kx 2024-12-20 16:11:07 +0300 8863) .
868b2b66 (kx 2024-12-20 16:11:07 +0300 8864)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8865) Parameters : EMUSHORT *eiy; - указатель на
868b2b66 (kx 2024-12-20 16:11:07 +0300 8866) internal e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300 8867) data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300 8868) TARGET;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8869) EMUSHORT *eix; - указатель на
868b2b66 (kx 2024-12-20 16:11:07 +0300 8870) internal e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300 8871) data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300 8872) SOURCE;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8873) int nb; - количество бит в
868b2b66 (kx 2024-12-20 16:11:07 +0300 8874) external e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300 8875) data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300 8876)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8877) Return : [void]
868b2b66 (kx 2024-12-20 16:11:07 +0300 8878)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8879) ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8880) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 8881) EMUSHORT *x = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 8882) *t = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 8883) *sign = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 8884) *small = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 8885) *half = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 8886) *one = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 8887) *two = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 8888) *tr = NULL; /* temp */
868b2b66 (kx 2024-12-20 16:11:07 +0300 8889) EMUSHORT *thovfl;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8890) int np;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8891)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8892)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8893) if( nb < NBR_32 || nb > MPU_MATH_FN_LIMIT )
868b2b66 (kx 2024-12-20 16:11:07 +0300 8894) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 8895) /* error: Invalid size of operand(s) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 8896) __real_invalid_size( (__mpu_char8_t *)"tanh" );
868b2b66 (kx 2024-12-20 16:11:07 +0300 8897) /* ei_ind( eiy, nb ); */ /* Invalid NB */
868b2b66 (kx 2024-12-20 16:11:07 +0300 8898) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8899) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 8900)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8901) /*******************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 8902) Hight Precision for r32, r64.
868b2b66 (kx 2024-12-20 16:11:07 +0300 8903) *******************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8904) if( nb < NBR_128 ) nb = NBR_128;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8905)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8906) np = internal_np( nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 8907)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8908) /*** Allocate memory for x . ********************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8909) x = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 8910) if( !x )
868b2b66 (kx 2024-12-20 16:11:07 +0300 8911) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 8912) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 8913) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8914) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 8915) /************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8916)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8917)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8918) ei_copy( x, eix, nb ); /* temp for _mtherr() */
868b2b66 (kx 2024-12-20 16:11:07 +0300 8919)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8920) /***************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 8921) Test for EIX.
868b2b66 (kx 2024-12-20 16:11:07 +0300 8922) ***************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8923) /* TANH(InD) must by InD */
868b2b66 (kx 2024-12-20 16:11:07 +0300 8924) if( ei_isind( eix, nb ) )
868b2b66 (kx 2024-12-20 16:11:07 +0300 8925) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 8926) /* "argument domain error" */
868b2b66 (kx 2024-12-20 16:11:07 +0300 8927) /* return: InD */
868b2b66 (kx 2024-12-20 16:11:07 +0300 8928) ei_copy( eiy, eix, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 8929) /***************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 8930) NOTE:
868b2b66 (kx 2024-12-20 16:11:07 +0300 8931) Функция _mtherr() является переходником между
868b2b66 (kx 2024-12-20 16:11:07 +0300 8932) внутренним форматом и внешней,
868b2b66 (kx 2024-12-20 16:11:07 +0300 8933) переопределяемой пользователем, функцией
868b2b66 (kx 2024-12-20 16:11:07 +0300 8934) _math_error(). Кроме основных действий она
868b2b66 (kx 2024-12-20 16:11:07 +0300 8935) выставляет системную переменную errno
868b2b66 (kx 2024-12-20 16:11:07 +0300 8936) следующим образом.
868b2b66 (kx 2024-12-20 16:11:07 +0300 8937)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8938) errno = __mpu_math_errnotab[type];
868b2b66 (kx 2024-12-20 16:11:07 +0300 8939) ***************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8940) _mtherr( eiy, (__mpu_char8_t *)"tanh", __DOMAIN__,
868b2b66 (kx 2024-12-20 16:11:07 +0300 8941) eiy, x, (EMUSHORT *)0, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 8942) __STDOM; /* InD - produsing Domain Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 8943)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8944) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8945) __mpu_sbrk( -(int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 8946) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8947)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8948) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8949) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 8950) /* TANH(NaN) must by NaN */
868b2b66 (kx 2024-12-20 16:11:07 +0300 8951) if( ei_isnans( eix, nb ) )
868b2b66 (kx 2024-12-20 16:11:07 +0300 8952) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 8953) /* "argument domain error" */
868b2b66 (kx 2024-12-20 16:11:07 +0300 8954) /* return: NaN */
868b2b66 (kx 2024-12-20 16:11:07 +0300 8955) ei_copy( eiy, eix, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 8956) /***************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 8957) NOTE:
868b2b66 (kx 2024-12-20 16:11:07 +0300 8958) Функция _mtherr() является переходником между
868b2b66 (kx 2024-12-20 16:11:07 +0300 8959) внутренним форматом и внешней,
868b2b66 (kx 2024-12-20 16:11:07 +0300 8960) переопределяемой пользователем, функцией
868b2b66 (kx 2024-12-20 16:11:07 +0300 8961) _math_error(). Кроме основных действий она
868b2b66 (kx 2024-12-20 16:11:07 +0300 8962) выставляет системную переменную errno
868b2b66 (kx 2024-12-20 16:11:07 +0300 8963) следующим образом.
868b2b66 (kx 2024-12-20 16:11:07 +0300 8964)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8965) errno = __mpu_math_errnotab[type];
868b2b66 (kx 2024-12-20 16:11:07 +0300 8966) ***************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8967) _mtherr( eiy, (__mpu_char8_t *)"tanh", __DOMAIN__,
868b2b66 (kx 2024-12-20 16:11:07 +0300 8968) eiy, x, (EMUSHORT *)0, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 8969) __STDOM; /* NaN - produsing Domain Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 8970)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8971) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8972) __mpu_sbrk( -(int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 8973) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8974)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8975) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8976) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 8977)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8978) /*** Allocate memory for t, sign, small, tr . ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8979) t = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 8980) if( !t )
868b2b66 (kx 2024-12-20 16:11:07 +0300 8981) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 8982) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 8983)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8984) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8985) __mpu_sbrk( -(int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 8986) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8987)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8988) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8989) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 8990)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8991) sign = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 8992) if( !sign )
868b2b66 (kx 2024-12-20 16:11:07 +0300 8993) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 8994) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 8995)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8996) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8997) /* FREE t *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8998) __mpu_sbrk( -(int)(2*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 8999) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9000)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9001) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9002) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 9003)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9004) small = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 9005) if( !small )
868b2b66 (kx 2024-12-20 16:11:07 +0300 9006) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 9007) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9008)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9009) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9010) /* FREE t *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9011) /* FREE sign **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9012) __mpu_sbrk( -(int)(3*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 9013) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9014)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9015) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9016) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 9017)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9018) tr = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 9019) if( !tr )
868b2b66 (kx 2024-12-20 16:11:07 +0300 9020) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 9021) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9022)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9023) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9024) /* FREE t *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9025) /* FREE sign **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9026) /* FREE small *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9027) __mpu_sbrk( -(int)(4*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 9028) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9029)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9030) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9031) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 9032) /************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9033)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9034) /*** Allocate memory for half, one, two . *******************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9035) half = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 9036) if( !half )
868b2b66 (kx 2024-12-20 16:11:07 +0300 9037) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 9038) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9039)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9040) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9041) /* FREE t *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9042) /* FREE sign **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9043) /* FREE small *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9044) /* FREE tr ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9045) __mpu_sbrk( -(int)(5*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 9046) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9047)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9048) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9049) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 9050)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9051) one = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 9052) if( !one )
868b2b66 (kx 2024-12-20 16:11:07 +0300 9053) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 9054) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9055)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9056) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9057) /* FREE t *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9058) /* FREE sign **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9059) /* FREE small *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9060) /* FREE tr ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9061) /* FREE half **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9062) __mpu_sbrk( -(int)(6*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 9063) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9064)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9065) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9066) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 9067)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9068) two = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 9069) if( !two )
868b2b66 (kx 2024-12-20 16:11:07 +0300 9070) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 9071) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9072)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9073) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9074) /* FREE t *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9075) /* FREE sign **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9076) /* FREE small *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9077) /* FREE tr ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9078) /* FREE half **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9079) /* FREE one ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9080) __mpu_sbrk( -(int)(7*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 9081) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9082)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9083) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9084) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 9085) /************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9086)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9087)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9088) ei_sqrt( small, _get_epsilon_ptr( nb ), nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 9089)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9090) _gen_half( half, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 9091) _gen_one ( one, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 9092) _gen_two ( two, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 9093)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9094) /* Service Constant: */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9095) thovfl = _get_m_thovfl_ptr( nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 9096)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9097)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9098) ei_copysign( sign, one, x, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 9099) ei_copysign( x, x, one, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 9100)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9101) /*
868b2b66 (kx 2024-12-20 16:11:07 +0300 9102) TANH(+Infinity) must by +1.0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9103) TANH(-Infinity) must by -1.0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9104) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9105) if( ei_isinfin( eix, nb ) )
868b2b66 (kx 2024-12-20 16:11:07 +0300 9106) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 9107) /* Normal Exit */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9108) ei_copy( eiy, sign, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 9109)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9110) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9111) /* FREE t *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9112) /* FREE sign **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9113) /* FREE small *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9114) /* FREE tr ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9115) /* FREE half **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9116) /* FREE one ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9117) /* FREE two ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9118) __mpu_sbrk( -(int)(8*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 9119) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9120)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9121) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9122) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 9123)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9124) if( ei_cmp( x, thovfl, nb ) < 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 9125) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 9126) if( ei_cmp( x, one, nb ) > 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 9127) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 9128) /* return( copysign( one-two/(expm1(x+x)+two), sign ) ); */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9129) ei_add( tr, x, x, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 9130) ei_expm1( tr, tr, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 9131) ei_add( tr, tr, two, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 9132) ei_div( tr, two, tr, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 9133) ei_sub( tr, one, tr, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 9134) ei_copysign( eiy, tr, sign, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 9135)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9136) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9137) /* FREE t *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9138) /* FREE sign **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9139) /* FREE small *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9140) /* FREE tr ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9141) /* FREE half **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9142) /* FREE one ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9143) /* FREE two ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9144) __mpu_sbrk( -(int)(8*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 9145) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9146)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9147) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9148) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 9149) else
868b2b66 (kx 2024-12-20 16:11:07 +0300 9150) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 9151) if( ei_cmp( x, small, nb ) > 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 9152) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 9153) /* t = -expm1(-(x+x)); */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9154) ei_add( tr, x, x, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 9155) ei_neg( tr, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 9156) ei_expm1( tr, tr, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 9157) ei_neg( tr, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 9158) ei_copy( t, tr, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 9159)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9160) /* return( copysign( t/(two-t), sign ) ); */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9161) ei_sub( tr, two, t, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 9162) ei_div( tr, t, tr, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 9163) ei_copysign( eiy, tr, sign, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 9164)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9165) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9166) /* FREE t *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9167) /* FREE sign **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9168) /* FREE small *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9169) /* FREE tr ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9170) /* FREE half **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9171) /* FREE one ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9172) /* FREE two ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9173) __mpu_sbrk( -(int)(8*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 9174) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9175)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9176) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9177) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 9178) else
868b2b66 (kx 2024-12-20 16:11:07 +0300 9179) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 9180) ei_copy( t, eix, nb ); /* for &eiy == &eix */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9181)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9182) /* raise the inexact flag for non-zero x*/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9183) /* return: +-x */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9184) ei_copysign( eiy, x, sign, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 9185) /***************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 9186) NOTE:
868b2b66 (kx 2024-12-20 16:11:07 +0300 9187) Функция _mtherr() является переходником между
868b2b66 (kx 2024-12-20 16:11:07 +0300 9188) внутренним форматом и внешней,
868b2b66 (kx 2024-12-20 16:11:07 +0300 9189) переопределяемой пользователем, функцией
868b2b66 (kx 2024-12-20 16:11:07 +0300 9190) _math_error(). Кроме основных действий она
868b2b66 (kx 2024-12-20 16:11:07 +0300 9191) выставляет системную переменную errno
868b2b66 (kx 2024-12-20 16:11:07 +0300 9192) следующим образом.
868b2b66 (kx 2024-12-20 16:11:07 +0300 9193)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9194) errno = __mpu_math_errnotab[type];
868b2b66 (kx 2024-12-20 16:11:07 +0300 9195) ***************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9196) _mtherr( (EMUSHORT *)0, /* Non change */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9197) (__mpu_char8_t *)"tanh", __INEXACT__,
868b2b66 (kx 2024-12-20 16:11:07 +0300 9198) eiy, t, (EMUSHORT *)0, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 9199) __STINX; /* produsing Inexact Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9200)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9201) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9202) /* FREE t *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9203) /* FREE sign **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9204) /* FREE small *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9205) /* FREE tr ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9206) /* FREE half **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9207) /* FREE one ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9208) /* FREE two ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9209) __mpu_sbrk( -(int)(8*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 9210) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9211)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9212) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9213)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9214) } /* End if/else( x > small ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9215)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9216) } /* End if/else( x > one ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9217)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9218) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 9219) else
868b2b66 (kx 2024-12-20 16:11:07 +0300 9220) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 9221) ei_copy( t, eix, nb ); /* for &eiy == &eix */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9222)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9223) /* TANH(+-big#) round to +-1.0 */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9224) /* raise the inexact flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9225) /* return: +-1.0 */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9226) ei_copy( eiy, sign, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 9227) /***************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 9228) NOTE:
868b2b66 (kx 2024-12-20 16:11:07 +0300 9229) Функция _mtherr() является переходником между
868b2b66 (kx 2024-12-20 16:11:07 +0300 9230) внутренним форматом и внешней,
868b2b66 (kx 2024-12-20 16:11:07 +0300 9231) переопределяемой пользователем, функцией
868b2b66 (kx 2024-12-20 16:11:07 +0300 9232) _math_error(). Кроме основных действий она
868b2b66 (kx 2024-12-20 16:11:07 +0300 9233) выставляет системную переменную errno
868b2b66 (kx 2024-12-20 16:11:07 +0300 9234) следующим образом.
868b2b66 (kx 2024-12-20 16:11:07 +0300 9235)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9236) errno = __mpu_math_errnotab[type];
868b2b66 (kx 2024-12-20 16:11:07 +0300 9237) ***************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9238) _mtherr( (EMUSHORT *)0, /* Non change */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9239) (__mpu_char8_t *)"tanh", __INEXACT__,
868b2b66 (kx 2024-12-20 16:11:07 +0300 9240) eiy, t, (EMUSHORT *)0, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 9241) __STINX; /* produsing Inexact Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9242)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9243) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9244) /* FREE t *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9245) /* FREE sign **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9246) /* FREE small *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9247) /* FREE tr ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9248) /* FREE half **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9249) /* FREE one ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9250) /* FREE two ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9251) __mpu_sbrk( -(int)(8*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 9252) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9253)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9254) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9255)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9256) } /* Enf if/else( x < thovfl ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9257)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9258) } /* End of ei_tanh() */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9259)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9260)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9261) void ei_asinh( EMUSHORT *eiy, EMUSHORT *eix, int nb )
868b2b66 (kx 2024-12-20 16:11:07 +0300 9262) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 9263)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9264) Description : ei_asinh() Работает с
868b2b66 (kx 2024-12-20 16:11:07 +0300 9265) internal e-type data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300 9266)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9267) Concepts : ASINH(X) RETURN
868b2b66 (kx 2024-12-20 16:11:07 +0300 9268) THE INVERSE HYPERBOLIC SINE OF EIX.
868b2b66 (kx 2024-12-20 16:11:07 +0300 9269)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9270) METHOD : Based on
868b2b66 (kx 2024-12-20 16:11:07 +0300 9271) asinh(x) = sign(x)*log[ |x|+sqrt(x*x+1) ]
868b2b66 (kx 2024-12-20 16:11:07 +0300 9272) we have
868b2b66 (kx 2024-12-20 16:11:07 +0300 9273) asinh(x) = x if(1+x*x=1),
868b2b66 (kx 2024-12-20 16:11:07 +0300 9274) = sign(x)*(log1p(x)+ln2)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9275) if(sqrt(1+x*x)=x), else
868b2b66 (kx 2024-12-20 16:11:07 +0300 9276) = sign(x)*
868b2b66 (kx 2024-12-20 16:11:07 +0300 9277) log1p(|x|+
868b2b66 (kx 2024-12-20 16:11:07 +0300 9278) |x|/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9279) (1/|x|+sqrt(1+(1/|x|)^2)) ).
868b2b66 (kx 2024-12-20 16:11:07 +0300 9280)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9281) ACCURACY : In the absence of rounding error,
868b2b66 (kx 2024-12-20 16:11:07 +0300 9282) the appriximation has absolute error
868b2b66 (kx 2024-12-20 16:11:07 +0300 9283) less than EPSILON [see: mpu-floatp.h].
868b2b66 (kx 2024-12-20 16:11:07 +0300 9284)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9285) NOTE :
868b2b66 (kx 2024-12-20 16:11:07 +0300 9286)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9287) SPECIAL CASES : asinh(-InD) = -InD с выставлением DOMAIN flag;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9288) asinh(+NaN) = +NaN с выставлением DOMAIN flag;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9289) asinh(-NaN) = -NaN с выставлением DOMAIN flag;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9290)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9291) Use Global Variable:
868b2b66 (kx 2024-12-20 16:11:07 +0300 9292)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9293) Use Functions : ei_log1p( eiy, eix, nb ); | this file
868b2b66 (kx 2024-12-20 16:11:07 +0300 9294) ei_sqrt( eiy, eix, nb ); | mpu-real.c
868b2b66 (kx 2024-12-20 16:11:07 +0300 9295) ei_copy( eiy, eix, nb ); | mpu-real.c
868b2b66 (kx 2024-12-20 16:11:07 +0300 9296) .
868b2b66 (kx 2024-12-20 16:11:07 +0300 9297) .
868b2b66 (kx 2024-12-20 16:11:07 +0300 9298) .
868b2b66 (kx 2024-12-20 16:11:07 +0300 9299)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9300) Parameters : EMUSHORT *eiy; - указатель на
868b2b66 (kx 2024-12-20 16:11:07 +0300 9301) internal e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300 9302) data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300 9303) TARGET;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9304) EMUSHORT *eix; - указатель на
868b2b66 (kx 2024-12-20 16:11:07 +0300 9305) internal e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300 9306) data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300 9307) SOURCE;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9308) int nb; - количество бит в
868b2b66 (kx 2024-12-20 16:11:07 +0300 9309) external e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300 9310) data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300 9311)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9312) Return : [void]
868b2b66 (kx 2024-12-20 16:11:07 +0300 9313)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9314) ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9315) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 9316) EMUSHORT *x = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 9317) *t = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 9318) *s = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 9319) *small = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 9320) *big = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 9321) *one = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 9322) *ten = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 9323) *tr = NULL; /* temp */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9324) EMUSHORT *ln2hi, *ln2lo;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9325) int np;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9326)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9327)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9328) if( nb < NBR_32 || nb > MPU_MATH_FN_LIMIT )
868b2b66 (kx 2024-12-20 16:11:07 +0300 9329) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 9330) /* error: Invalid size of operand(s) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9331) __real_invalid_size( (__mpu_char8_t *)"asinh" );
868b2b66 (kx 2024-12-20 16:11:07 +0300 9332) /* ei_ind( eiy, nb ); */ /* Invalid NB */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9333) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9334) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 9335)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9336) /*******************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 9337) Hight Precision for r32, r64.
868b2b66 (kx 2024-12-20 16:11:07 +0300 9338) *******************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9339) if( nb < NBR_128 ) nb = NBR_128;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9340)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9341) np = internal_np( nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 9342)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9343) /*** Allocate memory for x . ********************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9344) x = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 9345) if( !x )
868b2b66 (kx 2024-12-20 16:11:07 +0300 9346) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 9347) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9348) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9349) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 9350) /************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9351)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9352)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9353) ei_copy( x, eix, nb ); /* temp for _mtherr() */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9354)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9355) /***************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 9356) Test for EIX.
868b2b66 (kx 2024-12-20 16:11:07 +0300 9357) ***************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9358) /* ASINH(InD) must by InD */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9359) if( ei_isind( eix, nb ) )
868b2b66 (kx 2024-12-20 16:11:07 +0300 9360) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 9361) /* "argument domain error" */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9362) /* return: InD */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9363) ei_copy( eiy, eix, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 9364) /***************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 9365) NOTE:
868b2b66 (kx 2024-12-20 16:11:07 +0300 9366) Функция _mtherr() является переходником между
868b2b66 (kx 2024-12-20 16:11:07 +0300 9367) внутренним форматом и внешней,
868b2b66 (kx 2024-12-20 16:11:07 +0300 9368) переопределяемой пользователем, функцией
868b2b66 (kx 2024-12-20 16:11:07 +0300 9369) _math_error(). Кроме основных действий она
868b2b66 (kx 2024-12-20 16:11:07 +0300 9370) выставляет системную переменную errno
868b2b66 (kx 2024-12-20 16:11:07 +0300 9371) следующим образом.
868b2b66 (kx 2024-12-20 16:11:07 +0300 9372)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9373) errno = __mpu_math_errnotab[type];
868b2b66 (kx 2024-12-20 16:11:07 +0300 9374) ***************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9375) _mtherr( eiy, (__mpu_char8_t *)"asinh", __DOMAIN__,
868b2b66 (kx 2024-12-20 16:11:07 +0300 9376) eiy, x, (EMUSHORT *)0, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 9377) __STDOM; /* InD - produsing Domain Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9378)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9379) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9380) __mpu_sbrk( -(int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 9381) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9382)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9383) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9384) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 9385) /* ASINH(NaN) must by NaN */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9386) if( ei_isnans( eix, nb ) )
868b2b66 (kx 2024-12-20 16:11:07 +0300 9387) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 9388) /* "argument domain error" */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9389) /* return: NaN */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9390) ei_copy( eiy, eix, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 9391) /***************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 9392) NOTE:
868b2b66 (kx 2024-12-20 16:11:07 +0300 9393) Функция _mtherr() является переходником между
868b2b66 (kx 2024-12-20 16:11:07 +0300 9394) внутренним форматом и внешней,
868b2b66 (kx 2024-12-20 16:11:07 +0300 9395) переопределяемой пользователем, функцией
868b2b66 (kx 2024-12-20 16:11:07 +0300 9396) _math_error(). Кроме основных действий она
868b2b66 (kx 2024-12-20 16:11:07 +0300 9397) выставляет системную переменную errno
868b2b66 (kx 2024-12-20 16:11:07 +0300 9398) следующим образом.
868b2b66 (kx 2024-12-20 16:11:07 +0300 9399)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9400) errno = __mpu_math_errnotab[type];
868b2b66 (kx 2024-12-20 16:11:07 +0300 9401) ***************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9402) _mtherr( eiy, (__mpu_char8_t *)"asinh", __DOMAIN__,
868b2b66 (kx 2024-12-20 16:11:07 +0300 9403) eiy, x, (EMUSHORT *)0, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 9404) __STDOM; /* NaN - produsing Domain Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9405)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9406) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9407) __mpu_sbrk( -(int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 9408) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9409)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9410) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9411) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 9412)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9413) /*** Allocate memory for t, s, small, big, one, ten, tr . ***/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9414) t = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 9415) if( !t )
868b2b66 (kx 2024-12-20 16:11:07 +0300 9416) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 9417) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9418)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9419) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9420) __mpu_sbrk( -(int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 9421) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9422)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9423) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9424) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 9425)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9426) s = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 9427) if( !s )
868b2b66 (kx 2024-12-20 16:11:07 +0300 9428) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 9429) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9430)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9431) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9432) /* FREE t *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9433) __mpu_sbrk( -(int)(2*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 9434) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9435)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9436) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9437) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 9438)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9439) small = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 9440) if( !small )
868b2b66 (kx 2024-12-20 16:11:07 +0300 9441) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 9442) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9443)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9444) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9445) /* FREE t *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9446) /* FREE s *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9447) __mpu_sbrk( -(int)(3*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 9448) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9449)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9450) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9451) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 9452)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9453) big = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 9454) if( !big )
868b2b66 (kx 2024-12-20 16:11:07 +0300 9455) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 9456) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9457)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9458) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9459) /* FREE t *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9460) /* FREE s *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9461) /* FREE small *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9462) __mpu_sbrk( -(int)(4*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 9463) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9464)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9465) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9466) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 9467)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9468) one = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 9469) if( !one )
868b2b66 (kx 2024-12-20 16:11:07 +0300 9470) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 9471) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9472)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9473) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9474) /* FREE t *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9475) /* FREE s *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9476) /* FREE small *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9477) /* FREE big ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9478) __mpu_sbrk( -(int)(5*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 9479) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9480)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9481) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9482) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 9483)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9484) ten = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 9485) if( !ten )
868b2b66 (kx 2024-12-20 16:11:07 +0300 9486) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 9487) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9488)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9489) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9490) /* FREE t *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9491) /* FREE s *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9492) /* FREE small *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9493) /* FREE big ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9494) /* FREE one ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9495) __mpu_sbrk( -(int)(6*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 9496) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9497)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9498) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9499) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 9500)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9501) tr = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 9502) if( !tr )
868b2b66 (kx 2024-12-20 16:11:07 +0300 9503) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 9504) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9505)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9506) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9507) /* FREE t *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9508) /* FREE s *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9509) /* FREE small *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9510) /* FREE big ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9511) /* FREE one ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9512) /* FREE ten ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9513) __mpu_sbrk( -(int)(7*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 9514) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9515)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9516) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9517) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 9518) /************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9519)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9520) _gen_one ( one, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 9521) _gen_ten ( ten, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 9522)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9523) /*********************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 9524) small: 1.0 + small^2 == 1.0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9525) big : big = 1/(small^2); & (big+1) == big;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9526) *********************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9527) ei_sqrt( small, _get_epsilon_ptr( nb ), nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 9528) ei_div( big, one, _get_epsilon_ptr( nb ), nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 9529) ei_mul( big, big, ten, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 9530)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9531) /* Service Constant: */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9532) ln2hi = _get_m_ln2hi_ptr( nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 9533) ln2lo = _get_m_ln2lo_ptr( nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 9534)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9535)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9536) ei_copysign( t, x, one, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 9537)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9538) if( ei_cmp( t, small, nb ) > 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 9539) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 9540) if( ei_cmp( t, big, nb ) < 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 9541) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 9542) ei_div( s, one, t, nb ); /* s = one/t; */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9543) /* return( copysign( log1p( t+t/(s+sqrt(one+s*s)) ), x ) ); */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9544) ei_mul( tr, s, s, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 9545) ei_add( tr, one, tr, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 9546) ei_sqrt( tr, tr, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 9547) ei_add( tr, s, tr, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 9548) ei_div( tr, t, tr, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 9549) ei_add( tr, t, tr, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 9550) ei_log1p( tr, tr, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 9551) ei_copysign( eiy, tr, x, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 9552)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9553) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9554) /* FREE t *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9555) /* FREE s *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9556) /* FREE small *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9557) /* FREE big ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9558) /* FREE one ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9559) /* FREE ten ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9560) /* FREE tr ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9561) __mpu_sbrk( -(int)(8*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 9562) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9563)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9564) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9565) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 9566) else
868b2b66 (kx 2024-12-20 16:11:07 +0300 9567) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 9568) /* ( |x| > big ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9569) ei_log1p( tr, t, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 9570) ei_add( s, tr, ln2lo, nb ); /* s = log1p(t)+ln2lo; */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9571) ei_add( tr, s, ln2hi, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 9572) /* return( copysign(s+ln2hi,x) ); */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9573) ei_copysign( eiy, tr, x, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 9574)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9575) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9576) /* FREE t *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9577) /* FREE s *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9578) /* FREE small *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9579) /* FREE big ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9580) /* FREE one ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9581) /* FREE ten ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9582) /* FREE tr ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9583) __mpu_sbrk( -(int)(8*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 9584) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9585)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9586) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9587) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 9588) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 9589) else
868b2b66 (kx 2024-12-20 16:11:07 +0300 9590) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 9591) /* ( |x| < small ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9592) ei_copy( eiy, x, nb ); /* return( x ); */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9593)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9594) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9595) /* FREE t *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9596) /* FREE s *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9597) /* FREE small *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9598) /* FREE big ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9599) /* FREE one ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9600) /* FREE ten ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9601) /* FREE tr ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9602) __mpu_sbrk( -(int)(8*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 9603) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9604)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9605) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9606) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 9607)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9608) } /* End of ei_asinh() */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9609)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9610)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9611) void ei_acosh( EMUSHORT *eiy, EMUSHORT *eix, int nb )
868b2b66 (kx 2024-12-20 16:11:07 +0300 9612) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 9613)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9614) Description : ei_acosh() Работает с
868b2b66 (kx 2024-12-20 16:11:07 +0300 9615) internal e-type data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300 9616)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9617) Concepts : ASINH(X) RETURN
868b2b66 (kx 2024-12-20 16:11:07 +0300 9618) THE INVERSE HYPERBOLIC COSINE OF EIX.
868b2b66 (kx 2024-12-20 16:11:07 +0300 9619)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9620) METHOD : Based on
868b2b66 (kx 2024-12-20 16:11:07 +0300 9621) acosh(x) = log[ x + sqrt(x*x-1) ]
868b2b66 (kx 2024-12-20 16:11:07 +0300 9622) we have
868b2b66 (kx 2024-12-20 16:11:07 +0300 9623) acosh(x) = log1p(x)+ln2 if(x>big), else
868b2b66 (kx 2024-12-20 16:11:07 +0300 9624) = log1p(
868b2b66 (kx 2024-12-20 16:11:07 +0300 9625) sqrt(x-1) *
868b2b66 (kx 2024-12-20 16:11:07 +0300 9626) ( sqrt(x-1) + sqrt(x+1) )
868b2b66 (kx 2024-12-20 16:11:07 +0300 9627) ).
868b2b66 (kx 2024-12-20 16:11:07 +0300 9628) These formulae avoid the over/underflow
868b2b66 (kx 2024-12-20 16:11:07 +0300 9629) complication.
868b2b66 (kx 2024-12-20 16:11:07 +0300 9630)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9631) ACCURACY : In the absence of rounding error,
868b2b66 (kx 2024-12-20 16:11:07 +0300 9632) the appriximation has absolute error
868b2b66 (kx 2024-12-20 16:11:07 +0300 9633) less than EPSILON [see: mpu-floatp.h].
868b2b66 (kx 2024-12-20 16:11:07 +0300 9634)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9635) NOTE :
868b2b66 (kx 2024-12-20 16:11:07 +0300 9636)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9637) SPECIAL CASES : acosh(-InD) = -InD с выставлением DOMAIN flag;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9638) acosh(+NaN) = +NaN с выставлением DOMAIN flag;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9639) acosh(-NaN) = -NaN с выставлением DOMAIN flag;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9640) acosh( x<1 ) = -Ind с выставлением DOMAIN flag;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9641)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9642) Use Global Variable:
868b2b66 (kx 2024-12-20 16:11:07 +0300 9643)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9644) Use Functions : ei_log1p( eiy, eix, nb ); | this file
868b2b66 (kx 2024-12-20 16:11:07 +0300 9645) ei_sqrt( eiy, eix, nb ); | mpu-real.c
868b2b66 (kx 2024-12-20 16:11:07 +0300 9646) ei_copy( eiy, eix, nb ); | mpu-real.c
868b2b66 (kx 2024-12-20 16:11:07 +0300 9647) .
868b2b66 (kx 2024-12-20 16:11:07 +0300 9648) .
868b2b66 (kx 2024-12-20 16:11:07 +0300 9649) .
868b2b66 (kx 2024-12-20 16:11:07 +0300 9650)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9651) Parameters : EMUSHORT *eiy; - указатель на
868b2b66 (kx 2024-12-20 16:11:07 +0300 9652) internal e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300 9653) data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300 9654) TARGET;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9655) EMUSHORT *eix; - указатель на
868b2b66 (kx 2024-12-20 16:11:07 +0300 9656) internal e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300 9657) data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300 9658) SOURCE;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9659) int nb; - количество бит в
868b2b66 (kx 2024-12-20 16:11:07 +0300 9660) external e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300 9661) data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300 9662)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9663) Return : [void]
868b2b66 (kx 2024-12-20 16:11:07 +0300 9664)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9665) ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9666) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 9667) EMUSHORT *x = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 9668) *t = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 9669) *big = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 9670) *one = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 9671) *ten = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 9672) *tr = NULL; /* temp */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9673) EMUSHORT *ln2hi, *ln2lo;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9674) int np;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9675)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9676)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9677) if( nb < NBR_32 || nb > MPU_MATH_FN_LIMIT )
868b2b66 (kx 2024-12-20 16:11:07 +0300 9678) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 9679) /* error: Invalid size of operand(s) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9680) __real_invalid_size( (__mpu_char8_t *)"acosh" );
868b2b66 (kx 2024-12-20 16:11:07 +0300 9681) /* ei_ind( eiy, nb ); *//* Invalid NB */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9682) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9683) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 9684)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9685) /*******************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 9686) Hight Precision for r32, r64.
868b2b66 (kx 2024-12-20 16:11:07 +0300 9687) *******************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9688) if( nb < NBR_128 ) nb = NBR_128;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9689)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9690) np = internal_np( nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 9691)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9692) /*** Allocate memory for x . ********************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9693) x = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 9694) if( !x )
868b2b66 (kx 2024-12-20 16:11:07 +0300 9695) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 9696) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9697) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9698) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 9699) /************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9700)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9701)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9702) ei_copy( x, eix, nb ); /* temp for _mtherr() */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9703)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9704) /***************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 9705) Test for EIX.
868b2b66 (kx 2024-12-20 16:11:07 +0300 9706) ***************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9707) /* ACOSH(InD) must by InD */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9708) if( ei_isind( eix, nb ) )
868b2b66 (kx 2024-12-20 16:11:07 +0300 9709) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 9710) /* "argument domain error" */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9711) /* return: InD */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9712) ei_copy( eiy, eix, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 9713) /***************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 9714) NOTE:
868b2b66 (kx 2024-12-20 16:11:07 +0300 9715) Функция _mtherr() является переходником между
868b2b66 (kx 2024-12-20 16:11:07 +0300 9716) внутренним форматом и внешней,
868b2b66 (kx 2024-12-20 16:11:07 +0300 9717) переопределяемой пользователем, функцией
868b2b66 (kx 2024-12-20 16:11:07 +0300 9718) _math_error(). Кроме основных действий она
868b2b66 (kx 2024-12-20 16:11:07 +0300 9719) выставляет системную переменную errno
868b2b66 (kx 2024-12-20 16:11:07 +0300 9720) следующим образом.
868b2b66 (kx 2024-12-20 16:11:07 +0300 9721)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9722) errno = __mpu_math_errnotab[type];
868b2b66 (kx 2024-12-20 16:11:07 +0300 9723) ***************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9724) _mtherr( eiy, (__mpu_char8_t *)"acosh", __DOMAIN__,
868b2b66 (kx 2024-12-20 16:11:07 +0300 9725) eiy, x, (EMUSHORT *)0, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 9726) __STDOM; /* InD - produsing Domain Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9727)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9728) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9729) __mpu_sbrk( -(int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 9730) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9731)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9732) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9733) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 9734) /* ACOSH(NaN) must by NaN */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9735) if( ei_isnans( eix, nb ) )
868b2b66 (kx 2024-12-20 16:11:07 +0300 9736) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 9737) /* "argument domain error" */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9738) /* return: NaN */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9739) ei_copy( eiy, eix, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 9740) /***************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 9741) NOTE:
868b2b66 (kx 2024-12-20 16:11:07 +0300 9742) Функция _mtherr() является переходником между
868b2b66 (kx 2024-12-20 16:11:07 +0300 9743) внутренним форматом и внешней,
868b2b66 (kx 2024-12-20 16:11:07 +0300 9744) переопределяемой пользователем, функцией
868b2b66 (kx 2024-12-20 16:11:07 +0300 9745) _math_error(). Кроме основных действий она
868b2b66 (kx 2024-12-20 16:11:07 +0300 9746) выставляет системную переменную errno
868b2b66 (kx 2024-12-20 16:11:07 +0300 9747) следующим образом.
868b2b66 (kx 2024-12-20 16:11:07 +0300 9748)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9749) errno = __mpu_math_errnotab[type];
868b2b66 (kx 2024-12-20 16:11:07 +0300 9750) ***************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9751) _mtherr( eiy, (__mpu_char8_t *)"acosh", __DOMAIN__,
868b2b66 (kx 2024-12-20 16:11:07 +0300 9752) eiy, x, (EMUSHORT *)0, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 9753) __STDOM; /* NaN - produsing Domain Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9754)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9755) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9756) __mpu_sbrk( -(int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 9757) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9758)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9759) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9760) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 9761)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9762)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9763) /*** Allocate memory for t, big, one, ten, tr . *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9764) t = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 9765) if( !t )
868b2b66 (kx 2024-12-20 16:11:07 +0300 9766) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 9767) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9768)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9769) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9770) __mpu_sbrk( -(int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 9771) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9772)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9773) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9774) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 9775)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9776) big = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 9777) if( !big )
868b2b66 (kx 2024-12-20 16:11:07 +0300 9778) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 9779) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9780)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9781) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9782) /* FREE t *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9783) __mpu_sbrk( -(int)(2*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 9784) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9785)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9786) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9787) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 9788)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9789) one = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 9790) if( !one )
868b2b66 (kx 2024-12-20 16:11:07 +0300 9791) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 9792) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9793)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9794) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9795) /* FREE t *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9796) /* FREE big ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9797) __mpu_sbrk( -(int)(3*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 9798) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9799)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9800) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9801) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 9802)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9803) ten = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 9804) if( !ten )
868b2b66 (kx 2024-12-20 16:11:07 +0300 9805) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 9806) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9807)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9808) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9809) /* FREE t *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9810) /* FREE big ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9811) /* FREE one ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9812) __mpu_sbrk( -(int)(4*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 9813) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9814)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9815) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9816) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 9817)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9818) tr = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 9819) if( !tr )
868b2b66 (kx 2024-12-20 16:11:07 +0300 9820) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 9821) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9822)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9823) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9824) /* FREE t *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9825) /* FREE big ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9826) /* FREE one ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9827) /* FREE ten ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9828) __mpu_sbrk( -(int)(5*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 9829) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9830)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9831) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9832) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 9833) /************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9834)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9835)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9836) _gen_one ( one, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 9837)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9838) /* ACOSH( x < 1 ) must by InD */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9839) if( ei_cmp( eix, one, nb ) < 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 9840) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 9841) /* "argument domain error" */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9842) /* return: InD */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9843) ei_ind( eiy, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 9844) /***************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 9845) NOTE:
868b2b66 (kx 2024-12-20 16:11:07 +0300 9846) Функция _mtherr() является переходником между
868b2b66 (kx 2024-12-20 16:11:07 +0300 9847) внутренним форматом и внешней,
868b2b66 (kx 2024-12-20 16:11:07 +0300 9848) переопределяемой пользователем, функцией
868b2b66 (kx 2024-12-20 16:11:07 +0300 9849) _math_error(). Кроме основных действий она
868b2b66 (kx 2024-12-20 16:11:07 +0300 9850) выставляет системную переменную errno
868b2b66 (kx 2024-12-20 16:11:07 +0300 9851) следующим образом.
868b2b66 (kx 2024-12-20 16:11:07 +0300 9852)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9853) errno = __mpu_math_errnotab[type];
868b2b66 (kx 2024-12-20 16:11:07 +0300 9854) ***************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9855) _mtherr( eiy, (__mpu_char8_t *)"acosh", __DOMAIN__,
868b2b66 (kx 2024-12-20 16:11:07 +0300 9856) eiy, x, (EMUSHORT *)0, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 9857) __STDOM; /* (x < 1) - produsing Domain Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9858)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9859) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9860) /* FREE t *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9861) /* FREE big ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9862) /* FREE one ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9863) /* FREE ten ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9864) /* FREE tr ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9865) __mpu_sbrk( -(int)(6*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 9866) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9867)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9868) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9869) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 9870)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9871) _gen_ten ( ten, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 9872)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9873) /*********************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 9874) big : big = 1/(small^2); & (big+1) == big;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9875) *********************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9876) ei_div( big, one, _get_epsilon_ptr( nb ), nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 9877) ei_mul( big, big, ten, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 9878)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9879) /* Service Constant: */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9880) ln2hi = _get_m_ln2hi_ptr( nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 9881) ln2lo = _get_m_ln2lo_ptr( nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 9882)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9883) /* ei_copy( x, eix, nb ); */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9884)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9885)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9886) if( ei_cmp( x, big, nb ) > 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 9887) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 9888) /* return( log1p(x) + ln(2) ) if x is large. */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9889) ei_log1p( t, x, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 9890) ei_add( t, t, ln2lo, nb ); /* t = log1p(x)+ln2lo; */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9891) ei_add( eiy, t, ln2hi, nb ); /* return( t+ln2hi ); */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9892)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9893) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9894) /* FREE t *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9895) /* FREE big ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9896) /* FREE one ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9897) /* FREE ten ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9898) /* FREE tr ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9899) __mpu_sbrk( -(int)(6*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 9900) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9901)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9902) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9903) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 9904)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9905) ei_sub( tr, x, one, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 9906) ei_sqrt( t, tr, nb ); /* t = sqrt(x-1.0); */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9907)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9908) ei_add( tr, x, one, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 9909) ei_sqrt( tr, tr, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 9910) ei_add( tr, t, tr, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 9911) ei_mul( tr, t, tr, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 9912) ei_log1p( eiy, tr, nb ); /* return( log1p( t*(t+sqrt(x+1.0)) ) ); */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9913)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9914) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9915) /* FREE t *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9916) /* FREE big ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9917) /* FREE one ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9918) /* FREE ten ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9919) /* FREE tr ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9920) __mpu_sbrk( -(int)(6*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 9921) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9922)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9923) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9924)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9925) } /* End of ei_acosh() */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9926)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9927)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9928) void ei_atanh( EMUSHORT *eiy, EMUSHORT *eix, int nb )
868b2b66 (kx 2024-12-20 16:11:07 +0300 9929) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 9930)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9931) Description : ei_atanh() Работает с
868b2b66 (kx 2024-12-20 16:11:07 +0300 9932) internal e-type data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300 9933)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9934) Concepts : ATANH(X) RETURN
868b2b66 (kx 2024-12-20 16:11:07 +0300 9935) THE INVERSE HYPERBOLIC TANGENT OF EIX.
868b2b66 (kx 2024-12-20 16:11:07 +0300 9936)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9937) METHOD : Return
868b2b66 (kx 2024-12-20 16:11:07 +0300 9938)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9939) 1 2x x
868b2b66 (kx 2024-12-20 16:11:07 +0300 9940) atanh(x) = --- * log(1 + -------) = 0.5 * log1p(2 * --------);
868b2b66 (kx 2024-12-20 16:11:07 +0300 9941) 2 1 - x 1 - x
868b2b66 (kx 2024-12-20 16:11:07 +0300 9942)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9943) ACCURACY : In the absence of rounding error,
868b2b66 (kx 2024-12-20 16:11:07 +0300 9944) the appriximation has absolute error
868b2b66 (kx 2024-12-20 16:11:07 +0300 9945) less than EPSILON [see: mpu-floatp.h].
868b2b66 (kx 2024-12-20 16:11:07 +0300 9946)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9947) NOTE : Для r в интервале [0, thovfl], проделаем
868b2b66 (kx 2024-12-20 16:11:07 +0300 9948) следующее:
868b2b66 (kx 2024-12-20 16:11:07 +0300 9949) t = tanh ( r );
868b2b66 (kx 2024-12-20 16:11:07 +0300 9950) t = atanh( t ).
868b2b66 (kx 2024-12-20 16:11:07 +0300 9951) При этом для r в интервале [1.0, thovfl]
868b2b66 (kx 2024-12-20 16:11:07 +0300 9952) с увеличением r растет и величина разности
868b2b66 (kx 2024-12-20 16:11:07 +0300 9953) (t-r) чего в принципе не должно быть.
868b2b66 (kx 2024-12-20 16:11:07 +0300 9954) СЛЕДОВАТЕЛЬНО ПОКА МЫ МОЖЕМ РЕКОМЕНДОВАТЬ
868b2b66 (kx 2024-12-20 16:11:07 +0300 9955) проводить такие опыты лишь на промежутке
868b2b66 (kx 2024-12-20 16:11:07 +0300 9956) [-1, 1].
868b2b66 (kx 2024-12-20 16:11:07 +0300 9957)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9958) SPECIAL CASES : atanh(-InD) = -InD с выставлением DOMAIN flag;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9959) atanh(+NaN) = +NaN с выставлением DOMAIN flag;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9960) atanh(-NaN) = -NaN с выставлением DOMAIN flag;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9961) atanh(|x|>1) = -Ind с выставлением DOMAIN flag;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9962) atanh( +-1 ) = +-Inf с выставлением
868b2b66 (kx 2024-12-20 16:11:07 +0300 9963) OVERFLOW flag;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9964)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9965) Use Global Variable:
868b2b66 (kx 2024-12-20 16:11:07 +0300 9966)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9967) Use Functions : ei_log1p( eiy, eix, nb ); | this file
868b2b66 (kx 2024-12-20 16:11:07 +0300 9968) ei_copy( eiy, eix, nb ); | mpu-real.c
868b2b66 (kx 2024-12-20 16:11:07 +0300 9969) .
868b2b66 (kx 2024-12-20 16:11:07 +0300 9970) .
868b2b66 (kx 2024-12-20 16:11:07 +0300 9971) .
868b2b66 (kx 2024-12-20 16:11:07 +0300 9972)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9973) Parameters : EMUSHORT *eiy; - указатель на
868b2b66 (kx 2024-12-20 16:11:07 +0300 9974) internal e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300 9975) data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300 9976) TARGET;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9977) EMUSHORT *eix; - указатель на
868b2b66 (kx 2024-12-20 16:11:07 +0300 9978) internal e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300 9979) data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300 9980) SOURCE;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9981) int nb; - количество бит в
868b2b66 (kx 2024-12-20 16:11:07 +0300 9982) external e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300 9983) data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300 9984)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9985) Return : [void]
868b2b66 (kx 2024-12-20 16:11:07 +0300 9986)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9987) ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9988) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 9989) EMUSHORT *x = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 9990) *z = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 9991) *half = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 9992) *one = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 9993) *tr = NULL; /* temp */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9994) int np;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9995)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9996)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9997) if( nb < NBR_32 || nb > MPU_MATH_FN_LIMIT )
868b2b66 (kx 2024-12-20 16:11:07 +0300 9998) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 9999) /* error: Invalid size of operand(s) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10000) __real_invalid_size( (__mpu_char8_t *)"atanh" );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10001) /* ei_ind( eiy, nb ); */ /* Invalid NB */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10002) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10003) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 10004)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10005) /*******************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 10006) Hight Precision for r32, r64.
868b2b66 (kx 2024-12-20 16:11:07 +0300 10007) *******************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10008) if( nb < NBR_128 ) nb = NBR_128;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10009)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10010) np = internal_np( nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10011)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10012) /*** Allocate memory for x . ********************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10013) x = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10014) if( !x )
868b2b66 (kx 2024-12-20 16:11:07 +0300 10015) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 10016) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10017) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10018) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 10019) /************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10020)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10021)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10022) ei_copy( x, eix, nb ); /* temp for _mtherr() */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10023)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10024) /***************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 10025) Test for EIX.
868b2b66 (kx 2024-12-20 16:11:07 +0300 10026) ***************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10027) /* ATANH(InD) must by InD */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10028) if( ei_isind( eix, nb ) )
868b2b66 (kx 2024-12-20 16:11:07 +0300 10029) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 10030) /* "argument domain error" */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10031) /* return: InD */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10032) ei_copy( eiy, eix, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10033) /***************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 10034) NOTE:
868b2b66 (kx 2024-12-20 16:11:07 +0300 10035) Функция _mtherr() является переходником между
868b2b66 (kx 2024-12-20 16:11:07 +0300 10036) внутренним форматом и внешней,
868b2b66 (kx 2024-12-20 16:11:07 +0300 10037) переопределяемой пользователем, функцией
868b2b66 (kx 2024-12-20 16:11:07 +0300 10038) _math_error(). Кроме основных действий она
868b2b66 (kx 2024-12-20 16:11:07 +0300 10039) выставляет системную переменную errno
868b2b66 (kx 2024-12-20 16:11:07 +0300 10040) следующим образом.
868b2b66 (kx 2024-12-20 16:11:07 +0300 10041)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10042) errno = __mpu_math_errnotab[type];
868b2b66 (kx 2024-12-20 16:11:07 +0300 10043) ***************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10044) _mtherr( eiy, (__mpu_char8_t *)"atanh", __DOMAIN__,
868b2b66 (kx 2024-12-20 16:11:07 +0300 10045) eiy, x, (EMUSHORT *)0, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10046) __STDOM; /* InD - produsing Domain Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10047)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10048) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10049) __mpu_sbrk( -(int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10050) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10051)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10052) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10053) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 10054) /* ATANH(NaN) must by NaN */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10055) if( ei_isnans( eix, nb ) )
868b2b66 (kx 2024-12-20 16:11:07 +0300 10056) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 10057) /* "argument domain error" */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10058) /* return: NaN */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10059) ei_copy( eiy, eix, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10060) /***************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 10061) NOTE:
868b2b66 (kx 2024-12-20 16:11:07 +0300 10062) Функция _mtherr() является переходником между
868b2b66 (kx 2024-12-20 16:11:07 +0300 10063) внутренним форматом и внешней,
868b2b66 (kx 2024-12-20 16:11:07 +0300 10064) переопределяемой пользователем, функцией
868b2b66 (kx 2024-12-20 16:11:07 +0300 10065) _math_error(). Кроме основных действий она
868b2b66 (kx 2024-12-20 16:11:07 +0300 10066) выставляет системную переменную errno
868b2b66 (kx 2024-12-20 16:11:07 +0300 10067) следующим образом.
868b2b66 (kx 2024-12-20 16:11:07 +0300 10068)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10069) errno = __mpu_math_errnotab[type];
868b2b66 (kx 2024-12-20 16:11:07 +0300 10070) ***************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10071) _mtherr( eiy, (__mpu_char8_t *)"atanh", __DOMAIN__,
868b2b66 (kx 2024-12-20 16:11:07 +0300 10072) eiy, x, (EMUSHORT *)0, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10073) __STDOM; /* NaN - produsing Domain Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10074)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10075) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10076) __mpu_sbrk( -(int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10077) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10078)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10079) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10080) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 10081)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10082)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10083) /*** Allocate memory for z, half, one, tr . *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10084) z = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10085) if( !z )
868b2b66 (kx 2024-12-20 16:11:07 +0300 10086) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 10087) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10088)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10089) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10090) __mpu_sbrk( -(int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10091) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10092)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10093) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10094) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 10095)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10096) half = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10097) if( !half )
868b2b66 (kx 2024-12-20 16:11:07 +0300 10098) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 10099) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10100)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10101) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10102) /* FREE z *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10103) __mpu_sbrk( -(int)(2*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10104) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10105)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10106) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10107) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 10108)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10109) one = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10110) if( !one )
868b2b66 (kx 2024-12-20 16:11:07 +0300 10111) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 10112) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10113)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10114) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10115) /* FREE z *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10116) /* FREE half **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10117) __mpu_sbrk( -(int)(3*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10118) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10119)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10120) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10121) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 10122)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10123) tr = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10124) if( !tr )
868b2b66 (kx 2024-12-20 16:11:07 +0300 10125) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 10126) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10127)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10128) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10129) /* FREE z *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10130) /* FREE half **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10131) /* FREE one ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10132) __mpu_sbrk( -(int)(4*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10133) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10134)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10135) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10136) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 10137) /************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10138)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10139) _gen_half( half, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10140) _gen_one ( one, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10141)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10142) /* ei_copy( x, eix, nb ); */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10143)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10144) ei_copysign( z, half, x, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10145) ei_copysign( x, x, one, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10146)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10147) /* ATANH( |x| > 1 ) must by InD */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10148) if( ei_cmp( x, one, nb ) > 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 10149) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 10150) /* "argument domain error" */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10151) /* return: InD */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10152) ei_copy( x, eix, nb ); /* for &eiy == &eix */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10153)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10154) ei_ind( eiy, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10155) /***************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 10156) NOTE:
868b2b66 (kx 2024-12-20 16:11:07 +0300 10157) Функция _mtherr() является переходником между
868b2b66 (kx 2024-12-20 16:11:07 +0300 10158) внутренним форматом и внешней,
868b2b66 (kx 2024-12-20 16:11:07 +0300 10159) переопределяемой пользователем, функцией
868b2b66 (kx 2024-12-20 16:11:07 +0300 10160) _math_error(). Кроме основных действий она
868b2b66 (kx 2024-12-20 16:11:07 +0300 10161) выставляет системную переменную errno
868b2b66 (kx 2024-12-20 16:11:07 +0300 10162) следующим образом.
868b2b66 (kx 2024-12-20 16:11:07 +0300 10163)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10164) errno = __mpu_math_errnotab[type];
868b2b66 (kx 2024-12-20 16:11:07 +0300 10165) ***************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10166) _mtherr( eiy, (__mpu_char8_t *)"atanh", __DOMAIN__,
868b2b66 (kx 2024-12-20 16:11:07 +0300 10167) eiy, x, (EMUSHORT *)0, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10168) __STDOM; /* (x > 1) - produsing Domain Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10169)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10170) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10171) /* FREE z *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10172) /* FREE half **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10173) /* FREE one ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10174) /* FREE tr ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10175) __mpu_sbrk( -(int)(5*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10176) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10177)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10178) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10179) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 10180)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10181) /* ATANH( |x| == 1 ) must by sign(x)*Infinity */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10182) if( ei_cmp( x, one, nb ) == 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 10183) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 10184) /* ATANH(|x| == 1) overflow to +-Infinity */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10185) /* "overflow range error" */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10186) /* return: sign(x)*Infinity */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10187) ei_copy( x, eix, nb ); /* for &eiy == &eix */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10188)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10189) ei_infin( tr, (unsigned)0, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10190) ei_copysign( eiy, tr, z, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10191)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10192) /***************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 10193) NOTE:
868b2b66 (kx 2024-12-20 16:11:07 +0300 10194) Функция _mtherr() является переходником между
868b2b66 (kx 2024-12-20 16:11:07 +0300 10195) внутренним форматом и внешней,
868b2b66 (kx 2024-12-20 16:11:07 +0300 10196) переопределяемой пользователем, функцией
868b2b66 (kx 2024-12-20 16:11:07 +0300 10197) _math_error(). Кроме основных действий она
868b2b66 (kx 2024-12-20 16:11:07 +0300 10198) выставляет системную переменную errno
868b2b66 (kx 2024-12-20 16:11:07 +0300 10199) следующим образом.
868b2b66 (kx 2024-12-20 16:11:07 +0300 10200)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10201) errno = __mpu_math_errnotab[type];
868b2b66 (kx 2024-12-20 16:11:07 +0300 10202) ***************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10203) _mtherr( eiy, (__mpu_char8_t *)"atanh", __OVERFLOW__,
868b2b66 (kx 2024-12-20 16:11:07 +0300 10204) eiy, x, (EMUSHORT *)0, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10205) __STOVF; /* (|x| == 1) - produsing Overflow Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10206)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10207) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10208) /* FREE z *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10209) /* FREE half **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10210) /* FREE one ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10211) /* FREE tr ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10212) __mpu_sbrk( -(int)(5*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10213) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10214)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10215) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10216) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 10217)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10218)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10219) ei_sub( tr, one, x, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10220) ei_div( x, x, tr, nb ); /* x = x/(1.0-x); */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10221)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10222) ei_add( tr, x, x, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10223) ei_log1p( tr, tr, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10224) ei_mul( eiy, z, tr, nb ); /* return( z*log1p(x+x) ); */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10225)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10226) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10227) /* FREE z *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10228) /* FREE half **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10229) /* FREE one ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10230) /* FREE tr ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10231) __mpu_sbrk( -(int)(5*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10232) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10233)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10234) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10235)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10236) } /* End of ei_atanh() */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10237)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10238)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10239) void ei_asin( EMUSHORT *eiy, EMUSHORT *eix, int nb )
868b2b66 (kx 2024-12-20 16:11:07 +0300 10240) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 10241)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10242) Description : ei_asin() Работает с
868b2b66 (kx 2024-12-20 16:11:07 +0300 10243) internal e-type data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300 10244)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10245) Concepts : ASIN(X) RETURN THE INVERSE SINE OF EIX.
868b2b66 (kx 2024-12-20 16:11:07 +0300 10246)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10247) METHOD : Return
868b2b66 (kx 2024-12-20 16:11:07 +0300 10248)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10249) asin(x) = atan2(x,sqrt(1-x*x));
868b2b66 (kx 2024-12-20 16:11:07 +0300 10250) for better accuracy, 1-x*x is computed
868b2b66 (kx 2024-12-20 16:11:07 +0300 10251) as follows
868b2b66 (kx 2024-12-20 16:11:07 +0300 10252) if( x < 0.5) 1-x*x;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10253) if( x >= 0.5) 2*(1-|x|)-(1-|x|)*(1-|x|).
868b2b66 (kx 2024-12-20 16:11:07 +0300 10254)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10255) ACCURACY : In the absence of rounding error,
868b2b66 (kx 2024-12-20 16:11:07 +0300 10256) the appriximation has absolute error
868b2b66 (kx 2024-12-20 16:11:07 +0300 10257) less than EPSILON [see: mpu-floatp.h].
868b2b66 (kx 2024-12-20 16:11:07 +0300 10258)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10259) NOTE :
868b2b66 (kx 2024-12-20 16:11:07 +0300 10260)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10261) SPECIAL CASES : asin(-InD) = -InD с выставлением DOMAIN flag;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10262) asin(+NaN) = +NaN с выставлением DOMAIN flag;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10263) asin(-NaN) = -NaN с выставлением DOMAIN flag;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10264) asin(|x|>1) = -Ind с выставлением DOMAIN flag;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10265)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10266) Use Global Variable:
868b2b66 (kx 2024-12-20 16:11:07 +0300 10267)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10268) Use Functions : ei_atan2( eiy, eix, nb ); | this file
868b2b66 (kx 2024-12-20 16:11:07 +0300 10269) ei_sqrt( eiy, eix, nb ); | mpu-real.c
868b2b66 (kx 2024-12-20 16:11:07 +0300 10270) ei_copy( eiy, eix, nb ); | mpu-real.c
868b2b66 (kx 2024-12-20 16:11:07 +0300 10271) .
868b2b66 (kx 2024-12-20 16:11:07 +0300 10272) .
868b2b66 (kx 2024-12-20 16:11:07 +0300 10273) .
868b2b66 (kx 2024-12-20 16:11:07 +0300 10274)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10275) Parameters : EMUSHORT *eiy; - указатель на
868b2b66 (kx 2024-12-20 16:11:07 +0300 10276) internal e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300 10277) data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300 10278) TARGET;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10279) EMUSHORT *eix; - указатель на
868b2b66 (kx 2024-12-20 16:11:07 +0300 10280) internal e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300 10281) data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300 10282) SOURCE;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10283) int nb; - количество бит в
868b2b66 (kx 2024-12-20 16:11:07 +0300 10284) external e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300 10285) data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300 10286)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10287) Return : [void]
868b2b66 (kx 2024-12-20 16:11:07 +0300 10288)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10289) ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10290) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 10291) EMUSHORT *x = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 10292) *t = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 10293) *s = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 10294) *half = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 10295) *one = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 10296) *tr = NULL; /* temp */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10297) int np;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10298)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10299)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10300) if( nb < NBR_32 || nb > MPU_MATH_FN_LIMIT )
868b2b66 (kx 2024-12-20 16:11:07 +0300 10301) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 10302) /* error: Invalid size of operand(s) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10303) __real_invalid_size( (__mpu_char8_t *)"asin" );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10304) /* ei_ind( eiy, nb ); */ /* Invalid NB */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10305) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10306) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 10307)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10308) /*******************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 10309) Hight Precision for r32, r64.
868b2b66 (kx 2024-12-20 16:11:07 +0300 10310) *******************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10311) if( nb < NBR_128 ) nb = NBR_128;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10312)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10313) np = internal_np( nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10314)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10315) /*** Allocate memory for x . ********************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10316) x = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10317) if( !x )
868b2b66 (kx 2024-12-20 16:11:07 +0300 10318) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 10319) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10320) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10321) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 10322) /************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10323)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10324) ei_copy( x, eix, nb ); /* temp for _mtherr() */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10325)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10326) /***************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 10327) Test for EIX.
868b2b66 (kx 2024-12-20 16:11:07 +0300 10328) ***************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10329) /* ASIN(InD) must by InD */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10330) if( ei_isind( eix, nb ) )
868b2b66 (kx 2024-12-20 16:11:07 +0300 10331) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 10332) /* "argument domain error" */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10333) /* return: InD */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10334) ei_copy( eiy, eix, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10335) /***************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 10336) NOTE:
868b2b66 (kx 2024-12-20 16:11:07 +0300 10337) Функция _mtherr() является переходником между
868b2b66 (kx 2024-12-20 16:11:07 +0300 10338) внутренним форматом и внешней,
868b2b66 (kx 2024-12-20 16:11:07 +0300 10339) переопределяемой пользователем, функцией
868b2b66 (kx 2024-12-20 16:11:07 +0300 10340) _math_error(). Кроме основных действий она
868b2b66 (kx 2024-12-20 16:11:07 +0300 10341) выставляет системную переменную errno
868b2b66 (kx 2024-12-20 16:11:07 +0300 10342) следующим образом.
868b2b66 (kx 2024-12-20 16:11:07 +0300 10343)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10344) errno = __mpu_math_errnotab[type];
868b2b66 (kx 2024-12-20 16:11:07 +0300 10345) ***************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10346) _mtherr( eiy, (__mpu_char8_t *)"asin", __DOMAIN__,
868b2b66 (kx 2024-12-20 16:11:07 +0300 10347) eiy, x, (EMUSHORT *)0, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10348) __STDOM; /* InD - produsing Domain Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10349)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10350) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10351) __mpu_sbrk( -(int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10352) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10353)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10354) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10355) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 10356) /* ASIN(NaN) must by NaN */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10357) if( ei_isnans( eix, nb ) )
868b2b66 (kx 2024-12-20 16:11:07 +0300 10358) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 10359) /* "argument domain error" */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10360) /* return: NaN */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10361) ei_copy( eiy, eix, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10362) /***************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 10363) NOTE:
868b2b66 (kx 2024-12-20 16:11:07 +0300 10364) Функция _mtherr() является переходником между
868b2b66 (kx 2024-12-20 16:11:07 +0300 10365) внутренним форматом и внешней,
868b2b66 (kx 2024-12-20 16:11:07 +0300 10366) переопределяемой пользователем, функцией
868b2b66 (kx 2024-12-20 16:11:07 +0300 10367) _math_error(). Кроме основных действий она
868b2b66 (kx 2024-12-20 16:11:07 +0300 10368) выставляет системную переменную errno
868b2b66 (kx 2024-12-20 16:11:07 +0300 10369) следующим образом.
868b2b66 (kx 2024-12-20 16:11:07 +0300 10370)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10371) errno = __mpu_math_errnotab[type];
868b2b66 (kx 2024-12-20 16:11:07 +0300 10372) ***************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10373) _mtherr( eiy, (__mpu_char8_t *)"asin", __DOMAIN__,
868b2b66 (kx 2024-12-20 16:11:07 +0300 10374) eiy, x, (EMUSHORT *)0, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10375) __STDOM; /* NaN - produsing Domain Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10376)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10377) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10378) __mpu_sbrk( -(int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10379) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10380)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10381) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10382) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 10383)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10384) /*** Allocate memory for t, s, half, one, tr . **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10385) t = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10386) if( !t )
868b2b66 (kx 2024-12-20 16:11:07 +0300 10387) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 10388) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10389)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10390) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10391) __mpu_sbrk( -(int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10392) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10393)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10394) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10395) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 10396)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10397) s = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10398) if( !s )
868b2b66 (kx 2024-12-20 16:11:07 +0300 10399) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 10400) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10401)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10402) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10403) /* FREE t *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10404) __mpu_sbrk( -(int)(2*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10405) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10406)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10407) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10408) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 10409)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10410) half = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10411) if( !half )
868b2b66 (kx 2024-12-20 16:11:07 +0300 10412) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 10413) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10414)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10415) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10416) /* FREE t *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10417) /* FREE s *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10418) __mpu_sbrk( -(int)(3*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10419) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10420)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10421) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10422) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 10423)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10424) one = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10425) if( !one )
868b2b66 (kx 2024-12-20 16:11:07 +0300 10426) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 10427) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10428)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10429) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10430) /* FREE t *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10431) /* FREE s *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10432) /* FREE half **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10433) __mpu_sbrk( -(int)(4*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10434) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10435)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10436) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10437) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 10438)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10439) tr = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10440) if( !tr )
868b2b66 (kx 2024-12-20 16:11:07 +0300 10441) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 10442) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10443)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10444) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10445) /* FREE t *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10446) /* FREE s *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10447) /* FREE half **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10448) /* FREE one ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10449) __mpu_sbrk( -(int)(5*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10450) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10451)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10452) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10453) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 10454) /************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10455)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10456) _gen_half( half, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10457) _gen_one ( one, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10458)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10459) ei_copysign( s, x, one, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10460)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10461) /* ATANH( |x| > 1 ) must by InD */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10462) if( ei_cmp( s, one, nb ) > 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 10463) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 10464) /* "argument domain error" */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10465) /* return: InD */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10466) ei_ind( eiy, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10467) /***************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 10468) NOTE:
868b2b66 (kx 2024-12-20 16:11:07 +0300 10469) Функция _mtherr() является переходником между
868b2b66 (kx 2024-12-20 16:11:07 +0300 10470) внутренним форматом и внешней,
868b2b66 (kx 2024-12-20 16:11:07 +0300 10471) переопределяемой пользователем, функцией
868b2b66 (kx 2024-12-20 16:11:07 +0300 10472) _math_error(). Кроме основных действий она
868b2b66 (kx 2024-12-20 16:11:07 +0300 10473) выставляет системную переменную errno
868b2b66 (kx 2024-12-20 16:11:07 +0300 10474) следующим образом.
868b2b66 (kx 2024-12-20 16:11:07 +0300 10475)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10476) errno = __mpu_math_errnotab[type];
868b2b66 (kx 2024-12-20 16:11:07 +0300 10477) ***************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10478) _mtherr( eiy, (__mpu_char8_t *)"asin", __DOMAIN__,
868b2b66 (kx 2024-12-20 16:11:07 +0300 10479) eiy, x, (EMUSHORT *)0, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10480) __STDOM; /* (x > 1) - produsing Domain Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10481)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10482) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10483) /* FREE t *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10484) /* FREE s *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10485) /* FREE half **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10486) /* FREE one ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10487) /* FREE tr ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10488) __mpu_sbrk( -(int)(6*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10489) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10490)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10491) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10492) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 10493)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10494) if( ei_cmp( s, half, nb ) <= 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 10495) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 10496) /* return( atan2( x, sqrt( one - x*x ) ) ); */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10497) ei_mul( tr, x, x, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10498) ei_sub( tr, one, tr, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10499) ei_sqrt( tr, tr, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10500) ei_atan2( eiy, x, tr, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10501)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10502) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10503) /* FREE t *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10504) /* FREE s *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10505) /* FREE half **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10506) /* FREE one ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10507) /* FREE tr ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10508) __mpu_sbrk( -(int)(6*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10509) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10510)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10511) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10512) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 10513) else
868b2b66 (kx 2024-12-20 16:11:07 +0300 10514) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 10515) ei_sub( t, one, s, nb ); /* t = one - s; */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10516) ei_add( s, t, t, nb ); /* s = t + t; */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10517) /* return( atan2( x, sqrt( s - t*t ) ) ); */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10518) ei_mul( tr, t, t, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10519) ei_sub( tr, s, tr, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10520) ei_sqrt( tr, tr, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10521) ei_atan2( eiy, x, tr, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10522)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10523) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10524) /* FREE t *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10525) /* FREE s *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10526) /* FREE half **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10527) /* FREE one ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10528) /* FREE tr ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10529) __mpu_sbrk( -(int)(6*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10530) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10531)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10532) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10533) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 10534)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10535) } /* End of ei_asin() */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10536)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10537)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10538) void ei_acos( EMUSHORT *eiy, EMUSHORT *eix, int nb )
868b2b66 (kx 2024-12-20 16:11:07 +0300 10539) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 10540)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10541) Description : ei_acos() Работает с
868b2b66 (kx 2024-12-20 16:11:07 +0300 10542) internal e-type data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300 10543)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10544) Concepts : ACOS(X) RETURN THE INVERSE COSINE OF EIX.
868b2b66 (kx 2024-12-20 16:11:07 +0300 10545)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10546) METHOD : Return
868b2b66 (kx 2024-12-20 16:11:07 +0300 10547) ________
868b2b66 (kx 2024-12-20 16:11:07 +0300 10548) / 1 - x
868b2b66 (kx 2024-12-20 16:11:07 +0300 10549) acos(x) = 2*atan2( / --------, 1 ).
868b2b66 (kx 2024-12-20 16:11:07 +0300 10550) \/ 1 + x
868b2b66 (kx 2024-12-20 16:11:07 +0300 10551)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10552)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10553) ACCURACY : In the absence of rounding error,
868b2b66 (kx 2024-12-20 16:11:07 +0300 10554) the appriximation has absolute error
868b2b66 (kx 2024-12-20 16:11:07 +0300 10555) less than EPSILON [see: mpu-floatp.h].
868b2b66 (kx 2024-12-20 16:11:07 +0300 10556)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10557) NOTE :
868b2b66 (kx 2024-12-20 16:11:07 +0300 10558)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10559) SPECIAL CASES : acos(-InD) = -InD с выставлением DOMAIN flag;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10560) acos(+NaN) = +NaN с выставлением DOMAIN flag;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10561) acos(-NaN) = -NaN с выставлением DOMAIN flag;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10562) acos(|x|>1) = -Ind с выставлением DOMAIN flag;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10563)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10564) Use Global Variable:
868b2b66 (kx 2024-12-20 16:11:07 +0300 10565)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10566) Use Functions : ei_atan2( eiy, eix, nb ); | this file
868b2b66 (kx 2024-12-20 16:11:07 +0300 10567) ei_sqrt( eiy, eix, nb ); | mpu-real.c
868b2b66 (kx 2024-12-20 16:11:07 +0300 10568) ei_copy( eiy, eix, nb ); | mpu-real.c
868b2b66 (kx 2024-12-20 16:11:07 +0300 10569) .
868b2b66 (kx 2024-12-20 16:11:07 +0300 10570) .
868b2b66 (kx 2024-12-20 16:11:07 +0300 10571) .
868b2b66 (kx 2024-12-20 16:11:07 +0300 10572)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10573) Parameters : EMUSHORT *eiy; - указатель на
868b2b66 (kx 2024-12-20 16:11:07 +0300 10574) internal e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300 10575) data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300 10576) TARGET;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10577) EMUSHORT *eix; - указатель на
868b2b66 (kx 2024-12-20 16:11:07 +0300 10578) internal e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300 10579) data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300 10580) SOURCE;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10581) int nb; - количество бит в
868b2b66 (kx 2024-12-20 16:11:07 +0300 10582) external e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300 10583) data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300 10584)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10585) Return : [void]
868b2b66 (kx 2024-12-20 16:11:07 +0300 10586)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10587) ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10588) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 10589) EMUSHORT *x = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 10590) *t = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 10591) *s = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 10592) *zero = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 10593) *one = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 10594) *negone = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 10595) *tx = NULL, /* temp */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10596) *tr = NULL; /* temp */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10597) int np;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10598)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10599)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10600) if( nb < NBR_32 || nb > MPU_MATH_FN_LIMIT )
868b2b66 (kx 2024-12-20 16:11:07 +0300 10601) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 10602) /* error: Invalid size of operand(s) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10603) __real_invalid_size( (__mpu_char8_t *)"acos" );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10604) /* ei_ind( eiy, nb ); */ /* Invalid NB */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10605) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10606) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 10607)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10608) /*******************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 10609) Hight Precision for r32, r64.
868b2b66 (kx 2024-12-20 16:11:07 +0300 10610) *******************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10611) if( nb < NBR_128 ) nb = NBR_128;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10612)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10613) np = internal_np( nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10614)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10615) /*** Allocate memory for x . ********************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10616) x = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10617) if( !x )
868b2b66 (kx 2024-12-20 16:11:07 +0300 10618) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 10619) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10620) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10621) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 10622) /************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10623)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10624) ei_copy( x, eix, nb ); /* temp for _mtherr() */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10625)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10626) /***************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 10627) Test for EIX.
868b2b66 (kx 2024-12-20 16:11:07 +0300 10628) ***************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10629) /* ACOS(InD) must by InD */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10630) if( ei_isind( eix, nb ) )
868b2b66 (kx 2024-12-20 16:11:07 +0300 10631) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 10632) /* "argument domain error" */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10633) /* return: InD */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10634) ei_copy( eiy, eix, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10635) /***************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 10636) NOTE:
868b2b66 (kx 2024-12-20 16:11:07 +0300 10637) Функция _mtherr() является переходником между
868b2b66 (kx 2024-12-20 16:11:07 +0300 10638) внутренним форматом и внешней,
868b2b66 (kx 2024-12-20 16:11:07 +0300 10639) переопределяемой пользователем, функцией
868b2b66 (kx 2024-12-20 16:11:07 +0300 10640) _math_error(). Кроме основных действий она
868b2b66 (kx 2024-12-20 16:11:07 +0300 10641) выставляет системную переменную errno
868b2b66 (kx 2024-12-20 16:11:07 +0300 10642) следующим образом.
868b2b66 (kx 2024-12-20 16:11:07 +0300 10643)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10644) errno = __mpu_math_errnotab[type];
868b2b66 (kx 2024-12-20 16:11:07 +0300 10645) ***************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10646) _mtherr( eiy, (__mpu_char8_t *)"acos", __DOMAIN__,
868b2b66 (kx 2024-12-20 16:11:07 +0300 10647) eiy, x, (EMUSHORT *)0, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10648) __STDOM; /* InD - produsing Domain Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10649)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10650) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10651) __mpu_sbrk( -(int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10652) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10653)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10654) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10655) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 10656) /* ACOS(NaN) must by NaN */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10657) if( ei_isnans( eix, nb ) )
868b2b66 (kx 2024-12-20 16:11:07 +0300 10658) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 10659) /* "argument domain error" */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10660) /* return: NaN */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10661) ei_copy( eiy, eix, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10662) /***************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 10663) NOTE:
868b2b66 (kx 2024-12-20 16:11:07 +0300 10664) Функция _mtherr() является переходником между
868b2b66 (kx 2024-12-20 16:11:07 +0300 10665) внутренним форматом и внешней,
868b2b66 (kx 2024-12-20 16:11:07 +0300 10666) переопределяемой пользователем, функцией
868b2b66 (kx 2024-12-20 16:11:07 +0300 10667) _math_error(). Кроме основных действий она
868b2b66 (kx 2024-12-20 16:11:07 +0300 10668) выставляет системную переменную errno
868b2b66 (kx 2024-12-20 16:11:07 +0300 10669) следующим образом.
868b2b66 (kx 2024-12-20 16:11:07 +0300 10670)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10671) errno = __mpu_math_errnotab[type];
868b2b66 (kx 2024-12-20 16:11:07 +0300 10672) ***************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10673) _mtherr( eiy, (__mpu_char8_t *)"acos", __DOMAIN__,
868b2b66 (kx 2024-12-20 16:11:07 +0300 10674) eiy, x, (EMUSHORT *)0, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10675) __STDOM; /* NaN - produsing Domain Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10676)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10677) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10678) __mpu_sbrk( -(int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10679) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10680)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10681) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10682) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 10683)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10684) /*** Allocate memory for t, s, zero, one, negone, tx, tr . **/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10685) t = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10686) if( !t )
868b2b66 (kx 2024-12-20 16:11:07 +0300 10687) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 10688) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10689)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10690) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10691) __mpu_sbrk( -(int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10692) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10693)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10694) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10695) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 10696)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10697) s = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10698) if( !s )
868b2b66 (kx 2024-12-20 16:11:07 +0300 10699) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 10700) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10701)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10702) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10703) /* FREE t *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10704) __mpu_sbrk( -(int)(2*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10705) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10706)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10707) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10708) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 10709)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10710) zero = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10711) if( !zero )
868b2b66 (kx 2024-12-20 16:11:07 +0300 10712) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 10713) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10714)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10715) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10716) /* FREE t *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10717) /* FREE s *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10718) __mpu_sbrk( -(int)(3*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10719) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10720)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10721) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10722) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 10723)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10724) one = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10725) if( !one )
868b2b66 (kx 2024-12-20 16:11:07 +0300 10726) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 10727) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10728)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10729) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10730) /* FREE t *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10731) /* FREE s *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10732) /* FREE zero **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10733) __mpu_sbrk( -(int)(4*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10734) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10735)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10736) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10737) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 10738)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10739) negone = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10740) if( !negone )
868b2b66 (kx 2024-12-20 16:11:07 +0300 10741) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 10742) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10743)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10744) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10745) /* FREE t *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10746) /* FREE s *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10747) /* FREE zero **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10748) /* FREE one ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10749) __mpu_sbrk( -(int)(5*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10750) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10751)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10752) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10753) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 10754)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10755) tx = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10756) if( !tx )
868b2b66 (kx 2024-12-20 16:11:07 +0300 10757) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 10758) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10759)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10760) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10761) /* FREE t *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10762) /* FREE s *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10763) /* FREE zero **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10764) /* FREE one ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10765) /* FREE negone ************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10766) __mpu_sbrk( -(int)(6*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10767) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10768)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10769) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10770) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 10771)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10772) tr = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10773) if( !tr )
868b2b66 (kx 2024-12-20 16:11:07 +0300 10774) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 10775) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10776)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10777) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10778) /* FREE t *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10779) /* FREE s *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10780) /* FREE zero **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10781) /* FREE one ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10782) /* FREE negone ************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10783) /* FREE tx ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10784) __mpu_sbrk( -(int)(7*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10785) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10786)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10787) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10788) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 10789) /************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10790)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10791) _gen_zero( zero, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10792) _gen_one ( one, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10793) _gen_one ( negone, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10794) ei_neg ( negone, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10795)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10796) ei_copysign( s, x, one, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10797)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10798) /* ATANH( |x| > 1 ) must by InD */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10799) if( ei_cmp( s, one, nb ) > 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 10800) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 10801) /* "argument domain error" */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10802) /* return: InD */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10803) ei_ind( eiy, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10804) /***************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 10805) NOTE:
868b2b66 (kx 2024-12-20 16:11:07 +0300 10806) Функция _mtherr() является переходником между
868b2b66 (kx 2024-12-20 16:11:07 +0300 10807) внутренним форматом и внешней,
868b2b66 (kx 2024-12-20 16:11:07 +0300 10808) переопределяемой пользователем, функцией
868b2b66 (kx 2024-12-20 16:11:07 +0300 10809) _math_error(). Кроме основных действий она
868b2b66 (kx 2024-12-20 16:11:07 +0300 10810) выставляет системную переменную errno
868b2b66 (kx 2024-12-20 16:11:07 +0300 10811) следующим образом.
868b2b66 (kx 2024-12-20 16:11:07 +0300 10812)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10813) errno = __mpu_math_errnotab[type];
868b2b66 (kx 2024-12-20 16:11:07 +0300 10814) ***************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10815) _mtherr( eiy, (__mpu_char8_t *)"acos", __DOMAIN__,
868b2b66 (kx 2024-12-20 16:11:07 +0300 10816) eiy, x, (EMUSHORT *)0, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10817) __STDOM; /* (x > 1) - produsing Domain Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10818)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10819) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10820) /* FREE t *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10821) /* FREE s *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10822) /* FREE zero **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10823) /* FREE one ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10824) /* FREE negone ************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10825) /* FREE tx ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10826) /* FREE tr ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10827) __mpu_sbrk( -(int)(8*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10828) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10829)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10830) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10831) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 10832)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10833) if( ei_cmp( x, negone, nb ) != 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 10834) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 10835) /* t = atan2( sqrt( (one-x)/(one+x) ), one ); */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10836) ei_sub( tx, one, x, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10837) ei_add( tr, one, x, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10838) ei_div( tx, tx, tr, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10839) ei_sqrt( tx, tx, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10840) ei_atan2( t, tx, one, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10841) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 10842) else
868b2b66 (kx 2024-12-20 16:11:07 +0300 10843) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 10844) ei_atan2( t, one, zero, nb ); /* t = PI/2; */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10845) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 10846)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10847) ei_add( eiy, t, t, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10848)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10849) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10850) /* FREE t *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10851) /* FREE s *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10852) /* FREE zero **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10853) /* FREE one ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10854) /* FREE negone ************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10855) /* FREE tx ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10856) /* FREE tr ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10857) __mpu_sbrk( -(int)(8*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10858) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10859)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10860) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10861)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10862) } /* End of ei_acos() */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10863)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10864)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10865) static void __ei_pow__P( EMUSHORT *eic, EMUSHORT *eix, EMUSHORT *eiy, int nb )
868b2b66 (kx 2024-12-20 16:11:07 +0300 10866) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 10867) EMUSHORT *s_a = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 10868) *s_b = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 10869) *t_a = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 10870) *t_b = NULL;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10871)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10872) Double s, t;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10873)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10874) EMUSHORT *x = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 10875) *y = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 10876) *zero = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 10877) *one = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 10878) *big = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 10879) *tx = NULL, /* temp */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10880) *ty = NULL; /* temp */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10881) int np;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10882)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10883)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10884) if( nb < NBR_32 || nb > MPU_MATH_FN_LIMIT )
868b2b66 (kx 2024-12-20 16:11:07 +0300 10885) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 10886) /* error: Invalid size of operand(s) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10887) __real_error_no = __R_ESIZE__;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10888) __STIND; /* Set REAL ind-produsing operation Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10889) /* ei_ind( eic, nb ); *//* Invalid NB */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10890) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10891) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 10892)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10893) /*******************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 10894) Hight Precision for r32, r64.
868b2b66 (kx 2024-12-20 16:11:07 +0300 10895) *******************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10896) if( nb < NBR_128 ) nb = NBR_128;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10897)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10898) np = internal_np( nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10899)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10900) /*** Allocate memory for s_a, s_b, t_a, t_b . ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10901) s_a = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10902) if( !s_a )
868b2b66 (kx 2024-12-20 16:11:07 +0300 10903) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 10904) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10905) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10906) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 10907)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10908) s_b = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10909) if( !s_b )
868b2b66 (kx 2024-12-20 16:11:07 +0300 10910) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 10911) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10912)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10913) /* FREE s_a ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10914) __mpu_sbrk( -(int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10915) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10916)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10917) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10918) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 10919)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10920) t_a = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10921) if( !t_a )
868b2b66 (kx 2024-12-20 16:11:07 +0300 10922) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 10923) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10924)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10925) /* FREE s_a ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10926) /* FREE s_b ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10927) __mpu_sbrk( -(int)(2*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10928) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10929)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10930) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10931) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 10932)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10933) t_b = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10934) if( !t_b )
868b2b66 (kx 2024-12-20 16:11:07 +0300 10935) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 10936) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10937)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10938) /* FREE s_a ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10939) /* FREE s_b ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10940) /* FREE t_a ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10941) __mpu_sbrk( -(int)(3*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10942) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10943)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10944) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10945) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 10946) /************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10947)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10948) /*** Allocate memory for x, y, zero, one, big, tx, ty . *****/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10949) x = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10950) if( !x )
868b2b66 (kx 2024-12-20 16:11:07 +0300 10951) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 10952) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10953)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10954) /* FREE s_a ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10955) /* FREE s_b ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10956) /* FREE t_a ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10957) /* FREE t_b ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10958) __mpu_sbrk( -(int)(4*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10959) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10960)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10961) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10962) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 10963)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10964) y = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10965) if( !y )
868b2b66 (kx 2024-12-20 16:11:07 +0300 10966) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 10967) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10968)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10969) /* FREE s_a ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10970) /* FREE s_b ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10971) /* FREE t_a ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10972) /* FREE t_b ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10973) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10974) __mpu_sbrk( -(int)(5*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10975) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10976)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10977) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10978) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 10979)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10980) zero = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10981) if( !zero )
868b2b66 (kx 2024-12-20 16:11:07 +0300 10982) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 10983) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10984)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10985) /* FREE s_a ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10986) /* FREE s_b ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10987) /* FREE t_a ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10988) /* FREE t_b ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10989) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10990) /* FREE y *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10991) __mpu_sbrk( -(int)(6*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10992) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10993)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10994) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10995) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 10996)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10997) one = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10998) if( !one )
868b2b66 (kx 2024-12-20 16:11:07 +0300 10999) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 11000) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11001)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11002) /* FREE s_a ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11003) /* FREE s_b ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11004) /* FREE t_a ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11005) /* FREE t_b ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11006) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11007) /* FREE y *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11008) /* FREE zero **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11009) __mpu_sbrk( -(int)(7*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11010) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11011)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11012) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11013) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 11014)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11015) big = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11016) if( !big )
868b2b66 (kx 2024-12-20 16:11:07 +0300 11017) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 11018) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11019)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11020) /* FREE s_a ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11021) /* FREE s_b ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11022) /* FREE t_a ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11023) /* FREE t_b ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11024) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11025) /* FREE y *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11026) /* FREE zero **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11027) /* FREE one ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11028) __mpu_sbrk( -(int)(8*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11029) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11030)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11031) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11032) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 11033)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11034) tx = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11035) if( !tx )
868b2b66 (kx 2024-12-20 16:11:07 +0300 11036) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 11037) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11038)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11039) /* FREE s_a ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11040) /* FREE s_b ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11041) /* FREE t_a ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11042) /* FREE t_b ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11043) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11044) /* FREE y *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11045) /* FREE zero **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11046) /* FREE one ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11047) /* FREE big ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11048) __mpu_sbrk( -(int)(9*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11049) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11050)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11051) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11052) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 11053)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11054) ty = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11055) if( !ty )
868b2b66 (kx 2024-12-20 16:11:07 +0300 11056) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 11057) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11058)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11059) /* FREE s_a ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11060) /* FREE s_b ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11061) /* FREE t_a ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11062) /* FREE t_b ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11063) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11064) /* FREE y *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11065) /* FREE zero **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11066) /* FREE one ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11067) /* FREE big ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11068) /* FREE tx ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11069) __mpu_sbrk( -(int)(10*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11070) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11071)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11072) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11073) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 11074) /************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11075)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11076) s.a = s_a;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11077) s.b = s_b;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11078) t.a = t_a;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11079) t.b = t_b;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11080)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11081) _gen_zero( zero, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11082) _gen_one ( one, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11083)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11084) /*********************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 11085) big : big = 1/(small^2);
868b2b66 (kx 2024-12-20 16:11:07 +0300 11086) *********************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11087) ei_div( big, one, _get_epsilon_ptr( nb ), nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11088)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11089) ei_copy( x, eix, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11090) ei_copy( y, eiy, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11091)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11092) if( ei_cmp( x, zero, nb ) == 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 11093) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 11094) if( ei_cmp( y, zero, nb ) > 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 11095) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 11096) /* #(12) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11097) ei_copy( eic, zero, nb ); /* Not set the FLAGS */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11098)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11099) /* FREE s_a ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11100) /* FREE s_b ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11101) /* FREE t_a ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11102) /* FREE t_b ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11103) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11104) /* FREE y *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11105) /* FREE zero **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11106) /* FREE one ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11107) /* FREE big ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11108) /* FREE tx ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11109) /* FREE ty ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11110) __mpu_sbrk( -(int)(11*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11111) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11112)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11113) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11114) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 11115) else
868b2b66 (kx 2024-12-20 16:11:07 +0300 11116) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 11117) /* (14) DIV_BY_ZERO */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11118) /* "function singularity" */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11119) /* return: +Infinity */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11120) ei_infin( eic, (unsigned)0, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11121) /***************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 11122) NOTE:
868b2b66 (kx 2024-12-20 16:11:07 +0300 11123) Функция _mtherr() является переходником между
868b2b66 (kx 2024-12-20 16:11:07 +0300 11124) внутренним форматом и внешней,
868b2b66 (kx 2024-12-20 16:11:07 +0300 11125) переопределяемой пользователем, функцией
868b2b66 (kx 2024-12-20 16:11:07 +0300 11126) _math_error(). Кроме основных действий она
868b2b66 (kx 2024-12-20 16:11:07 +0300 11127) выставляет системную переменную errno
868b2b66 (kx 2024-12-20 16:11:07 +0300 11128) следующим образом.
868b2b66 (kx 2024-12-20 16:11:07 +0300 11129)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11130) errno = __mpu_math_errnotab[type];
868b2b66 (kx 2024-12-20 16:11:07 +0300 11131) ***************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11132) _mtherr( eic, (__mpu_char8_t *)"pow", __SING__,
868b2b66 (kx 2024-12-20 16:11:07 +0300 11133) eic, x, y, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11134) __STSNG; /* +0^(-(y!=0,NaN)) - produsing Sing Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11135)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11136) /* FREE s_a ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11137) /* FREE s_b ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11138) /* FREE t_a ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11139) /* FREE t_b ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11140) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11141) /* FREE y *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11142) /* FREE zero **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11143) /* FREE one ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11144) /* FREE big ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11145) /* FREE tx ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11146) /* FREE ty ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11147) __mpu_sbrk( -(int)(11*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11148) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11149)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11150) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11151) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 11152)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11153) } /* End if( x == zero ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11154)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11155) if( ei_cmp( x, one, nb ) == 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 11156) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 11157) ei_copy( eic, one, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11158)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11159) /* FREE s_a ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11160) /* FREE s_b ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11161) /* FREE t_a ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11162) /* FREE t_b ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11163) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11164) /* FREE y *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11165) /* FREE zero **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11166) /* FREE one ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11167) /* FREE big ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11168) /* FREE tx ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11169) /* FREE ty ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11170) __mpu_sbrk( -(int)(11*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11171) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11172)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11173) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11174) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 11175)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11176) if( ei_isinfin( x, nb ) )
868b2b66 (kx 2024-12-20 16:11:07 +0300 11177) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 11178) if( ei_cmp( y, zero, nb ) < 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 11179) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 11180) /* #(18) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11181) ei_copy( eic, zero, nb ); /* Not set the FLAGS */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11182)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11183) /* FREE s_a ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11184) /* FREE s_b ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11185) /* FREE t_a ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11186) /* FREE t_b ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11187) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11188) /* FREE y *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11189) /* FREE zero **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11190) /* FREE one ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11191) /* FREE big ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11192) /* FREE tx ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11193) /* FREE ty ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11194) __mpu_sbrk( -(int)(11*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11195) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11196)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11197) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11198) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 11199) else
868b2b66 (kx 2024-12-20 16:11:07 +0300 11200) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 11201) /* #(17) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11202) /* "overflow range error" */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11203) /* "Result too large" */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11204) /* return: +Infinity */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11205) ei_infin( eic, (unsigned)0, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11206) /***************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 11207) NOTE:
868b2b66 (kx 2024-12-20 16:11:07 +0300 11208) Функция _mtherr() является переходником между
868b2b66 (kx 2024-12-20 16:11:07 +0300 11209) внутренним форматом и внешней,
868b2b66 (kx 2024-12-20 16:11:07 +0300 11210) переопределяемой пользователем, функцией
868b2b66 (kx 2024-12-20 16:11:07 +0300 11211) _math_error(). Кроме основных действий она
868b2b66 (kx 2024-12-20 16:11:07 +0300 11212) выставляет системную переменную errno
868b2b66 (kx 2024-12-20 16:11:07 +0300 11213) следующим образом.
868b2b66 (kx 2024-12-20 16:11:07 +0300 11214)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11215) errno = __mpu_math_errnotab[type];
868b2b66 (kx 2024-12-20 16:11:07 +0300 11216) ***************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11217) _mtherr( eic, (__mpu_char8_t *)"pow", __OVERFLOW__,
868b2b66 (kx 2024-12-20 16:11:07 +0300 11218) eic, x, y, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11219) __STOVF; /* produsing Overflow Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11220)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11221) /* FREE s_a ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11222) /* FREE s_b ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11223) /* FREE t_a ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11224) /* FREE t_b ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11225) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11226) /* FREE y *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11227) /* FREE zero **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11228) /* FREE one ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11229) /* FREE big ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11230) /* FREE tx ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11231) /* FREE ty ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11232) __mpu_sbrk( -(int)(11*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11233) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11234)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11235) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11236) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 11237)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11238) } /* End if( x == Infinity ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11239)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11240) if( ei_cmp( y, big, nb ) >= 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 11241) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 11242) if( ei_cmp( x, one, nb ) < 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 11243) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 11244) /* "underflow range error" */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11245) /* return: ZERO */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11246) ei_copy( eic, zero, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11247) /***************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 11248) NOTE:
868b2b66 (kx 2024-12-20 16:11:07 +0300 11249) Функция _mtherr() является переходником между
868b2b66 (kx 2024-12-20 16:11:07 +0300 11250) внутренним форматом и внешней,
868b2b66 (kx 2024-12-20 16:11:07 +0300 11251) переопределяемой пользователем, функцией
868b2b66 (kx 2024-12-20 16:11:07 +0300 11252) _math_error(). Кроме основных действий она
868b2b66 (kx 2024-12-20 16:11:07 +0300 11253) выставляет системную переменную errno
868b2b66 (kx 2024-12-20 16:11:07 +0300 11254) следующим образом.
868b2b66 (kx 2024-12-20 16:11:07 +0300 11255)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11256) errno = __mpu_math_errnotab[type];
868b2b66 (kx 2024-12-20 16:11:07 +0300 11257) ***************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11258) _mtherr( eic, (__mpu_char8_t *)"pow", __UNDERFLOW__,
868b2b66 (kx 2024-12-20 16:11:07 +0300 11259) eic, x, y, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11260) __STUDF; /* produsing Underflow Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11261)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11262) /* FREE s_a ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11263) /* FREE s_b ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11264) /* FREE t_a ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11265) /* FREE t_b ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11266) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11267) /* FREE y *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11268) /* FREE zero **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11269) /* FREE one ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11270) /* FREE big ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11271) /* FREE tx ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11272) /* FREE ty ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11273) __mpu_sbrk( -(int)(11*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11274) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11275)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11276) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11277) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 11278) else
868b2b66 (kx 2024-12-20 16:11:07 +0300 11279) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 11280) /* "overflow range error" */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11281) /* "Result too large" */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11282) /* return: +Infinity */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11283) ei_infin( eic, (unsigned)0, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11284) /***************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 11285) NOTE:
868b2b66 (kx 2024-12-20 16:11:07 +0300 11286) Функция _mtherr() является переходником между
868b2b66 (kx 2024-12-20 16:11:07 +0300 11287) внутренним форматом и внешней,
868b2b66 (kx 2024-12-20 16:11:07 +0300 11288) переопределяемой пользователем, функцией
868b2b66 (kx 2024-12-20 16:11:07 +0300 11289) _math_error(). Кроме основных действий она
868b2b66 (kx 2024-12-20 16:11:07 +0300 11290) выставляет системную переменную errno
868b2b66 (kx 2024-12-20 16:11:07 +0300 11291) следующим образом.
868b2b66 (kx 2024-12-20 16:11:07 +0300 11292)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11293) errno = __mpu_math_errnotab[type];
868b2b66 (kx 2024-12-20 16:11:07 +0300 11294) ***************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11295) _mtherr( eic, (__mpu_char8_t *)"pow", __OVERFLOW__,
868b2b66 (kx 2024-12-20 16:11:07 +0300 11296) eic, x, y, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11297) __STOVF; /* produsing Overflow Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11298)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11299) /* FREE s_a ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11300) /* FREE s_b ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11301) /* FREE t_a ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11302) /* FREE t_b ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11303) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11304) /* FREE y *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11305) /* FREE zero **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11306) /* FREE one ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11307) /* FREE big ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11308) /* FREE tx ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11309) /* FREE ty ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11310) __mpu_sbrk( -(int)(11*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11311) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11312)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11313) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11314) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 11315)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11316) } /* End if( y >= big ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11317)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11318)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11319) /*********************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 11320) Return exp( y*log( x ) ), using simulated extended
868b2b66 (kx 2024-12-20 16:11:07 +0300 11321) precision for the log() and the multiply.
868b2b66 (kx 2024-12-20 16:11:07 +0300 11322) *********************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11323) __ei_log__D( s, x, nb ); /* s = log__D( x ); */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11324) ei_copy( t.a, y, nb ); /* t.a = y; */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11325) __ei_TRUNC( t.a, nb ); /* _TRUNC( t.a ); */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11326) ei_sub( t.b, y, t.a, nb ); /* t.b = y - t.a; */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11327) ei_mul( ty, s.b, y, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11328) ei_mul( tx, t.b, s.a, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11329) ei_add( t.b, ty, tx, nb ); /* t.b = s.b*y + t.b*s.a; */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11330) ei_mul( t.a, t.a, s.a, nb ); /* t.a *= s.a; */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11331) ei_add( s.a, t.a, t.b, nb ); /* s.a = t.a + t.b; */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11332) ei_sub( tx, t.a, s.a, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11333) ei_add( s.b, tx, t.b, nb ); /* s.b = (t.a - s.a) + t.b; */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11334)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11335) /********* return( __ei_exp__D( s.a, s.b ) ); **********/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11336) __ei_exp__D( eic, s.a, s.b, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11337)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11338)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11339) /* FREE s_a ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11340) /* FREE s_b ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11341) /* FREE t_a ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11342) /* FREE t_b ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11343) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11344) /* FREE y *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11345) /* FREE zero **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11346) /* FREE one ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11347) /* FREE big ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11348) /* FREE tx ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11349) /* FREE ty ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11350) __mpu_sbrk( -(int)(11*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11351) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11352)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11353) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11354)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11355) } /* End of __ei_pow__P() */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11356)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11357)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11358) void ei_pow( EMUSHORT *eic, EMUSHORT *eix, EMUSHORT *eiy, int nb )
868b2b66 (kx 2024-12-20 16:11:07 +0300 11359) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 11360)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11361) Description : ei_pow() Работает с
868b2b66 (kx 2024-12-20 16:11:07 +0300 11362) internal e-type data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300 11363)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11364) Concepts : EI_POW( EIC, EIX, EIY) RETURN EIC = EIX^EIY.
868b2b66 (kx 2024-12-20 16:11:07 +0300 11365)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11366) METHOD : 1. Compute and return log(x) in three pieces:
868b2b66 (kx 2024-12-20 16:11:07 +0300 11367)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11368) log(x) = n*ln2 + hi + lo,
868b2b66 (kx 2024-12-20 16:11:07 +0300 11369)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11370) where n is an integer.
868b2b66 (kx 2024-12-20 16:11:07 +0300 11371) 2. Perform y*log(x) by simulating
868b2b66 (kx 2024-12-20 16:11:07 +0300 11372) muti-precision arithmetic and return
868b2b66 (kx 2024-12-20 16:11:07 +0300 11373) the answer in three pieces:
868b2b66 (kx 2024-12-20 16:11:07 +0300 11374)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11375) y*log(x) = m*ln2 + hi + lo,
868b2b66 (kx 2024-12-20 16:11:07 +0300 11376)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11377) where m is an integer.
868b2b66 (kx 2024-12-20 16:11:07 +0300 11378) 3. Return
868b2b66 (kx 2024-12-20 16:11:07 +0300 11379) x^y = exp(y*log(x)) = 2^m*(exp(hi+lo)).
868b2b66 (kx 2024-12-20 16:11:07 +0300 11380)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11381) ACCURACY : In the absence of rounding error,
868b2b66 (kx 2024-12-20 16:11:07 +0300 11382) the appriximation has absolute error
868b2b66 (kx 2024-12-20 16:11:07 +0300 11383) less than EPSILON [see: mpu-floatp.h].
868b2b66 (kx 2024-12-20 16:11:07 +0300 11384)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11385) NOTE :
868b2b66 (kx 2024-12-20 16:11:07 +0300 11386)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11387) SPECIAL CASES :
868b2b66 (kx 2024-12-20 16:11:07 +0300 11388) ====================================================================
868b2b66 (kx 2024-12-20 16:11:07 +0300 11389) | |
868b2b66 (kx 2024-12-20 16:11:07 +0300 11390) X | Y | RESULT
868b2b66 (kx 2024-12-20 16:11:07 +0300 11391) | |
868b2b66 (kx 2024-12-20 16:11:07 +0300 11392) ====================|====================|==========================
868b2b66 (kx 2024-12-20 16:11:07 +0300 11393) #( 1)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11394) (anything) ^ 0 = 1 ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11395) (anything) ^ 1 = itself;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11396) (anything) ^ NaN = NaN;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11397) --------------------|--------------------|--------------------------
868b2b66 (kx 2024-12-20 16:11:07 +0300 11398) #( 4)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11399) NaN ^ (anything
868b2b66 (kx 2024-12-20 16:11:07 +0300 11400) except 0) = NaN;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11401) --------------------|--------------------|--------------------------
868b2b66 (kx 2024-12-20 16:11:07 +0300 11402) #( 5)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11403) +(anything > 1) ^ +INF = +INF;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11404) -(anything > 1) ^ +INF = NaN;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11405) +-(anything > 1) ^ -INF = +0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11406) +-(anything < 1) ^ +INF = +0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11407) +(anything < 1) ^ -INF = +INF;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11408) -(anything < 1) ^ -INF = NaN;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11409) +-1 ^ +-INF = -InD and signal DOMAIN;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11410) --------------------|--------------------|--------------------------
868b2b66 (kx 2024-12-20 16:11:07 +0300 11411) #(12)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11412) +0 ^ +(anything
868b2b66 (kx 2024-12-20 16:11:07 +0300 11413) except 0, NaN) = +0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11414) --------------------|--------------------|--------------------------
868b2b66 (kx 2024-12-20 16:11:07 +0300 11415) #(13)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11416) -0 ^ +(anything
868b2b66 (kx 2024-12-20 16:11:07 +0300 11417) except 0, NaN,
868b2b66 (kx 2024-12-20 16:11:07 +0300 11418) odd integer) = +0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11419) --------------------|--------------------|--------------------------
868b2b66 (kx 2024-12-20 16:11:07 +0300 11420) #(14)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11421) +0 ^ -(anything
868b2b66 (kx 2024-12-20 16:11:07 +0300 11422) except 0, NaN) = +INF
868b2b66 (kx 2024-12-20 16:11:07 +0300 11423) and signal DIV-BY-ZERO;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11424) --------------------|--------------------|--------------------------
868b2b66 (kx 2024-12-20 16:11:07 +0300 11425) #(15)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11426) -0 ^ -(anything
868b2b66 (kx 2024-12-20 16:11:07 +0300 11427) except 0, NaN,
868b2b66 (kx 2024-12-20 16:11:07 +0300 11428) odd integer) = +INF with signal;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11429) --------------------|--------------------|--------------------------
868b2b66 (kx 2024-12-20 16:11:07 +0300 11430) #(16)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11431) -0 ^ (odd integer) = -( +0^(odd integer) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11432) --------------------|--------------------|--------------------------
868b2b66 (kx 2024-12-20 16:11:07 +0300 11433) #(17)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11434) +INF ^ +(anything
868b2b66 (kx 2024-12-20 16:11:07 +0300 11435) except 0, NaN) = +INF;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11436) --------------------|--------------------|--------------------------
868b2b66 (kx 2024-12-20 16:11:07 +0300 11437) #(18)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11438) +INF ^ -(anything
868b2b66 (kx 2024-12-20 16:11:07 +0300 11439) except 0, NaN) = +0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11440) --------------------|--------------------|--------------------------
868b2b66 (kx 2024-12-20 16:11:07 +0300 11441) #(19)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11442) -INF ^ (odd integer) = -( +INF^(odd integer) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11443) -INF ^ (even integer) = ( +INF^(even integer) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11444) --------------------|--------------------|--------------------------
868b2b66 (kx 2024-12-20 16:11:07 +0300 11445) #(21)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11446) -INF ^ -(anything
868b2b66 (kx 2024-12-20 16:11:07 +0300 11447) except NaN,
868b2b66 (kx 2024-12-20 16:11:07 +0300 11448) integer) = NaN with signal;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11449) --------------------|--------------------|--------------------------
868b2b66 (kx 2024-12-20 16:11:07 +0300 11450) #(22)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11451) -(x=anything) ^ (k=integer) = (-1)^k * (x^k);
868b2b66 (kx 2024-12-20 16:11:07 +0300 11452) -(anything except 0) ^ (non-integer) = NaN with signal;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11453)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11454) ====================================================================
868b2b66 (kx 2024-12-20 16:11:07 +0300 11455)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11456) Use Global Variable:
868b2b66 (kx 2024-12-20 16:11:07 +0300 11457)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11458) Use Functions : ei_drem( eiy, eix, eid, nb ); | this file
868b2b66 (kx 2024-12-20 16:11:07 +0300 11459) __ei_pow__P( eic, eix, eiy, nb ); | this file
868b2b66 (kx 2024-12-20 16:11:07 +0300 11460) ei_copy( eiy, eix, nb ); | mpu-real.c
868b2b66 (kx 2024-12-20 16:11:07 +0300 11461) .
868b2b66 (kx 2024-12-20 16:11:07 +0300 11462) .
868b2b66 (kx 2024-12-20 16:11:07 +0300 11463) .
868b2b66 (kx 2024-12-20 16:11:07 +0300 11464)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11465) Parameters : EMUSHORT *eic; - указатель на
868b2b66 (kx 2024-12-20 16:11:07 +0300 11466) internal e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300 11467) data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300 11468) TARGET;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11469) EMUSHORT *eix; - указатель на
868b2b66 (kx 2024-12-20 16:11:07 +0300 11470) internal e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300 11471) data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300 11472) SOURCE;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11473) EMUSHORT *eiy; - указатель на
868b2b66 (kx 2024-12-20 16:11:07 +0300 11474) internal e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300 11475) data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300 11476) SOURCE;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11477) int nb; - количество бит в
868b2b66 (kx 2024-12-20 16:11:07 +0300 11478) external e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300 11479) data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300 11480)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11481) Return : [void]
868b2b66 (kx 2024-12-20 16:11:07 +0300 11482)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11483) ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11484) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 11485) EMUSHORT *x = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 11486) *y = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 11487) *t = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 11488) *zero = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 11489) *one = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 11490) *negone = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 11491) *two = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 11492) *tx = NULL, /* temp */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11493) *ty = NULL; /* temp */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11494) int np;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11495)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11496)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11497) if( nb < NBR_32 || nb > MPU_MATH_FN_LIMIT )
868b2b66 (kx 2024-12-20 16:11:07 +0300 11498) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 11499) /* error: Invalid size of operand(s) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11500) __real_invalid_size( (__mpu_char8_t *)"pow" );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11501) /* ei_ind( eic, nb ); *//* Invalid NB */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11502) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11503) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 11504)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11505) /*******************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 11506) Hight Precision for r32, r64.
868b2b66 (kx 2024-12-20 16:11:07 +0300 11507) *******************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11508) if( nb < NBR_128 ) nb = NBR_128;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11509)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11510) np = internal_np( nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11511)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11512) /*** Allocate memory for x, y . *****************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11513) x = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11514) if( !x )
868b2b66 (kx 2024-12-20 16:11:07 +0300 11515) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 11516) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11517) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11518) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 11519)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11520) y = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11521) if( !y )
868b2b66 (kx 2024-12-20 16:11:07 +0300 11522) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 11523) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11524)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11525) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11526) __mpu_sbrk( -(int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11527) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11528)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11529) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11530) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 11531) /************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11532)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11533) ei_copy( x, eix, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11534) ei_copy( y, eiy, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11535)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11536) if( ei_isind( eix, nb ) || ei_isind( eiy, nb ) )
868b2b66 (kx 2024-12-20 16:11:07 +0300 11537) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 11538) /* "argument domain error" */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11539) /* return: InD */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11540) ei_ind( eic, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11541) /***************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 11542) NOTE:
868b2b66 (kx 2024-12-20 16:11:07 +0300 11543) Функция _mtherr() является переходником между
868b2b66 (kx 2024-12-20 16:11:07 +0300 11544) внутренним форматом и внешней,
868b2b66 (kx 2024-12-20 16:11:07 +0300 11545) переопределяемой пользователем, функцией
868b2b66 (kx 2024-12-20 16:11:07 +0300 11546) _math_error(). Кроме основных действий она
868b2b66 (kx 2024-12-20 16:11:07 +0300 11547) выставляет системную переменную errno
868b2b66 (kx 2024-12-20 16:11:07 +0300 11548) следующим образом.
868b2b66 (kx 2024-12-20 16:11:07 +0300 11549)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11550) errno = __mpu_math_errnotab[type];
868b2b66 (kx 2024-12-20 16:11:07 +0300 11551) ***************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11552) _mtherr( eic, (__mpu_char8_t *)"pow", __DOMAIN__,
868b2b66 (kx 2024-12-20 16:11:07 +0300 11553) eic, x, y, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11554) __STDOM; /* InD - produsing Domain Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11555)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11556) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11557) /* FREE y *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11558) __mpu_sbrk( -(int)(2*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11559) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11560)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11561) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11562) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 11563)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11564) /*** Allocate memory for t, zero, one, negone, two . ********/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11565) t = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11566) if( !t )
868b2b66 (kx 2024-12-20 16:11:07 +0300 11567) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 11568) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11569)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11570) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11571) /* FREE y *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11572) __mpu_sbrk( -(int)(2*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11573) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11574)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11575) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11576) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 11577)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11578) zero = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11579) if( !zero )
868b2b66 (kx 2024-12-20 16:11:07 +0300 11580) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 11581) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11582)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11583) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11584) /* FREE y *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11585) /* FREE t *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11586) __mpu_sbrk( -(int)(3*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11587) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11588)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11589) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11590) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 11591)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11592) one = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11593) if( !one )
868b2b66 (kx 2024-12-20 16:11:07 +0300 11594) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 11595) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11596)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11597) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11598) /* FREE y *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11599) /* FREE t *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11600) /* FREE zero **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11601) __mpu_sbrk( -(int)(4*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11602) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11603)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11604) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11605) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 11606)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11607) negone = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11608) if( !negone )
868b2b66 (kx 2024-12-20 16:11:07 +0300 11609) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 11610) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11611)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11612) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11613) /* FREE y *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11614) /* FREE t *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11615) /* FREE zero **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11616) /* FREE one ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11617) __mpu_sbrk( -(int)(5*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11618) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11619)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11620) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11621) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 11622)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11623) two = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11624) if( !two )
868b2b66 (kx 2024-12-20 16:11:07 +0300 11625) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 11626) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11627)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11628) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11629) /* FREE y *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11630) /* FREE t *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11631) /* FREE zero **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11632) /* FREE one ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11633) /* FREE negone ************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11634) __mpu_sbrk( -(int)(6*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11635) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11636)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11637) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11638) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 11639) /************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11640)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11641) /*** Allocate memory for tx, ty . ***************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11642) tx = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11643) if( !tx )
868b2b66 (kx 2024-12-20 16:11:07 +0300 11644) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 11645) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11646)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11647) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11648) /* FREE y *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11649) /* FREE t *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11650) /* FREE zero **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11651) /* FREE one ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11652) /* FREE negone ************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11653) /* FREE two ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11654) __mpu_sbrk( -(int)(7*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11655) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11656)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11657) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11658) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 11659)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11660) ty = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11661) if( !ty )
868b2b66 (kx 2024-12-20 16:11:07 +0300 11662) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 11663) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11664)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11665) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11666) /* FREE y *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11667) /* FREE t *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11668) /* FREE zero **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11669) /* FREE one ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11670) /* FREE negone ************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11671) /* FREE two ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11672) /* FREE tx ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11673) __mpu_sbrk( -(int)(8*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11674) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11675)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11676) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11677) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 11678) /************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11679)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11680)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11681) _gen_zero( zero, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11682) _gen_one ( one, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11683) _gen_two ( two, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11684) _gen_one ( negone, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11685) ei_neg ( negone, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11686)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11687)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11688) if( ei_cmp( y, zero, nb ) == 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 11689) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 11690) /* #( 1) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11691) ei_copy( eic, one, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11692)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11693) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11694) /* FREE y *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11695) /* FREE t *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11696) /* FREE zero **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11697) /* FREE one ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11698) /* FREE negone ************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11699) /* FREE two ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11700) /* FREE tx ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11701) /* FREE ty ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11702) __mpu_sbrk( -(int)(9*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11703) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11704)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11705) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11706) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 11707) else if( (ei_cmp( y, one, nb ) == 0) || ei_isnans( x, nb ) )
868b2b66 (kx 2024-12-20 16:11:07 +0300 11708) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 11709) /* #( 2) || #( 4) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11710) ei_copy( eic, x, nb ); /* Not set the FLAGS */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11711)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11712) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11713) /* FREE y *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11714) /* FREE t *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11715) /* FREE zero **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11716) /* FREE one ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11717) /* FREE negone ************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11718) /* FREE two ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11719) /* FREE tx ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11720) /* FREE ty ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11721) __mpu_sbrk( -(int)(9*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11722) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11723)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11724) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11725) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 11726) else if( ei_isnans( y, nb ) )
868b2b66 (kx 2024-12-20 16:11:07 +0300 11727) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 11728) /* #( 3) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11729) ei_copy( eic, y, nb ); /* Not set the FLAGS */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11730)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11731) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11732) /* FREE y *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11733) /* FREE t *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11734) /* FREE zero **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11735) /* FREE one ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11736) /* FREE negone ************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11737) /* FREE two ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11738) /* FREE tx ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11739) /* FREE ty ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11740) __mpu_sbrk( -(int)(9*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11741) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11742)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11743) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11744) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 11745) else if( ei_isinfin( eiy, nb ) )
868b2b66 (kx 2024-12-20 16:11:07 +0300 11746) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 11747) ei_copy( t, x, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11748) if( ei_cmp( t, one, nb ) == 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 11749) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 11750) /* #(11) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11751) /* +-1^+-Inf = InD; */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11752) /* "argument domain error" */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11753) /* return: InD */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11754) ei_ind( eic, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11755) /***************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 11756) NOTE:
868b2b66 (kx 2024-12-20 16:11:07 +0300 11757) Функция _mtherr() является переходником между
868b2b66 (kx 2024-12-20 16:11:07 +0300 11758) внутренним форматом и внешней,
868b2b66 (kx 2024-12-20 16:11:07 +0300 11759) переопределяемой пользователем, функцией
868b2b66 (kx 2024-12-20 16:11:07 +0300 11760) _math_error(). Кроме основных действий она
868b2b66 (kx 2024-12-20 16:11:07 +0300 11761) выставляет системную переменную errno
868b2b66 (kx 2024-12-20 16:11:07 +0300 11762) следующим образом.
868b2b66 (kx 2024-12-20 16:11:07 +0300 11763)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11764) errno = __mpu_math_errnotab[type];
868b2b66 (kx 2024-12-20 16:11:07 +0300 11765) ***************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11766) _mtherr( eic, (__mpu_char8_t *)"pow", __DOMAIN__,
868b2b66 (kx 2024-12-20 16:11:07 +0300 11767) eic, x, y, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11768) __STDOM; /* InD - produsing Domain Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11769)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11770) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11771) /* FREE y *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11772) /* FREE t *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11773) /* FREE zero **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11774) /* FREE one ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11775) /* FREE negone ************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11776) /* FREE two ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11777) /* FREE tx ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11778) /* FREE ty ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11779) __mpu_sbrk( -(int)(9*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11780) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11781)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11782) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11783) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 11784) else if( ei_cmp( t, one, nb ) > 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 11785) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 11786) if( ei_cmp( y, zero, nb ) < 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 11787) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 11788) /* #( 7) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11789) ei_copy( eic, zero, nb ); /* Not set the FLAGS */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11790)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11791) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11792) /* FREE y *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11793) /* FREE t *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11794) /* FREE zero **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11795) /* FREE one ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11796) /* FREE negone ************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11797) /* FREE two ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11798) /* FREE tx ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11799) /* FREE ty ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11800) __mpu_sbrk( -(int)(9*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11801) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11802)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11803) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11804) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 11805) else if( ei_cmp( x, zero, nb ) < 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 11806) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 11807) /* #( 6) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11808) /* raise inexact flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11809) ei_nanmax( eic, (unsigned)0, nb ); /* Not set the FLAGS */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11810)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11811) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11812) /* FREE y *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11813) /* FREE t *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11814) /* FREE zero **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11815) /* FREE one ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11816) /* FREE negone ************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11817) /* FREE two ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11818) /* FREE tx ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11819) /* FREE ty ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11820) __mpu_sbrk( -(int)(9*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11821) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11822)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11823) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11824) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 11825) else /* ( x >= zero ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11826) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 11827) /* #( 5) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11828) ei_copy( eic, y, nb ); /* Not set the FLAGS */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11829) /* NOTE: y == +Infinity */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11830)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11831) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11832) /* FREE y *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11833) /* FREE t *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11834) /* FREE zero **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11835) /* FREE one ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11836) /* FREE negone ************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11837) /* FREE two ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11838) /* FREE tx ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11839) /* FREE ty ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11840) __mpu_sbrk( -(int)(9*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11841) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11842)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11843) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11844) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 11845)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11846) } /* End if( |x| > one ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11847) else /* ( |x| < one ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11848) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 11849) if( ei_cmp( y, zero, nb ) > 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 11850) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 11851) /* #( 8) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11852) ei_copy( eic, zero, nb ); /* Not set the FLAGS */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11853)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11854) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11855) /* FREE y *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11856) /* FREE t *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11857) /* FREE zero **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11858) /* FREE one ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11859) /* FREE negone ************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11860) /* FREE two ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11861) /* FREE tx ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11862) /* FREE ty ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11863) __mpu_sbrk( -(int)(9*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11864) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11865)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11866) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11867) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 11868) else if( ei_cmp( x, zero, nb ) < 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 11869) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 11870) /* #(10) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11871) /* raise inexact flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11872) ei_nanmax( eic, (unsigned)0, nb ); /* Not set the FLAGS */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11873) /***************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 11874) NOTE:
868b2b66 (kx 2024-12-20 16:11:07 +0300 11875) Функция _mtherr() является переходником между
868b2b66 (kx 2024-12-20 16:11:07 +0300 11876) внутренним форматом и внешней,
868b2b66 (kx 2024-12-20 16:11:07 +0300 11877) переопределяемой пользователем, функцией
868b2b66 (kx 2024-12-20 16:11:07 +0300 11878) _math_error(). Кроме основных действий она
868b2b66 (kx 2024-12-20 16:11:07 +0300 11879) выставляет системную переменную errno
868b2b66 (kx 2024-12-20 16:11:07 +0300 11880) следующим образом.
868b2b66 (kx 2024-12-20 16:11:07 +0300 11881)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11882) errno = __mpu_math_errnotab[type];
868b2b66 (kx 2024-12-20 16:11:07 +0300 11883) ***************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11884) _mtherr( eic, /* for No change set (EMUSHORT *)0 */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11885) (__mpu_char8_t *)"pow", __INEXACT__,
868b2b66 (kx 2024-12-20 16:11:07 +0300 11886) eic, x, y, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11887) __STINX; /* produsing Inexact Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11888)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11889) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11890) /* FREE y *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11891) /* FREE t *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11892) /* FREE zero **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11893) /* FREE one ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11894) /* FREE negone ************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11895) /* FREE two ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11896) /* FREE tx ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11897) /* FREE ty ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11898) __mpu_sbrk( -(int)(9*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11899) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11900)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11901) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11902) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 11903) else /* ( x >= zero ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11904) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 11905) /* #( 9) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11906) ei_copy( eic, y, nb ); /* Not set the FLAGS */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11907) /* NOTE: y == +Infinity */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11908) ei_neg( eic, nb ); /* return( -y ); */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11909)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11910) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11911) /* FREE y *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11912) /* FREE t *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11913) /* FREE zero **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11914) /* FREE one ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11915) /* FREE negone ************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11916) /* FREE two ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11917) /* FREE tx ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11918) /* FREE ty ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11919) __mpu_sbrk( -(int)(9*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11920) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11921)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11922) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11923) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 11924)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11925) } /* End ( |x| < one ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11926)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11927) } /* End if( eiy == +-Infinity ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11928) else /* ( eiy != +-Infinity ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11929) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 11930) if( ei_cmp( y, two, nb ) == 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 11931) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 11932) ei_mul( eic, x, x, nb ); /* return( x*x ); */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11933)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11934) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11935) /* FREE y *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11936) /* FREE t *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11937) /* FREE zero **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11938) /* FREE one ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11939) /* FREE negone ************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11940) /* FREE two ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11941) /* FREE tx ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11942) /* FREE ty ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11943) __mpu_sbrk( -(int)(9*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11944) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11945)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11946) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11947) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 11948) else if( ei_cmp( y, negone, nb ) == 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 11949) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 11950) ei_div( eic, one, x, nb ); /* return( 1.0/x ); */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11951)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11952) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11953) /* FREE y *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11954) /* FREE t *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11955) /* FREE zero **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11956) /* FREE one ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11957) /* FREE negone ************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11958) /* FREE two ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11959) /* FREE tx ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11960) /* FREE ty ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11961) __mpu_sbrk( -(int)(9*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11962) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11963)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11964) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11965)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11966) } /* End if( y == -1.0 ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11967) else /* ( y != -1.0 ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11968) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 11969) ei_copysign( tx, one, x, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11970) if( ei_cmp( tx, one, nb ) == 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 11971) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 11972) /* x > 0, my be x == +0 */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11973) __ei_pow__P( eic, x, y, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11974)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11975) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11976) /* FREE y *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11977) /* FREE t *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11978) /* FREE zero **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11979) /* FREE one ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11980) /* FREE negone ************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11981) /* FREE two ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11982) /* FREE tx ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11983) /* FREE ty ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11984) __mpu_sbrk( -(int)(9*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11985) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11986)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11987) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11988) } /* End if( x >= +0 ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11989) else /* ( x < +0 ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11990) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 11991) ei_drem( t, y, two, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11992) if( ei_cmp( t, zero, nb ) == 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 11993) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 11994) /* y - четное целое (y is an even integer) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11995) ei_neg( x, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11996) __ei_pow__P( eic, x, y, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11997)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11998) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11999) /* FREE y *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 12000) /* FREE t *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 12001) /* FREE zero **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 12002) /* FREE one ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 12003) /* FREE negone ************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 12004) /* FREE two ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 12005) /* FREE tx ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 12006) /* FREE ty ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 12007) __mpu_sbrk( -(int)(9*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 12008) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 12009)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12010) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12011) } /* End if( y == even integer ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12012) else /* ( y != even integer ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12013) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 12014) ei_copysign( ty, t, one, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 12015) if( ei_cmp( ty, one, nb ) == 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 12016) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 12017) /* y - нечетное целое (y is an odd integer) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12018) ei_neg( x, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 12019) __ei_pow__P( eic, x, y, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 12020) ei_neg( eic, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 12021)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12022) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 12023) /* FREE y *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 12024) /* FREE t *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 12025) /* FREE zero **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 12026) /* FREE one ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 12027) /* FREE negone ************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 12028) /* FREE two ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 12029) /* FREE tx ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 12030) /* FREE ty ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 12031) __mpu_sbrk( -(int)(9*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 12032) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 12033)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12034) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12035)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12036) } /* End if( y == odd integer ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12037) else /* ( y != odd integer ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12038) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 12039) /* y is not an integer */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12040) if( ei_cmp( x, zero, nb ) == 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 12041) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 12042) /* x is -0.
868b2b66 (kx 2024-12-20 16:11:07 +0300 12043) NOTE: for ei_cmp() -0.0 equals +0.0.
868b2b66 (kx 2024-12-20 16:11:07 +0300 12044) ***************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 12045) if( ei_cmp( y, zero, nb ) > 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 12046) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 12047) /* #(13) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12048) ei_neg( x, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 12049) /* return +0 */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12050) ei_copy( eic, x, nb ); /* return( -x ); */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12051)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12052) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 12053) /* FREE y *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 12054) /* FREE t *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 12055) /* FREE zero **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 12056) /* FREE one ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 12057) /* FREE negone ************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 12058) /* FREE two ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 12059) /* FREE tx ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 12060) /* FREE ty ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 12061) __mpu_sbrk( -(int)(9*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 12062) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 12063)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12064) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12065) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 12066) else
868b2b66 (kx 2024-12-20 16:11:07 +0300 12067) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 12068) /* #(15) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12069) ///////////////////////////////////////
868b2b66 (kx 2024-12-20 16:11:07 +0300 12070) //|unix|//ei_neg( x, nb ); //
868b2b66 (kx 2024-12-20 16:11:07 +0300 12071) //|unix|///* return( 1/(-x) ); */ //
868b2b66 (kx 2024-12-20 16:11:07 +0300 12072) //|unix|//ei_div( eic, one, x, nb ); //
868b2b66 (kx 2024-12-20 16:11:07 +0300 12073) ///////////////////////////////////////
868b2b66 (kx 2024-12-20 16:11:07 +0300 12074)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12075) /* "function singularity" */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12076) /* -0^(-(y!=0,NaN,odd_int)) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12077) /* return: +Infinity */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12078) ei_infin( eic, (unsigned)0, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 12079) /***************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 12080) NOTE:
868b2b66 (kx 2024-12-20 16:11:07 +0300 12081) Функция _mtherr() является переходником между
868b2b66 (kx 2024-12-20 16:11:07 +0300 12082) внутренним форматом и внешней,
868b2b66 (kx 2024-12-20 16:11:07 +0300 12083) переопределяемой пользователем, функцией
868b2b66 (kx 2024-12-20 16:11:07 +0300 12084) _math_error(). Кроме основных действий она
868b2b66 (kx 2024-12-20 16:11:07 +0300 12085) выставляет системную переменную errno
868b2b66 (kx 2024-12-20 16:11:07 +0300 12086) следующим образом.
868b2b66 (kx 2024-12-20 16:11:07 +0300 12087)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12088) errno = __mpu_math_errnotab[type];
868b2b66 (kx 2024-12-20 16:11:07 +0300 12089) ***************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 12090) _mtherr( eic, (__mpu_char8_t *)"pow", __SING__,
868b2b66 (kx 2024-12-20 16:11:07 +0300 12091) eic, x, y, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 12092) __STSNG; /* produsing Sing Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12093)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12094) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 12095) /* FREE y *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 12096) /* FREE t *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 12097) /* FREE zero **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 12098) /* FREE one ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 12099) /* FREE negone ************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 12100) /* FREE two ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 12101) /* FREE tx ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 12102) /* FREE ty ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 12103) __mpu_sbrk( -(int)(9*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 12104) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 12105)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12106) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12107) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 12108) } /* End if( x == -0 ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12109) else /* ( x != -0 ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12110) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 12111) /* #(23) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12112) /* "argument domain error" */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12113) /* return: InD */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12114) ei_ind( eic, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 12115) /***************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 12116) NOTE:
868b2b66 (kx 2024-12-20 16:11:07 +0300 12117) Функция _mtherr() является переходником между
868b2b66 (kx 2024-12-20 16:11:07 +0300 12118) внутренним форматом и внешней,
868b2b66 (kx 2024-12-20 16:11:07 +0300 12119) переопределяемой пользователем, функцией
868b2b66 (kx 2024-12-20 16:11:07 +0300 12120) _math_error(). Кроме основных действий она
868b2b66 (kx 2024-12-20 16:11:07 +0300 12121) выставляет системную переменную errno
868b2b66 (kx 2024-12-20 16:11:07 +0300 12122) следующим образом.
868b2b66 (kx 2024-12-20 16:11:07 +0300 12123)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12124) errno = __mpu_math_errnotab[type];
868b2b66 (kx 2024-12-20 16:11:07 +0300 12125) ***************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 12126) _mtherr( eic, (__mpu_char8_t *)"pow", __DOMAIN__,
868b2b66 (kx 2024-12-20 16:11:07 +0300 12127) eic, x, y, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 12128) __STDOM; /* produsing Domain Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12129)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12130) /* FREE x *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 12131) /* FREE y *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 12132) /* FREE t *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 12133) /* FREE zero **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 12134) /* FREE one ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 12135) /* FREE negone ************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 12136) /* FREE two ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 12137) /* FREE tx ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 12138) /* FREE ty ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 12139) __mpu_sbrk( -(int)(9*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 12140) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 12141)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12142) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12143)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12144) } /* End ( x != -0 ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12145)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12146) } /* End ( y != odd integer ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12147)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12148) } /* End ( y != even integer ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12149)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12150) } /* End ( x < +0 ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12151)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12152) } /* End ( y != -1.0 ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12153)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12154) } /* End ( eiy != +-Infinity ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12155)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12156) } /* End of ei_pow() */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12157)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12158)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12159) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 12160) Hide internal symbols:
868b2b66 (kx 2024-12-20 16:11:07 +0300 12161) ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 12162)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12163) __mpu_hidden_decl(ei_trunc);
868b2b66 (kx 2024-12-20 16:11:07 +0300 12164)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12165) __mpu_hidden_decl(ei_sin);
868b2b66 (kx 2024-12-20 16:11:07 +0300 12166) __mpu_hidden_decl(ei_cos);
868b2b66 (kx 2024-12-20 16:11:07 +0300 12167) __mpu_hidden_decl(ei_tan);
868b2b66 (kx 2024-12-20 16:11:07 +0300 12168)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12169) __mpu_hidden_decl(ei_log1p);
868b2b66 (kx 2024-12-20 16:11:07 +0300 12170) __mpu_hidden_decl(ei_log);
868b2b66 (kx 2024-12-20 16:11:07 +0300 12171) __mpu_hidden_decl(ei_log10);
868b2b66 (kx 2024-12-20 16:11:07 +0300 12172) __mpu_hidden_decl(ei_log2);
868b2b66 (kx 2024-12-20 16:11:07 +0300 12173)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12174) __mpu_hidden_decl(ei_expm1);
868b2b66 (kx 2024-12-20 16:11:07 +0300 12175) __mpu_hidden_decl(ei_exp);
868b2b66 (kx 2024-12-20 16:11:07 +0300 12176)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12177) __mpu_hidden_decl(ei_atan2);
868b2b66 (kx 2024-12-20 16:11:07 +0300 12178) __mpu_hidden_decl(ei_atan);
868b2b66 (kx 2024-12-20 16:11:07 +0300 12179)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12180) __mpu_hidden_decl(ei_sinh);
868b2b66 (kx 2024-12-20 16:11:07 +0300 12181) __mpu_hidden_decl(ei_cosh);
868b2b66 (kx 2024-12-20 16:11:07 +0300 12182) __mpu_hidden_decl(ei_tanh);
868b2b66 (kx 2024-12-20 16:11:07 +0300 12183)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12184) __mpu_hidden_decl(ei_asinh);
868b2b66 (kx 2024-12-20 16:11:07 +0300 12185) __mpu_hidden_decl(ei_acosh);
868b2b66 (kx 2024-12-20 16:11:07 +0300 12186) __mpu_hidden_decl(ei_atanh);
868b2b66 (kx 2024-12-20 16:11:07 +0300 12187)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12188) __mpu_hidden_decl(ei_asin);
868b2b66 (kx 2024-12-20 16:11:07 +0300 12189) __mpu_hidden_decl(ei_acos);
868b2b66 (kx 2024-12-20 16:11:07 +0300 12190)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12191) __mpu_hidden_decl(ei_pow);
868b2b66 (kx 2024-12-20 16:11:07 +0300 12192)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12193)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12194) /*
868b2b66 (kx 2024-12-20 16:11:07 +0300 12195) End of hide internal symbols.
868b2b66 (kx 2024-12-20 16:11:07 +0300 12196) ***************************************************************/