_WMRTLINK extended _IF_PowXI( extended base, intstar4 power ) { //============================================================ // Return base ** power where power could be <= 0. extended result; if( base == 0.0 ) { if( power <= 0 ) { result = power; return( __math2err( FUNC_DPOWI | M_DOMAIN | V_ZERO, &base, &result ) ); } else { return( 0.0 ); } } else { if( power < 0 ) { power = -power; base = PDIV( 1.0 , base ); } result = 1.0; while( power > 0 ) { if( power % 2 == 0 ) { base *= base; power /= 2; } else { result *= base; --power; } } return( result ); } }
double PowRI( double base, intstar4 power ) { //============================================ // Return base ** power where power could be <= 0. double result; if( base == 0.0 ) { if( power <= 0 ) { result = power; return( __math2err( FUNC_DPOWI | M_DOMAIN | V_ZERO, &base, &result ) ); } else { return( 0.0 ); } } else { if( power < 0 ) { power = -power; base = 1 / base; } result = 1.0; while( power > 0 ) { if( power % 2 == 0 ) { base *= base; power /= 2; } else { result *= base; --power; } } return( result ); } }
_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 ); }
double __math1err( unsigned int err_info, double *a1 ) { //======================================================= return( __math2err( err_info, a1, a1 ) ); }