Beispiel #1
0
_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 );
    }
}
Beispiel #2
0
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 );
    }
}
Beispiel #3
0
_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 );
}
Beispiel #4
0
double  __math1err( unsigned int err_info, double *a1 ) {
//=======================================================

    return( __math2err( err_info, a1, a1 ) );
}