Math Processor Unit Library

libmpu – library of arithmetic functions for integer, real, and complex numbers of increased digit capacity

16 Commits   0 Branches   2 Tags
868b2b66 (kx 2024-12-20 16:11:07 +0300     1) 
868b2b66 (kx 2024-12-20 16:11:07 +0300     2) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300     3)   __MPU_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)  ***************************************************************/