diff --git a/include/boost/multiprecision/gmp.hpp b/include/boost/multiprecision/gmp.hpp index 3aaada75..c0390c06 100644 --- a/include/boost/multiprecision/gmp.hpp +++ b/include/boost/multiprecision/gmp.hpp @@ -1510,13 +1510,15 @@ protected: inline mp_number numerator(const mp_number& val) { - const __mpz_struct* pz = (mpq_numref(val.backend().data())); - return mp_number((mpz_t&)pz); + mp_number result; + mpz_set(result.backend().data(), (mpq_numref(val.backend().data()))); + return result; } inline mp_number denominator(const mp_number& val) { - const __mpz_struct* pz = mpq_denref(val.backend().data()); - return mp_number((mpz_t&)pz); + mp_number result; + mpz_set(result.backend().data(), (mpq_denref(val.backend().data()))); + return result; } inline void add(gmp_rational& t, const gmp_rational& o) diff --git a/include/boost/multiprecision/mpfr.hpp b/include/boost/multiprecision/mpfr.hpp index bf478e42..47b20140 100644 --- a/include/boost/multiprecision/mpfr.hpp +++ b/include/boost/multiprecision/mpfr.hpp @@ -7,6 +7,7 @@ #define BOOST_MATH_BN_MPFR_HPP #include +#include #include #include #include @@ -244,6 +245,48 @@ struct mpfr_float_backend : public detail::mpfr_float_imp #ifndef BOOST_NO_RVALUE_REFERENCES mpfr_float_backend(mpfr_float_backend&& o) : detail::mpfr_float_imp(o) {} #endif + template + mpfr_float_backend(const mpfr_float_backend& val) + { + mpfr_init2(this->m_data, ((digits10 + 1) * 1000L) / 301L); + mpfr_set(this->m_data, val.data(), GMP_RNDN); + } + template + mpfr_float_backend(const gmp_float& val) + { + mpfr_init2(this->m_data, ((digits10 + 1) * 1000L) / 301L); + mpfr_set_f(this->m_data, val.data(), GMP_RNDN); + } + mpfr_float_backend(const gmp_int& val) + { + mpfr_init2(this->m_data, ((digits10 + 1) * 1000L) / 301L); + mpfr_set_z(this->m_data, val.data(), GMP_RNDN); + } + mpfr_float_backend(const gmp_rational& val) + { + mpfr_init2(this->m_data, ((digits10 + 1) * 1000L) / 301L); + mpfr_set_q(this->m_data, val.data(), GMP_RNDN); + } + mpfr_float_backend(mpfr_t val) + { + mpfr_init2(this->m_data, ((digits10 + 1) * 1000L) / 301L); + mpfr_set(this->m_data, val, GMP_RNDN); + } + mpfr_float_backend(mpf_t val) + { + mpfr_init2(this->m_data, ((digits10 + 1) * 1000L) / 301L); + mpfr_set_f(this->m_data, val, GMP_RNDN); + } + mpfr_float_backend(mpz_t val) + { + mpfr_init2(this->m_data, ((digits10 + 1) * 1000L) / 301L); + mpfr_set_z(this->m_data, val, GMP_RNDN); + } + mpfr_float_backend(mpq_t val) + { + mpfr_init2(this->m_data, ((digits10 + 1) * 1000L) / 301L); + mpfr_set_q(this->m_data, val, GMP_RNDN); + } mpfr_float_backend& operator=(const mpfr_float_backend& o) { *static_cast*>(this) = static_cast const&>(o); @@ -262,6 +305,48 @@ struct mpfr_float_backend : public detail::mpfr_float_imp *static_cast*>(this) = v; return *this; } + mpfr_float_backend& operator=(const mpfr_t& val) + { + mpfr_set(this->m_data, val, GMP_RNDN); + return *this; + } + mpfr_float_backend& operator=(const mpf_t& val) + { + mpfr_set_f(this->m_data, val, GMP_RNDN); + return *this; + } + mpfr_float_backend& operator=(const mpz_t& val) + { + mpfr_set_z(this->m_data, val, GMP_RNDN); + return *this; + } + mpfr_float_backend& operator=(const mpq_t& val) + { + mpfr_set_q(this->m_data, val, GMP_RNDN); + return *this; + } + template + mpfr_float_backend& operator=(const mpfr_float_backend& val) + { + mpfr_set(this->m_data, val.data(), GMP_RNDN); + return *this; + } + template + mpfr_float_backend& operator=(const gmp_float& val) + { + mpfr_set_f(this->m_data, val.data(), GMP_RNDN); + return *this; + } + mpfr_float_backend& operator=(const gmp_int& val) + { + mpfr_set_z(this->m_data, val.data(), GMP_RNDN); + return *this; + } + mpfr_float_backend& operator=(const gmp_rational& val) + { + mpfr_set_q(this->m_data, val.data(), GMP_RNDN); + return *this; + } }; template <> @@ -275,6 +360,26 @@ struct mpfr_float_backend<0> : public detail::mpfr_float_imp<0> { mpfr_init2(this->m_data, ((digits10 + 1) * 1000L) / 301L); } + mpfr_float_backend(mpfr_t val) + { + mpfr_init2(this->m_data, ((get_default_precision() + 1) * 1000L) / 301L); + mpfr_set(this->m_data, val, GMP_RNDN); + } + mpfr_float_backend(mpf_t val) + { + mpfr_init2(this->m_data, ((get_default_precision() + 1) * 1000L) / 301L); + mpfr_set_f(this->m_data, val, GMP_RNDN); + } + mpfr_float_backend(mpz_t val) + { + mpfr_init2(this->m_data, ((get_default_precision() + 1) * 1000L) / 301L); + mpfr_set_z(this->m_data, val, GMP_RNDN); + } + mpfr_float_backend(mpq_t val) + { + mpfr_init2(this->m_data, ((get_default_precision() + 1) * 1000L) / 301L); + mpfr_set_q(this->m_data, val, GMP_RNDN); + } mpfr_float_backend(const mpfr_float_backend& o) : detail::mpfr_float_imp<0>(o) {} #ifndef BOOST_NO_RVALUE_REFERENCES mpfr_float_backend(mpfr_float_backend&& o) : detail::mpfr_float_imp<0>(o) {} @@ -284,6 +389,28 @@ struct mpfr_float_backend<0> : public detail::mpfr_float_imp<0> mpfr_init2(this->m_data, ((digits10 + 1) * 1000L) / 301L); *this = o; } + template + mpfr_float_backend(const mpfr_float_backend& val) + { + mpfr_init2(this->m_data, ((get_default_precision() + 1) * 1000L) / 301L); + mpfr_set(this->m_data, val.data(), GMP_RNDN); + } + template + mpfr_float_backend(const gmp_float& val) + { + mpfr_init2(this->m_data, ((digits10 + 1) * 1000L) / 301L); + mpfr_set_f(this->m_data, val.data(), GMP_RNDN); + } + mpfr_float_backend(const gmp_int& val) + { + mpfr_init2(this->m_data, ((get_default_precision() + 1) * 1000L) / 301L); + mpfr_set_z(this->m_data, val.data(), GMP_RNDN); + } + mpfr_float_backend(const gmp_rational& val) + { + mpfr_init2(this->m_data, ((get_default_precision() + 1) * 1000L) / 301L); + mpfr_set_q(this->m_data, val.data(), GMP_RNDN); + } mpfr_float_backend& operator=(const mpfr_float_backend& o) { @@ -303,6 +430,48 @@ struct mpfr_float_backend<0> : public detail::mpfr_float_imp<0> *static_cast*>(this) = v; return *this; } + mpfr_float_backend& operator=(const mpfr_t& val) + { + mpfr_set(this->m_data, val, GMP_RNDN); + return *this; + } + mpfr_float_backend& operator=(const mpf_t& val) + { + mpfr_set_f(this->m_data, val, GMP_RNDN); + return *this; + } + mpfr_float_backend& operator=(const mpz_t& val) + { + mpfr_set_z(this->m_data, val, GMP_RNDN); + return *this; + } + mpfr_float_backend& operator=(const mpq_t& val) + { + mpfr_set_q(this->m_data, val, GMP_RNDN); + return *this; + } + template + mpfr_float_backend& operator=(const mpfr_float_backend& val) + { + mpfr_set(this->m_data, val.data(), GMP_RNDN); + return *this; + } + template + mpfr_float_backend& operator=(const gmp_float& val) + { + mpfr_set_f(this->m_data, val.data(), GMP_RNDN); + return *this; + } + mpfr_float_backend& operator=(const gmp_int& val) + { + mpfr_set_z(this->m_data, val.data(), GMP_RNDN); + return *this; + } + mpfr_float_backend& operator=(const gmp_rational& val) + { + mpfr_set_q(this->m_data, val.data(), GMP_RNDN); + return *this; + } static unsigned default_precision() { return get_default_precision();