示例#1
0
mpoint::mpoint(const mpf_class xx, const mpf_class yy, const mpf_class zz)
:x_(xx.get_d()), y_(yy.get_d()), z_(zz.get_d())
{
}
示例#2
0
expression_tree numeric_Power(const expression_tree::operands_t& ops, enviroment& env) {
    if ( ops.size() != 2 ) {
        env.raise_error("numeric Power", "called with invalid arguments");
        return expression_tree::make_operator( "Power", ops );       
    }

    //double powering
    mpf_class base;

    
    switch ( ops[0].get_type() ) {
    case expression_tree::EXACT_NUMBER :
        base = ops[0].get_exact_number();
        break;
    case expression_tree::APPROXIMATE_NUMBER :
        base = ops[0].get_approximate_number();
        break;
    default:
        return expression_tree::make_operator("Power", ops);
    }

    //if exp is an integral value, then use pow(double, int) version

    const bool approx_num = ops[1].get_type() == expression_tree::APPROXIMATE_NUMBER;
    const bool rational_num = ops[1].get_type() == expression_tree::EXACT_NUMBER && !is_mpq_integer(ops[1].get_exact_number());

    if (approx_num || rational_num) {
        const mpf_class exp = ops[1].get_number_as_mpf();
        if ( base < 0 || (base == 0 && exp < 0) ) {
            env.raise_error( "numeric Power", "Indeterminate expression encountered" );
            return expression_tree::make_symbol("Indeterminate");
        } else if ( base == 0 && exp < 0 ) {
            return expression_tree::make_symbol("Infinity");
        }
        return expression_tree::make_approximate_number( mpf_class(std::pow(base.get_d(), exp.get_d())) );

    } else if ( ops[1].get_type() == expression_tree::EXACT_NUMBER ) {

        long exp = 0;

        if ( !mpz_get_si_checked( exp, ops[1].get_exact_number() ) ) {
            env.raise_error("numeric Power", "exponent overflow");
            return expression_tree::make_operator("Power", ops);
        }
        if ( base == 0 && exp < 0 ) {
            return expression_tree::make_symbol("Infinity");
        }

        return expression_tree::make_approximate_number( mpf_class(std::pow(base.get_d(), exp)) );

    } else {
        return expression_tree::make_operator("Power", ops);
    }
    
}
示例#3
0
mpoint::mpoint(const mpf_class xx, const mpf_class yy)
:x_(xx.get_d()), y_(yy.get_d()), z_(1)
{
}