_WMRTLINK double _IF_datan( double x ) /************************************/ { char add_piby2; char add_piby6; int sgnx; double tmp; #if defined(_M_IX86) if( _RWD_real87 ) return( _atan87(x) ); #endif add_piby2 = FALSE; add_piby6 = FALSE; sgnx = __sgn( x ); x = fabs( x ); if( x == 1.0 ) { /* 06-dec-88 */ x = PIby4; } else if( x > (1.0 / DBL_MIN) ) { x = PIby2; } else if( x < (DBL_MIN / MIN_POLY_CONST) ) { x = DBL_MIN; } else { if( x > 1.0 ) { x = PDIV( 1.0, x ); add_piby2 = TRUE; } if( x > tan15 ) { tmp = sqrt3m1 * x - 0.5; tmp -= 0.5; x = PDIV( (tmp + x), (x + sqrt3) ); // x = (x * sqrt3 - 1.0) / (x + sqrt3); add_piby6 = TRUE; } x = _OddPoly( x, AtanPoly, 8 ); if( add_piby6 ) { x += PIby6; } if( add_piby2 ) { x = PIby2 - x; } } if( sgnx < 0 ) { x = -x; } return( x ); }
_WMRTLINK double _IF_datan2( double y, double x ) /***********************************************/ { int sgnx; /* sgn(x) */ int sgny; /* sgn(y) */ int sgnz; /* sgn(z) */ sgny = __sgn( y ); sgnx = __sgn( x ); if( sgny == 0 ) { /* case 1 */ if( sgnx == 0 ) { x = __math2err( FUNC_ATAN2 | M_DOMAIN | V_ZERO, &y, &x ); } else if( sgnx < 0 ) { x = Pi; } else { x = 0.0; } } else if( sgnx == 0 ) { /* case 2 */ if( sgny < 0 ) { x = -Piby2; } else { x = Piby2; } } else { int exp_x; int exp_y; int diff_exp_y_x; frexp( y, &exp_y ); frexp( x, &exp_x ); diff_exp_y_x = exp_y - exp_x; if( diff_exp_y_x > DBL_MAX_EXP ) { if( sgnx == sgny ) { x = +DBL_MAX; } else { x = -DBL_MAX; } } else if( diff_exp_y_x < DBL_MIN_EXP ) { if( sgnx == sgny ) { x = +DBL_MIN; } else { x = -DBL_MIN; } } else { x = PDIV( y, x ); } x = atan( x ); sgnz = __sgn( x ); if( sgny >= 0 ) { if( sgnz < 0 ) { x += Pi; } } else { if( sgnz > 0 ) { x -= Pi; } } } return( x ); }
_WMRTLINK double _IF_dexp( double x ) /***********************************/ { int sgnx; int exp; int exp2; const double *poly; double ipart; double a; double b; double ee; if( fabs( x ) < 4.445e-16 ) { /* if argument is too small */ x = 1.0; } else if( fabs( x ) > 709.782712893384 ) {/* if argument is too large */ if( x < 0.0 ) { /* FPStatus = FPS_UNDERFLOW; - - underflow */ x = 0.0; /* - - set result to 0 */ } else { x = __math1err( FP_FUNC_EXP | M_OVERFLOW | V_HUGEVAL, &x ); } #if defined(_M_IX86) } else if( _RWD_real87 ) { x = _exp87( x ); #endif } else { x *= log2e; sgnx = __sgn( x ); x = modf( fabs( x ), &ipart ); exp = ipart; if( sgnx < 0 ) { exp = -exp; if( x != 0.0 ) { --exp; x = 1.0 - x; } } exp2 = 0; if( x != 0.0 ) { x = modf( ldexp( x, 4 ), &ipart ); if( x != 0.0 ) { x = ldexp( x, -4 ); } exp2 = ipart; } ee = x * x; a = ee + const0; b = (ee * const1 + const2) * x; x = (a + b) / (a - b); poly = ExpConsts; while( exp2 != 0 ) { if( exp2 & 1 ) { x *= *poly; } ++poly; exp2 = exp2 >> 1; } x = ldexp( x, exp ); } return( x ); }