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()) { }
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); } }
mpoint::mpoint(const mpf_class xx, const mpf_class yy) :x_(xx.get_d()), y_(yy.get_d()), z_(1) { }