Add mpfr inter-conversions.

Fix numerator/denominator for rational types.

[SVN r75277]
This commit is contained in:
John Maddock
2011-11-02 17:15:46 +00:00
parent e97c76f66f
commit 8d23cca8cb
2 changed files with 175 additions and 4 deletions

View File

@@ -1510,13 +1510,15 @@ protected:
inline mp_number<gmp_int> numerator(const mp_number<gmp_rational>& val)
{
const __mpz_struct* pz = (mpq_numref(val.backend().data()));
return mp_number<gmp_int>((mpz_t&)pz);
mp_number<gmp_int> result;
mpz_set(result.backend().data(), (mpq_numref(val.backend().data())));
return result;
}
inline mp_number<gmp_int> denominator(const mp_number<gmp_rational>& val)
{
const __mpz_struct* pz = mpq_denref(val.backend().data());
return mp_number<gmp_int>((mpz_t&)pz);
mp_number<gmp_int> result;
mpz_set(result.backend().data(), (mpq_denref(val.backend().data())));
return result;
}
inline void add(gmp_rational& t, const gmp_rational& o)

View File

@@ -7,6 +7,7 @@
#define BOOST_MATH_BN_MPFR_HPP
#include <boost/multiprecision/mp_number.hpp>
#include <boost/multiprecision/gmp.hpp>
#include <boost/math/special_functions/fpclassify.hpp>
#include <boost/cstdint.hpp>
#include <boost/lexical_cast.hpp>
@@ -244,6 +245,48 @@ struct mpfr_float_backend : public detail::mpfr_float_imp<digits10>
#ifndef BOOST_NO_RVALUE_REFERENCES
mpfr_float_backend(mpfr_float_backend&& o) : detail::mpfr_float_imp<digits10>(o) {}
#endif
template <unsigned D>
mpfr_float_backend(const mpfr_float_backend<D>& val)
{
mpfr_init2(this->m_data, ((digits10 + 1) * 1000L) / 301L);
mpfr_set(this->m_data, val.data(), GMP_RNDN);
}
template <unsigned D>
mpfr_float_backend(const gmp_float<D>& 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<detail::mpfr_float_imp<digits10>*>(this) = static_cast<detail::mpfr_float_imp<digits10> const&>(o);
@@ -262,6 +305,48 @@ struct mpfr_float_backend : public detail::mpfr_float_imp<digits10>
*static_cast<detail::mpfr_float_imp<digits10>*>(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 <unsigned D>
mpfr_float_backend& operator=(const mpfr_float_backend<D>& val)
{
mpfr_set(this->m_data, val.data(), GMP_RNDN);
return *this;
}
template <unsigned D>
mpfr_float_backend& operator=(const gmp_float<D>& 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 <unsigned D>
mpfr_float_backend(const mpfr_float_backend<D>& val)
{
mpfr_init2(this->m_data, ((get_default_precision() + 1) * 1000L) / 301L);
mpfr_set(this->m_data, val.data(), GMP_RNDN);
}
template <unsigned D>
mpfr_float_backend(const gmp_float<D>& 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<detail::mpfr_float_imp<0>*>(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 <unsigned D>
mpfr_float_backend& operator=(const mpfr_float_backend<D>& val)
{
mpfr_set(this->m_data, val.data(), GMP_RNDN);
return *this;
}
template <unsigned D>
mpfr_float_backend& operator=(const gmp_float<D>& 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();