Merge pull request #606 from boostorg/mpfr_error_handling

Correct error handling in mpfr specfun overloads.
This commit is contained in:
jzmaddock
2024-03-02 10:14:41 +00:00
committed by GitHub
2 changed files with 16 additions and 2 deletions
@@ -2486,7 +2486,7 @@ void raise_rounding_error(T1, T2, T3, T4, T5)
template <typename T1, typename T2, typename T3, typename T4, typename T5>
void raise_overflow_error(T1, T2, T3, T4, T5)
{
BOOST_MP_THROW_EXCEPTION(std::runtime_error("Overflow error"));
BOOST_MP_THROW_EXCEPTION(std::overflow_error("Overflow error"));
}
template <typename T1, typename T2, typename T3, typename T4, typename T5>
@@ -2495,6 +2495,12 @@ void raise_evaluation_error(T1, T2, T3, T4, T5)
BOOST_MP_THROW_EXCEPTION(std::runtime_error("Evaluation error"));
}
template <typename T1, typename T2, typename T3, typename T4, typename T5>
void raise_domain_error(T1, T2, T3, T4, T5)
{
BOOST_MP_THROW_EXCEPTION(std::domain_error("Domain error"));
}
template <typename T, typename... Args>
struct is_policy
{
+9 -1
View File
@@ -2802,6 +2802,8 @@ inline boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<D
boost::multiprecision::detail::scoped_default_precision<boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType>, ExpressionTemplates> > precision_guard(arg);
boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType>, ExpressionTemplates> result;
if (mpfr_nan_p(arg.backend().data()))
return policies::raise_domain_error("cbrt<%1%>(%1%)", "Input is a NaN", result, Policy());
mpfr_cbrt(result.backend().data(), arg.backend().data(), GMP_RNDN);
if (mpfr_inf_p(result.backend().data()))
return policies::raise_overflow_error<boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType>, ExpressionTemplates> >("cbrt<%1%>(%1%)", nullptr, Policy());
@@ -2821,6 +2823,8 @@ inline boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<D
boost::multiprecision::detail::scoped_default_precision<boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType>, ExpressionTemplates> > precision_guard(arg);
boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType>, ExpressionTemplates> result;
if (mpfr_nan_p(arg.backend().data()))
return policies::raise_domain_error("erf<%1%>(%1%)", "Input is a NaN", result, pol);
mpfr_erf(result.backend().data(), arg.backend().data(), GMP_RNDN);
if (mpfr_inf_p(result.backend().data()))
return policies::raise_overflow_error<boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType>, ExpressionTemplates> >("erf<%1%>(%1%)", nullptr, pol);
@@ -2840,6 +2844,8 @@ inline boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<D
boost::multiprecision::detail::scoped_default_precision<boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType>, ExpressionTemplates> > precision_guard(arg);
boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType>, ExpressionTemplates> result;
if (mpfr_nan_p(arg.backend().data()))
return policies::raise_domain_error("erf<%1%>(%1%)", "Input is a NaN", result, pol);
mpfr_erfc(result.backend().data(), arg.backend().data(), GMP_RNDN);
if (mpfr_inf_p(result.backend().data()))
return policies::raise_overflow_error<boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType>, ExpressionTemplates> >("erfc<%1%>(%1%)", nullptr, pol);
@@ -2859,6 +2865,8 @@ inline boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<D
boost::multiprecision::detail::scoped_default_precision<boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType>, ExpressionTemplates> > precision_guard(arg);
boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType>, ExpressionTemplates> result;
if (mpfr_nan_p(arg.backend().data()))
return policies::raise_domain_error("erf<%1%>(%1%)", "Input is a NaN", result, pol);
mpfr_expm1(result.backend().data(), arg.backend().data(), GMP_RNDN);
if (mpfr_inf_p(result.backend().data()))
return policies::raise_overflow_error<boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType>, ExpressionTemplates> >("expm1<%1%>(%1%)", nullptr, pol);
@@ -2867,7 +2875,7 @@ inline boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<D
return result;
}
template <unsigned Digits10, boost::multiprecision::mpfr_allocation_type AllocateType, boost::multiprecision::expression_template_option ExpressionTemplates>
inline boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType>, ExpressionTemplates> exm1 BOOST_PREVENT_MACRO_SUBSTITUTION(const boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType>, ExpressionTemplates>& arg)
inline boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType>, ExpressionTemplates> expm1 BOOST_PREVENT_MACRO_SUBSTITUTION(const boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType>, ExpressionTemplates>& arg)
{
return expm1(arg, policies::policy<>());
}