diff options
Diffstat (limited to 'boost/multiprecision/mpfi.hpp')
-rw-r--r-- | boost/multiprecision/mpfi.hpp | 89 |
1 files changed, 88 insertions, 1 deletions
diff --git a/boost/multiprecision/mpfi.hpp b/boost/multiprecision/mpfi.hpp index 00a692981c..b863e31352 100644 --- a/boost/multiprecision/mpfi.hpp +++ b/boost/multiprecision/mpfi.hpp @@ -74,10 +74,12 @@ struct mpfi_float_imp mpfi_float_imp() { mpfi_init2(m_data, multiprecision::detail::digits10_2_2(digits10 ? digits10 : get_default_precision())); + mpfi_set_ui(m_data, 0u); } mpfi_float_imp(unsigned prec) { mpfi_init2(m_data, prec); + mpfi_set_ui(m_data, 0u); } mpfi_float_imp(const mpfi_float_imp& o) @@ -950,6 +952,12 @@ inline void eval_exp(mpfi_float_backend<Digits10>& result, const mpfi_float_back } template <unsigned Digits10> +inline void eval_exp2(mpfi_float_backend<Digits10>& result, const mpfi_float_backend<Digits10>& arg) +{ + mpfi_exp2(result.data(), arg.data()); +} + +template <unsigned Digits10> inline void eval_log(mpfi_float_backend<Digits10>& result, const mpfi_float_backend<Digits10>& arg) { mpfi_log(result.data(), arg.data()); @@ -1022,6 +1030,12 @@ inline void eval_tanh(mpfi_float_backend<Digits10>& result, const mpfi_float_bac } template <unsigned Digits10> +inline void eval_log2(mpfi_float_backend<Digits10>& result, const mpfi_float_backend<Digits10>& arg) +{ + mpfi_log2(result.data(), arg.data()); +} + +template <unsigned Digits10> inline std::size_t hash_value(const mpfi_float_backend<Digits10>& val) { std::size_t result = 0; @@ -1043,6 +1057,33 @@ inline std::size_t hash_value(const mpfi_float_backend<Digits10>& val) return result; } +template <class To, unsigned D> +void generic_interconvert(To& to, const mpfi_float_backend<D>& from, const mpl::int_<number_kind_integer>& to_type, const mpl::int_<number_kind_floating_point>& from_type) +{ + using boost::multiprecision::detail::generic_interconvert; + mpfr_float_backend<D> t; + mpfi_mid(t.data(), from.data()); + generic_interconvert(to, t, to_type, from_type); +} + +template <class To, unsigned D> +void generic_interconvert(To& to, const mpfi_float_backend<D>& from, const mpl::int_<number_kind_rational>& to_type, const mpl::int_<number_kind_floating_point>& from_type) +{ + using boost::multiprecision::detail::generic_interconvert; + mpfr_float_backend<D> t; + mpfi_mid(t.data(), from.data()); + generic_interconvert(to, t, to_type, from_type); +} + +template <class To, unsigned D> +void generic_interconvert(To& to, const mpfi_float_backend<D>& from, const mpl::int_<number_kind_floating_point>& to_type, const mpl::int_<number_kind_floating_point>& from_type) +{ + using boost::multiprecision::detail::generic_interconvert; + mpfr_float_backend<D> t; + mpfi_mid(t.data(), from.data()); + generic_interconvert(to, t, to_type, from_type); +} + } // namespace backends #ifdef BOOST_NO_SFINAE_EXPR @@ -1053,7 +1094,6 @@ template<unsigned D1, unsigned D2> struct is_explicitly_convertible<backends::mpfi_float_backend<D1>, backends::mpfi_float_backend<D2> > : public mpl::true_ {}; } - #endif template<> @@ -1169,6 +1209,53 @@ struct component_type<number<mpfi_float_backend<Digits10>, ExpressionTemplates> typedef number<mpfr_float_backend<Digits10>, ExpressionTemplates> type; }; +// +// Overloaded special functions which call native mpfr routines: +// +template <unsigned Digits10, expression_template_option ExpressionTemplates> +inline boost::multiprecision::number<boost::multiprecision::mpfi_float_backend<Digits10>, ExpressionTemplates> asinh BOOST_PREVENT_MACRO_SUBSTITUTION(const boost::multiprecision::number<boost::multiprecision::mpfi_float_backend<Digits10>, ExpressionTemplates>& arg) +{ + boost::multiprecision::number<boost::multiprecision::mpfi_float_backend<Digits10>, ExpressionTemplates> result; + mpfi_asinh(result.backend().data(), arg.backend().data()); + return BOOST_MP_MOVE(result); +} +template <unsigned Digits10, expression_template_option ExpressionTemplates> +inline boost::multiprecision::number<boost::multiprecision::mpfi_float_backend<Digits10>, ExpressionTemplates> acosh BOOST_PREVENT_MACRO_SUBSTITUTION(const boost::multiprecision::number<boost::multiprecision::mpfi_float_backend<Digits10>, ExpressionTemplates>& arg) +{ + boost::multiprecision::number<boost::multiprecision::mpfi_float_backend<Digits10>, ExpressionTemplates> result; + mpfi_acosh(result.backend().data(), arg.backend().data()); + return BOOST_MP_MOVE(result); +} +template <unsigned Digits10, expression_template_option ExpressionTemplates> +inline boost::multiprecision::number<boost::multiprecision::mpfi_float_backend<Digits10>, ExpressionTemplates> atanh BOOST_PREVENT_MACRO_SUBSTITUTION(const boost::multiprecision::number<boost::multiprecision::mpfi_float_backend<Digits10>, ExpressionTemplates>& arg) +{ + boost::multiprecision::number<boost::multiprecision::mpfi_float_backend<Digits10>, ExpressionTemplates> result; + mpfi_atanh(result.backend().data(), arg.backend().data()); + return BOOST_MP_MOVE(result); +} +template <unsigned Digits10, expression_template_option ExpressionTemplates> +inline boost::multiprecision::number<boost::multiprecision::mpfi_float_backend<Digits10>, ExpressionTemplates> cbrt BOOST_PREVENT_MACRO_SUBSTITUTION(const boost::multiprecision::number<boost::multiprecision::mpfi_float_backend<Digits10>, ExpressionTemplates>& arg) +{ + boost::multiprecision::number<boost::multiprecision::mpfi_float_backend<Digits10>, ExpressionTemplates> result; + mpfi_cbrt(result.backend().data(), arg.backend().data()); + return BOOST_MP_MOVE(result); +} +template <unsigned Digits10, expression_template_option ExpressionTemplates> +inline boost::multiprecision::number<boost::multiprecision::mpfi_float_backend<Digits10>, ExpressionTemplates> expm1 BOOST_PREVENT_MACRO_SUBSTITUTION(const boost::multiprecision::number<boost::multiprecision::mpfi_float_backend<Digits10>, ExpressionTemplates>& arg) +{ + boost::multiprecision::number<boost::multiprecision::mpfi_float_backend<Digits10>, ExpressionTemplates> result; + mpfi_expm1(result.backend().data(), arg.backend().data()); + return BOOST_MP_MOVE(result); +} +template <unsigned Digits10, expression_template_option ExpressionTemplates> +inline boost::multiprecision::number<boost::multiprecision::mpfi_float_backend<Digits10>, ExpressionTemplates> log1p BOOST_PREVENT_MACRO_SUBSTITUTION(const boost::multiprecision::number<boost::multiprecision::mpfi_float_backend<Digits10>, ExpressionTemplates>& arg) +{ + boost::multiprecision::number<boost::multiprecision::mpfi_float_backend<Digits10>, ExpressionTemplates> result; + mpfi_log1p(result.backend().data(), arg.backend().data()); + return BOOST_MP_MOVE(result); +} + + } // namespace multiprecision namespace math{ |