Add more to mpfp
This commit is contained in:
parent
40bdd1a36b
commit
375bc817cc
5 changed files with 121 additions and 180 deletions
|
@ -18,7 +18,7 @@ void double_power(double & v, unsigned k);
|
||||||
|
|
||||||
// Macro to implement transcendental functions using MPFR
|
// Macro to implement transcendental functions using MPFR
|
||||||
#define LEAN_TRANS_DOUBLE_FUNC(f, v, rnd) \
|
#define LEAN_TRANS_DOUBLE_FUNC(f, v, rnd) \
|
||||||
static thread_local mpfp t(v, 53); \
|
static thread_local mpfp t(53); \
|
||||||
t = v; \
|
t = v; \
|
||||||
t.f(rnd); \
|
t.f(rnd); \
|
||||||
v = t.get_double(rnd);
|
v = t.get_double(rnd);
|
||||||
|
|
|
@ -18,7 +18,7 @@ void float_power(float & v, unsigned k);
|
||||||
|
|
||||||
// Macro to implement transcendental functions using MPFR
|
// Macro to implement transcendental functions using MPFR
|
||||||
#define LEAN_TRANS_FLOAT_FUNC(f, v, rnd) \
|
#define LEAN_TRANS_FLOAT_FUNC(f, v, rnd) \
|
||||||
static thread_local mpfp t(v, 24); \
|
static thread_local mpfp t(24); \
|
||||||
t = v; \
|
t = v; \
|
||||||
t.f(rnd); \
|
t.f(rnd); \
|
||||||
v = t.get_float(rnd);
|
v = t.get_float(rnd);
|
||||||
|
|
|
@ -260,39 +260,41 @@ public:
|
||||||
|
|
||||||
template<>
|
template<>
|
||||||
class numeric_traits<mpbq> {
|
class numeric_traits<mpbq> {
|
||||||
|
private:
|
||||||
|
static thread_local bool rnd;
|
||||||
public:
|
public:
|
||||||
static bool precise() { return true; }
|
static bool precise() { return true; }
|
||||||
static bool is_zero(mpbq const & v) { return v.is_zero(); }
|
static bool is_zero(mpbq const & v) { return v.is_zero(); }
|
||||||
static bool is_pos(mpbq const & v) { return v.is_pos(); }
|
static bool is_pos(mpbq const & v) { return v.is_pos(); }
|
||||||
static bool is_neg(mpbq const & v) { return v.is_neg(); }
|
static bool is_neg(mpbq const & v) { return v.is_neg(); }
|
||||||
static void set_rounding(bool plus_inf) {}
|
static void set_rounding(bool plus_inf) { rnd = plus_inf; }
|
||||||
static void neg(mpbq & v) { v.neg(); }
|
static void neg(mpbq & v) { v.neg(); }
|
||||||
static void reset(mpbq & v) { v = 0; }
|
static void reset(mpbq & v) { v = 0; }
|
||||||
// v <- v^k
|
// v <- v^k
|
||||||
static void power(mpbq & v, unsigned k) { _power(v, v, k); }
|
static void power(mpbq & v, unsigned k) { _power(v, v, k); }
|
||||||
|
|
||||||
// Transcendental functions
|
// Transcendental functions
|
||||||
static void exp(mpq & v) { lean_unreachable(); /* TODO */ }
|
static void exp(mpbq & v) { lean_unreachable(); /* TODO */ }
|
||||||
static void exp2(mpq & v) { lean_unreachable(); /* TODO */ }
|
static void exp2(mpbq & v) { lean_unreachable(); /* TODO */ }
|
||||||
static void exp10(mpq & v) { lean_unreachable(); /* TODO */ }
|
static void exp10(mpbq & v) { lean_unreachable(); /* TODO */ }
|
||||||
static void log(mpq & v) { lean_unreachable(); /* TODO */ }
|
static void log(mpbq & v) { lean_unreachable(); /* TODO */ }
|
||||||
static void log2(mpq & v) { lean_unreachable(); /* TODO */ }
|
static void log2(mpbq & v) { lean_unreachable(); /* TODO */ }
|
||||||
static void log10(mpq & v) { lean_unreachable(); /* TODO */ }
|
static void log10(mpbq & v) { lean_unreachable(); /* TODO */ }
|
||||||
static void sin(mpq & v) { lean_unreachable(); /* TODO */ }
|
static void sin(mpbq & v) { lean_unreachable(); /* TODO */ }
|
||||||
static void cos(mpq & v) { lean_unreachable(); /* TODO */ }
|
static void cos(mpbq & v) { lean_unreachable(); /* TODO */ }
|
||||||
static void tan(mpq & v) { lean_unreachable(); /* TODO */ }
|
static void tan(mpbq & v) { lean_unreachable(); /* TODO */ }
|
||||||
static void sec(mpq & v) { lean_unreachable(); /* TODO */ }
|
static void sec(mpbq & v) { lean_unreachable(); /* TODO */ }
|
||||||
static void csc(mpq & v) { lean_unreachable(); /* TODO */ }
|
static void csc(mpbq & v) { lean_unreachable(); /* TODO */ }
|
||||||
static void cot(mpq & v) { lean_unreachable(); /* TODO */ }
|
static void cot(mpbq & v) { lean_unreachable(); /* TODO */ }
|
||||||
static void asin(mpq & v) { lean_unreachable(); /* TODO */ }
|
static void asin(mpbq & v) { lean_unreachable(); /* TODO */ }
|
||||||
static void acos(mpq & v) { lean_unreachable(); /* TODO */ }
|
static void acos(mpbq & v) { lean_unreachable(); /* TODO */ }
|
||||||
static void atan(mpq & v) { lean_unreachable(); /* TODO */ }
|
static void atan(mpbq & v) { lean_unreachable(); /* TODO */ }
|
||||||
static void sinh(mpq & v) { lean_unreachable(); /* TODO */ }
|
static void sinh(mpbq & v) { lean_unreachable(); /* TODO */ }
|
||||||
static void cosh(mpq & v) { lean_unreachable(); /* TODO */ }
|
static void cosh(mpbq & v) { lean_unreachable(); /* TODO */ }
|
||||||
static void tanh(mpq & v) { lean_unreachable(); /* TODO */ }
|
static void tanh(mpbq & v) { lean_unreachable(); /* TODO */ }
|
||||||
static void asinh(mpq & v) { lean_unreachable(); /* TODO */ }
|
static void asinh(mpbq & v) { lean_unreachable(); /* TODO */ }
|
||||||
static void acosh(mpq & v) { lean_unreachable(); /* TODO */ }
|
static void acosh(mpbq & v) { lean_unreachable(); /* TODO */ }
|
||||||
static void atanh(mpq & v) { lean_unreachable(); /* TODO */ }
|
static void atanh(mpbq & v) { lean_unreachable(); /* TODO */ }
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -9,73 +9,6 @@ Author: Soonho Kong
|
||||||
|
|
||||||
namespace lean {
|
namespace lean {
|
||||||
|
|
||||||
// mpq & mpq::operator=(mpbq const & b) {
|
|
||||||
// *this = 2;
|
|
||||||
// power(*this, *this, b.get_k());
|
|
||||||
// inv();
|
|
||||||
// *this *= b.get_numerator();
|
|
||||||
// return *this;
|
|
||||||
// }
|
|
||||||
|
|
||||||
// int cmp(mpq const & a, mpz const & b) {
|
|
||||||
// if (a.is_integer()) {
|
|
||||||
// return mpz_cmp(mpq_numref(a.m_val), mpq::zval(b));
|
|
||||||
// }
|
|
||||||
// else {
|
|
||||||
// static thread_local mpz tmp;
|
|
||||||
// mpz_mul(mpq::zval(tmp), mpq_denref(a.m_val), mpq::zval(b));
|
|
||||||
// return mpz_cmp(mpq_numref(a.m_val), mpq::zval(tmp));
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
|
|
||||||
// void mpq::floor() {
|
|
||||||
// if (is_integer())
|
|
||||||
// return;
|
|
||||||
// bool neg = is_neg();
|
|
||||||
// mpz_tdiv_q(mpq_numref(m_val), mpq_numref(m_val), mpq_denref(m_val));
|
|
||||||
// mpz_set_ui(mpq_denref(m_val), 1);
|
|
||||||
// if (neg)
|
|
||||||
// mpz_sub_ui(mpq_numref(m_val), mpq_numref(m_val), 1);
|
|
||||||
// }
|
|
||||||
|
|
||||||
// void mpq::ceil() {
|
|
||||||
// if (is_integer())
|
|
||||||
// return;
|
|
||||||
// bool pos = is_pos();
|
|
||||||
// mpz_tdiv_q(mpq_numref(m_val), mpq_numref(m_val), mpq_denref(m_val));
|
|
||||||
// mpz_set_ui(mpq_denref(m_val), 1);
|
|
||||||
// if (pos)
|
|
||||||
// mpz_add_ui(mpq_numref(m_val), mpq_numref(m_val), 1);
|
|
||||||
// }
|
|
||||||
|
|
||||||
// mpz floor(mpq const & a) {
|
|
||||||
// if (a.is_integer())
|
|
||||||
// return a.get_numerator();
|
|
||||||
// mpz r;
|
|
||||||
// mpz_tdiv_q(mpq::zval(r), mpq_numref(a.m_val), mpq_denref(a.m_val));
|
|
||||||
// if (a.is_neg())
|
|
||||||
// --r;
|
|
||||||
// return r;
|
|
||||||
// }
|
|
||||||
|
|
||||||
// mpz ceil(mpq const & a) {
|
|
||||||
// if (a.is_integer())
|
|
||||||
// return a.get_numerator();
|
|
||||||
// mpz r;
|
|
||||||
// mpz_tdiv_q(mpq::zval(r), mpq_numref(a.m_val), mpq_denref(a.m_val));
|
|
||||||
// if (a.is_pos())
|
|
||||||
// ++r;
|
|
||||||
// return r;
|
|
||||||
// }
|
|
||||||
|
|
||||||
// void power(mpq & a, mpq const & b, unsigned k) {
|
|
||||||
// mpz_pow_ui(mpq_numref(a.m_val), mpq_numref(b.m_val), k);
|
|
||||||
// mpz_pow_ui(mpq_denref(a.m_val), mpq_denref(b.m_val), k);
|
|
||||||
// mpq_canonicalize(a.m_val);
|
|
||||||
// }
|
|
||||||
|
|
||||||
// extern void display(std::ostream & out, __mpz_struct const * v);
|
|
||||||
|
|
||||||
inline unsigned necessary_digits(mpfr_prec_t p) {
|
inline unsigned necessary_digits(mpfr_prec_t p) {
|
||||||
static constexpr double LOG10_2 = 0.30102999566;
|
static constexpr double LOG10_2 = 0.30102999566;
|
||||||
return std::ceil(p * LOG10_2) + 2;
|
return std::ceil(p * LOG10_2) + 2;
|
||||||
|
@ -90,32 +23,6 @@ std::ostream & operator<<(std::ostream & out, mpfp const & v) {
|
||||||
out << str;
|
out << str;
|
||||||
return out;
|
return out;
|
||||||
}
|
}
|
||||||
// void display_decimal(std::ostream & out, mpq const & a, unsigned prec) {
|
|
||||||
// mpz n1, d1, v1;
|
|
||||||
// numerator(n1, a);
|
|
||||||
// denominator(d1, a);
|
|
||||||
// if (a.is_neg()) {
|
|
||||||
// out << "-";
|
|
||||||
// neg(n1);
|
|
||||||
// }
|
|
||||||
// v1 = n1 / d1;
|
|
||||||
// out << v1;
|
|
||||||
// n1 = rem(n1, d1);
|
|
||||||
// if (n1.is_zero())
|
|
||||||
// return;
|
|
||||||
// out << ".";
|
|
||||||
// for (unsigned i = 0; i < prec; i++) {
|
|
||||||
// n1 *= 10;
|
|
||||||
// v1 = n1 / d1;
|
|
||||||
// lean_assert(v1 < 10);
|
|
||||||
// out << v1;
|
|
||||||
// n1 = rem(n1, d1);
|
|
||||||
// if (n1.is_zero())
|
|
||||||
// return;
|
|
||||||
// }
|
|
||||||
// out << "?";
|
|
||||||
// }
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// void print(lean::mpq const & v) { std::cout << v << std::endl; }
|
void print(lean::mpfp const & v) { std::cout << v << std::endl; }
|
||||||
|
|
|
@ -19,12 +19,13 @@ class mpfp {
|
||||||
friend numeric_traits<mpfp>;
|
friend numeric_traits<mpfp>;
|
||||||
mpfr_t m_val;
|
mpfr_t m_val;
|
||||||
|
|
||||||
// static mpfr_t const & zval(mpz const & v) { return v.m_val; }
|
static mpz_t const & zval(mpz const & v) { return v.m_val; }
|
||||||
// static mpfr_t & zval(mpz & v) { return v.m_val; }
|
static mpz_t & zval(mpz & v) { return v.m_val; }
|
||||||
|
static mpq_t const & qval(mpq const & v) { return v.m_val; }
|
||||||
|
static mpq_t & qval(mpq & v) { return v.m_val; }
|
||||||
|
|
||||||
public:
|
public:
|
||||||
// friend void swap(mpfp & a, mpfp & b) { mpfr_swap(a.m_val, b.m_val); }
|
friend void swap(mpfp & a, mpfp & b) { mpfr_swap(a.m_val, b.m_val); }
|
||||||
// friend void swap_numerator(mpfp & a, mpz & b) { mpz_swap(mpfr_numref(a.m_val), zval(b)); mpfr_canonicalize(a.m_val); }
|
|
||||||
// friend void swap_denominator(mpfp & a, mpz & b) { mpz_swap(mpfr_denref(a.m_val), zval(b)); mpfr_canonicalize(a.m_val); }
|
|
||||||
|
|
||||||
// Setter functions
|
// Setter functions
|
||||||
mpfp & set(mpfp const & v, mpfr_rnd_t rnd = MPFR_RNDN) {
|
mpfp & set(mpfp const & v, mpfr_rnd_t rnd = MPFR_RNDN) {
|
||||||
|
@ -82,18 +83,20 @@ public:
|
||||||
|
|
||||||
// Basic Constructors
|
// Basic Constructors
|
||||||
mpfp() { mpfr_init(m_val); } // with default precision
|
mpfp() { mpfr_init(m_val); } // with default precision
|
||||||
mpfp(mpfr_prec_t prec) { mpfr_init2(m_val, prec); }
|
explicit mpfp(int prec) { mpfr_init2(m_val, prec); }
|
||||||
|
explicit mpfp(unsigned prec) { mpfr_init2(m_val, prec); }
|
||||||
|
explicit mpfp(mpfr_prec_t prec) { mpfr_init2(m_val, prec); }
|
||||||
|
|
||||||
// Constructors using the default precision
|
// Constructors using the default precision
|
||||||
mpfp(float const v ):mpfp() { set(v); }
|
explicit mpfp(float const v ):mpfp() { set(v); }
|
||||||
mpfp(double const v ):mpfp() { set(v); }
|
explicit mpfp(double const v ):mpfp() { set(v); }
|
||||||
mpfp(long double const v):mpfp() { set(v); }
|
explicit mpfp(long double const v):mpfp() { set(v); }
|
||||||
mpfp(mpz_t const & v ):mpfp() { set(v); }
|
explicit mpfp(mpz_t const & v ):mpfp() { set(v); }
|
||||||
mpfp(mpq_t const & v ):mpfp() { set(v); }
|
explicit mpfp(mpq_t const & v ):mpfp() { set(v); }
|
||||||
mpfp(mpf_t const & v ):mpfp() { set(v); }
|
explicit mpfp(mpf_t const & v ):mpfp() { set(v); }
|
||||||
mpfp(mpz const & v ):mpfp() { set(v); }
|
explicit mpfp(mpz const & v ):mpfp() { set(v); }
|
||||||
mpfp(mpq const & v ):mpfp() { set(v); }
|
explicit mpfp(mpq const & v ):mpfp() { set(v); }
|
||||||
mpfp(mpbq const & v ):mpfp() { set(v); }
|
explicit mpfp(mpbq const & v ):mpfp() { set(v); }
|
||||||
mpfp(mpfp const & v ):mpfp(mpfr_get_prec(v.m_val)) { set(v); }
|
mpfp(mpfp const & v ):mpfp(mpfr_get_prec(v.m_val)) { set(v); }
|
||||||
|
|
||||||
// Constructors using the provided precision
|
// Constructors using the provided precision
|
||||||
|
@ -120,9 +123,7 @@ public:
|
||||||
mpfp(mpbq const & v , mpfr_prec_t p, mpfr_rnd_t rnd):mpfp(p) { set(v, rnd); }
|
mpfp(mpbq const & v , mpfr_prec_t p, mpfr_rnd_t rnd):mpfp(p) { set(v, rnd); }
|
||||||
mpfp(mpfp const & v , mpfr_prec_t p, mpfr_rnd_t rnd):mpfp(p) { set(v, rnd); }
|
mpfp(mpfp const & v , mpfr_prec_t p, mpfr_rnd_t rnd):mpfp(p) { set(v, rnd); }
|
||||||
|
|
||||||
// mpfr(mpfp && s):mpfr() { mpfr_swap(m_val, s.m_val); }
|
mpfp(mpfp && s):mpfp(mpfr_get_prec(s.m_val)) { mpfr_swap(m_val, s.m_val); }
|
||||||
// template<typename T> explicit mpfr(T const & v):mpfr() { operator=(v); }
|
|
||||||
// mpfr(unsigned long int n, unsigned long int d):mpfr() { mpfr_set_ui(m_val, n, d); mpfr_canonicalize(m_val);}
|
|
||||||
~mpfp() { mpfr_clear(m_val); }
|
~mpfp() { mpfr_clear(m_val); }
|
||||||
|
|
||||||
unsigned hash() const { return static_cast<unsigned>(mpfr_get_si(m_val, MPFR_RNDN)); }
|
unsigned hash() const { return static_cast<unsigned>(mpfr_get_si(m_val, MPFR_RNDN)); }
|
||||||
|
@ -184,15 +185,12 @@ public:
|
||||||
friend mpfp acosh(mpfp a, mpfr_rnd_t rnd = MPFR_RNDN) { a.acosh(rnd); return a; }
|
friend mpfp acosh(mpfp a, mpfr_rnd_t rnd = MPFR_RNDN) { a.acosh(rnd); return a; }
|
||||||
friend mpfp atanh(mpfp a, mpfr_rnd_t rnd = MPFR_RNDN) { a.atanh(rnd); return a; }
|
friend mpfp atanh(mpfp a, mpfr_rnd_t rnd = MPFR_RNDN) { a.atanh(rnd); return a; }
|
||||||
|
|
||||||
// void inv() { mpfr_inv(m_val, m_val, MPFR_RNDN); }
|
void inv() { mpfr_d_div(m_val, 1.0, m_val, MPFR_RNDN); }
|
||||||
// friend mpfp inv(mpfp a) { a.inv(); return a; }
|
friend mpfp inv(mpfp a) { a.inv(); return a; }
|
||||||
double get_double(mpfr_rnd_t rnd = MPFR_RNDN) const { return mpfr_get_d(m_val, rnd); }
|
double get_double(mpfr_rnd_t rnd = MPFR_RNDN) const { return mpfr_get_d(m_val, rnd); }
|
||||||
float get_float (mpfr_rnd_t rnd = MPFR_RNDN) const { return mpfr_get_flt(m_val, rnd); }
|
float get_float (mpfr_rnd_t rnd = MPFR_RNDN) const { return mpfr_get_flt(m_val, rnd); }
|
||||||
|
|
||||||
// bool is_integer() const { return mpz_cmp_ui(mpfr_denref(m_val), 1u) == 0; }
|
|
||||||
|
|
||||||
friend int cmp(mpfp const & a, mpfp const & b ) { return mpfr_cmp(a.m_val, b.m_val); }
|
friend int cmp(mpfp const & a, mpfp const & b ) { return mpfr_cmp(a.m_val, b.m_val); }
|
||||||
// friend int cmp(mpfp const & a, mpz const & b);
|
|
||||||
friend int cmp(mpfp const & a, unsigned long int const b) { return mpfr_cmp_ui(a.m_val, b); }
|
friend int cmp(mpfp const & a, unsigned long int const b) { return mpfr_cmp_ui(a.m_val, b); }
|
||||||
friend int cmp(mpfp const & a, long int const b ) { return mpfr_cmp_si(a.m_val, b); }
|
friend int cmp(mpfp const & a, long int const b ) { return mpfr_cmp_si(a.m_val, b); }
|
||||||
friend int cmp(mpfp const & a, double const b ) { return mpfr_cmp_d (a.m_val, b); }
|
friend int cmp(mpfp const & a, double const b ) { return mpfr_cmp_d (a.m_val, b); }
|
||||||
|
@ -200,10 +198,9 @@ public:
|
||||||
friend int cmp(mpfp const & a, mpz_t const & b ) { return mpfr_cmp_z (a.m_val, b); }
|
friend int cmp(mpfp const & a, mpz_t const & b ) { return mpfr_cmp_z (a.m_val, b); }
|
||||||
friend int cmp(mpfp const & a, mpq_t const & b ) { return mpfr_cmp_q (a.m_val, b); }
|
friend int cmp(mpfp const & a, mpq_t const & b ) { return mpfr_cmp_q (a.m_val, b); }
|
||||||
friend int cmp(mpfp const & a, mpf_t const & b ) { return mpfr_cmp_f (a.m_val, b); }
|
friend int cmp(mpfp const & a, mpf_t const & b ) { return mpfr_cmp_f (a.m_val, b); }
|
||||||
/* TODO */
|
friend int cmp(mpfp const & a, mpz const & b ) { return mpfr_cmp_z (a.m_val, zval(b)); }
|
||||||
// friend int cmp(mpfp const & a, mpz const & b) { return mpfr_cmp_(a.m_val, b); }
|
friend int cmp(mpfp const & a, mpq const & b ) { return mpfr_cmp_q (a.m_val, qval(b)); }
|
||||||
// friend int cmp(mpfp const & a, mpq const & b) { return mpfr_cmp_(a.m_val, b); }
|
//friend int cmp(mpfp const & a, mpbq const & b) { return mpfr_cmp_(a.m_val, b); }
|
||||||
// friend int cmp(mpfp const & a, mpbq const & b) { return mpfr_cmp_(a.m_val, b); }
|
|
||||||
|
|
||||||
friend bool operator<(mpfp const & a, mpfp const & b ) { return cmp(a, b) < 0; }
|
friend bool operator<(mpfp const & a, mpfp const & b ) { return cmp(a, b) < 0; }
|
||||||
friend bool operator<(mpfp const & a, mpz const & b ) { return cmp(a, b) < 0; }
|
friend bool operator<(mpfp const & a, mpz const & b ) { return cmp(a, b) < 0; }
|
||||||
|
@ -282,20 +279,38 @@ public:
|
||||||
friend bool operator>=(mpf_t const & a , mpfp const & b) { return cmp(b, a) <= 0; }
|
friend bool operator>=(mpf_t const & a , mpfp const & b) { return cmp(b, a) <= 0; }
|
||||||
|
|
||||||
friend bool operator==(mpfp const & a, mpfp const & b) { return mpfr_equal_p(a.m_val, b.m_val) != 0; }
|
friend bool operator==(mpfp const & a, mpfp const & b) { return mpfr_equal_p(a.m_val, b.m_val) != 0; }
|
||||||
// friend bool operator==(mpfp const & a, mpz const & b) { return a.is_integer() && mpz_cmp(mpfr_numref(a.m_val), zval(b)) == 0; }
|
friend bool operator==(unsigned long int const a, mpfp const & b) { return cmp(b, a) == 0; }
|
||||||
// friend bool operator==(mpfp const & a, unsigned int b) { return a.is_integer() && mpz_cmp_ui(mpfr_numref(a.m_val), b) == 0; }
|
friend bool operator==(long int const a , mpfp const & b) { return cmp(b, a) == 0; }
|
||||||
// friend bool operator==(mpfp const & a, int b) { return a.is_integer() && mpz_cmp_si(mpfr_numref(a.m_val), b) == 0; }
|
friend bool operator==(double const a , mpfp const & b) { return cmp(b, a) == 0; }
|
||||||
// friend bool operator==(mpz const & a, mpfp const & b) { return operator==(b, a); }
|
friend bool operator==(long double const a , mpfp const & b) { return cmp(b, a) == 0; }
|
||||||
// friend bool operator==(unsigned int a, mpfp const & b) { return operator==(b, a); }
|
friend bool operator==(mpz_t const & a , mpfp const & b) { return cmp(b, a) == 0; }
|
||||||
// friend bool operator==(int a, mpfp const & b) { return operator==(b, a); }
|
friend bool operator==(mpq_t const & a , mpfp const & b) { return cmp(b, a) == 0; }
|
||||||
|
friend bool operator==(mpf_t const & a , mpfp const & b) { return cmp(b, a) == 0; }
|
||||||
|
friend bool operator==(mpfp const & a, mpz const & b ) { return cmp(a, b) == 0; }
|
||||||
|
friend bool operator==(mpfp const & a, unsigned long int const b) { return cmp(a, b) == 0; }
|
||||||
|
friend bool operator==(mpfp const & a, long int const b ) { return cmp(a, b) == 0; }
|
||||||
|
friend bool operator==(mpfp const & a, double const b ) { return cmp(a, b) == 0; }
|
||||||
|
friend bool operator==(mpfp const & a, long double const b ) { return cmp(a, b) == 0; }
|
||||||
|
friend bool operator==(mpfp const & a, mpz_t const & b ) { return cmp(a, b) == 0; }
|
||||||
|
friend bool operator==(mpfp const & a, mpq_t const & b ) { return cmp(a, b) == 0; }
|
||||||
|
friend bool operator==(mpfp const & a, mpf_t const & b ) { return cmp(a, b) == 0; }
|
||||||
|
|
||||||
friend bool operator!=(mpfp const & a, mpfp const & b) { return !operator==(a,b); }
|
friend bool operator!=(mpfp const & a, mpfp const & b) { return !operator==(a,b); }
|
||||||
// friend bool operator!=(mpfp const & a, mpz const & b) { return !operator==(a,b); }
|
friend bool operator!=(unsigned long int const a, mpfp const & b) { return cmp(b, a) != 0; }
|
||||||
// friend bool operator!=(mpfp const & a, unsigned int b) { return !operator==(a,b); }
|
friend bool operator!=(long int const a , mpfp const & b) { return cmp(b, a) != 0; }
|
||||||
// friend bool operator!=(mpfp const & a, int b) { return !operator==(a,b); }
|
friend bool operator!=(double const a , mpfp const & b) { return cmp(b, a) != 0; }
|
||||||
// friend bool operator!=(mpz const & a, mpfp const & b) { return !operator==(a,b); }
|
friend bool operator!=(long double const a , mpfp const & b) { return cmp(b, a) != 0; }
|
||||||
// friend bool operator!=(unsigned int a, mpfp const & b) { return !operator==(a,b); }
|
friend bool operator!=(mpz_t const & a , mpfp const & b) { return cmp(b, a) != 0; }
|
||||||
// friend bool operator!=(int a, mpfp const & b) { return !operator==(a,b); }
|
friend bool operator!=(mpq_t const & a , mpfp const & b) { return cmp(b, a) != 0; }
|
||||||
|
friend bool operator!=(mpf_t const & a , mpfp const & b) { return cmp(b, a) != 0; }
|
||||||
|
friend bool operator!=(mpfp const & a, mpz const & b ) { return cmp(a, b) != 0; }
|
||||||
|
friend bool operator!=(mpfp const & a, unsigned long int const b) { return cmp(a, b) != 0; }
|
||||||
|
friend bool operator!=(mpfp const & a, long int const b ) { return cmp(a, b) != 0; }
|
||||||
|
friend bool operator!=(mpfp const & a, double const b ) { return cmp(a, b) != 0; }
|
||||||
|
friend bool operator!=(mpfp const & a, long double const b ) { return cmp(a, b) != 0; }
|
||||||
|
friend bool operator!=(mpfp const & a, mpz_t const & b ) { return cmp(a, b) != 0; }
|
||||||
|
friend bool operator!=(mpfp const & a, mpq_t const & b ) { return cmp(a, b) != 0; }
|
||||||
|
friend bool operator!=(mpfp const & a, mpf_t const & b ) { return cmp(a, b) != 0; }
|
||||||
|
|
||||||
mpfp & add(mpfp const & o, mpfr_rnd_t rnd = MPFR_RNDN) { mpfr_add(m_val, m_val, o.m_val, rnd); return *this; }
|
mpfp & add(mpfp const & o, mpfr_rnd_t rnd = MPFR_RNDN) { mpfr_add(m_val, m_val, o.m_val, rnd); return *this; }
|
||||||
mpfp & add(unsigned long int const o, mpfr_rnd_t rnd = MPFR_RNDN) { mpfr_add_ui(m_val, m_val, o, rnd); return *this; }
|
mpfp & add(unsigned long int const o, mpfr_rnd_t rnd = MPFR_RNDN) { mpfr_add_ui(m_val, m_val, o, rnd); return *this; }
|
||||||
|
@ -423,34 +438,51 @@ public:
|
||||||
mpfp & operator^=(unsigned long int k) { return pow(k); }
|
mpfp & operator^=(unsigned long int k) { return pow(k); }
|
||||||
friend mpfp operator^(mpfp a, unsigned long int k) { return a ^= k; }
|
friend mpfp operator^(mpfp a, unsigned long int k) { return a ^= k; }
|
||||||
|
|
||||||
// mpfp & operator++() { return operator+=(1); }
|
mpfp & operator++() { return operator+=(1lu); }
|
||||||
// mpfp operator++(int) { mpfp r(*this); ++(*this); return r; }
|
mpfp operator++(int) { mpfp r(*this); ++(*this); return r; }
|
||||||
|
|
||||||
// mpfp & operator--() { return operator-=(1); }
|
mpfp & operator--() { return operator-=(1lu); }
|
||||||
// mpfp operator--(int) { mpfp r(*this); --(*this); return r; }
|
mpfp operator--(int) { mpfp r(*this); --(*this); return r; }
|
||||||
|
|
||||||
// void floor();
|
void floor() { mpfr_floor(m_val, m_val); }
|
||||||
// friend mpz floor(mpfp const & a);
|
void ceil () { mpfr_ceil (m_val, m_val); }
|
||||||
|
void round() { mpfr_round(m_val, m_val); }
|
||||||
|
void trunc() { mpfr_trunc(m_val, m_val); }
|
||||||
|
void rfloor(mpfr_rnd_t rnd = MPFR_RNDN) { mpfr_rint_floor(m_val, m_val, rnd); }
|
||||||
|
void rceil (mpfr_rnd_t rnd = MPFR_RNDN) { mpfr_rint_ceil (m_val, m_val, rnd); }
|
||||||
|
void rround(mpfr_rnd_t rnd = MPFR_RNDN) { mpfr_rint_round(m_val, m_val, rnd); }
|
||||||
|
void rtrunc(mpfr_rnd_t rnd = MPFR_RNDN) { mpfr_rint_trunc(m_val, m_val, rnd); }
|
||||||
|
|
||||||
// void ceil();
|
friend mpfp floor(mpfp const & a) { static thread_local mpfp tmp; tmp = a; tmp.floor(); return tmp; }
|
||||||
// friend mpz ceil(mpfp const & a);
|
friend mpfp ceil (mpfp const & a) { static thread_local mpfp tmp; tmp = a; tmp.ceil(); return tmp; }
|
||||||
|
friend mpfp round(mpfp const & a) { static thread_local mpfp tmp; tmp = a; tmp.round(); return tmp; }
|
||||||
|
friend mpfp trunc(mpfp const & a) { static thread_local mpfp tmp; tmp = a; tmp.trunc(); return tmp; }
|
||||||
|
friend mpfp rfloor(mpfp const & a, mpfr_rnd_t rnd = MPFR_RNDN) {
|
||||||
|
static thread_local mpfp tmp; tmp = a; tmp.rfloor(rnd); return tmp;
|
||||||
|
}
|
||||||
|
friend mpfp rceil (mpfp const & a, mpfr_rnd_t rnd = MPFR_RNDN) {
|
||||||
|
static thread_local mpfp tmp; tmp = a; tmp.rceil(rnd); return tmp;
|
||||||
|
}
|
||||||
|
friend mpfp rround(mpfp const & a, mpfr_rnd_t rnd = MPFR_RNDN) {
|
||||||
|
static thread_local mpfp tmp; tmp = a; tmp.rround(rnd); return tmp;
|
||||||
|
}
|
||||||
|
friend mpfp rtrunc(mpfp const & a, mpfr_rnd_t rnd = MPFR_RNDN) {
|
||||||
|
static thread_local mpfp tmp; tmp = a; tmp.rtrunc(rnd); return tmp;
|
||||||
|
}
|
||||||
|
|
||||||
// friend void power(mpfp & a, mpfp const & b, unsigned k);
|
void power(mpfp const & b, mpfr_rnd_t rnd = MPFR_RNDN) { mpfr_pow(m_val, m_val, b.m_val, rnd); }
|
||||||
// friend void _power(mpfp & a, mpfp const & b, unsigned k) { power(a, b, k); }
|
void power(unsigned long int b, mpfr_rnd_t rnd = MPFR_RNDN) { mpfr_pow_ui(m_val, m_val, b, rnd); }
|
||||||
// friend mpfp power(mpfp a, unsigned k) { power(a, a, k); return a; }
|
void power(long int b, mpfr_rnd_t rnd = MPFR_RNDN) { mpfr_pow_si(m_val, m_val, b, rnd); }
|
||||||
|
void power(mpz_t const & b, mpfr_rnd_t rnd = MPFR_RNDN) { mpfr_pow_z(m_val, m_val, b, rnd); }
|
||||||
|
void power(mpz const & b, mpfr_rnd_t rnd = MPFR_RNDN) { mpfr_pow_z(m_val, m_val, b.m_val, rnd); }
|
||||||
|
|
||||||
|
friend mpfp power(mpfp a, mpfp const & b, mpfr_rnd_t rnd = MPFR_RNDN) { a.power(b, rnd); return a;; }
|
||||||
|
friend mpfp power(mpfp a, unsigned long int b, mpfr_rnd_t rnd = MPFR_RNDN) { a.power(b, rnd); return a;; }
|
||||||
|
friend mpfp power(mpfp a, long int b, mpfr_rnd_t rnd = MPFR_RNDN) { a.power(b, rnd); return a;; }
|
||||||
|
friend mpfp power(mpfp a, mpz_t const & b, mpfr_rnd_t rnd = MPFR_RNDN) { a.power(b, rnd); return a;; }
|
||||||
|
friend mpfp power(mpfp a, mpz const & b, mpfr_rnd_t rnd = MPFR_RNDN) { a.power(b, rnd); return a;; }
|
||||||
|
|
||||||
friend std::ostream & operator<<(std::ostream & out, mpfp const & v);
|
friend std::ostream & operator<<(std::ostream & out, mpfp const & v);
|
||||||
|
|
||||||
// friend void display_decimal(std::ostream & out, mpfp const & a, unsigned prec);
|
|
||||||
|
|
||||||
// class decimal {
|
|
||||||
// mpfp const & m_val;
|
|
||||||
// unsigned m_prec;
|
|
||||||
// public:
|
|
||||||
// decimal(mpfp const & val, unsigned prec = 10):m_val(val), m_prec(prec) {}
|
|
||||||
// friend std::ostream & operator<<(std::ostream & out, decimal const & d) { display_decimal(out, d.m_val, d.m_prec); return out; }
|
|
||||||
// };
|
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
// Macro to implement transcendental functions
|
// Macro to implement transcendental functions
|
||||||
|
@ -467,7 +499,7 @@ public:
|
||||||
static void set_rounding(bool plus_inf) { rnd = plus_inf ? MPFR_RNDU :MPFR_RNDD; }
|
static void set_rounding(bool plus_inf) { rnd = plus_inf ? MPFR_RNDU :MPFR_RNDD; }
|
||||||
static void neg(mpfp & v) { v.neg(); }
|
static void neg(mpfp & v) { v.neg(); }
|
||||||
// static void inv(mpfp & v) { v.inv(); }
|
// static void inv(mpfp & v) { v.inv(); }
|
||||||
// static void reset(mpfp & v) { v = 0; }
|
static void reset(mpfp & v) { v = 0.0; }
|
||||||
// v <- v^k
|
// v <- v^k
|
||||||
static void power(mpfp & v, unsigned k) { v.pow(k); }
|
static void power(mpfp & v, unsigned k) { v.pow(k); }
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue