diff --git a/include/boost/multiprecision/detail/default_ops.hpp b/include/boost/multiprecision/detail/default_ops.hpp index 518da9c4b..57ca234f7 100644 --- a/include/boost/multiprecision/detail/default_ops.hpp +++ b/include/boost/multiprecision/detail/default_ops.hpp @@ -2486,7 +2486,7 @@ void raise_rounding_error(T1, T2, T3, T4, T5) template 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 @@ -2495,6 +2495,12 @@ void raise_evaluation_error(T1, T2, T3, T4, T5) BOOST_MP_THROW_EXCEPTION(std::runtime_error("Evaluation error")); } +template +void raise_domain_error(T1, T2, T3, T4, T5) +{ + BOOST_MP_THROW_EXCEPTION(std::domain_error("Domain error")); +} + template struct is_policy { diff --git a/include/boost/multiprecision/mpfr.hpp b/include/boost/multiprecision/mpfr.hpp index 68282d1b4..cc85553bf 100644 --- a/include/boost/multiprecision/mpfr.hpp +++ b/include/boost/multiprecision/mpfr.hpp @@ -2802,6 +2802,8 @@ inline boost::multiprecision::number, ExpressionTemplates> > precision_guard(arg); boost::multiprecision::number, 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, ExpressionTemplates> >("cbrt<%1%>(%1%)", nullptr, Policy()); @@ -2821,6 +2823,8 @@ inline boost::multiprecision::number, ExpressionTemplates> > precision_guard(arg); boost::multiprecision::number, 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, ExpressionTemplates> >("erf<%1%>(%1%)", nullptr, pol); @@ -2840,6 +2844,8 @@ inline boost::multiprecision::number, ExpressionTemplates> > precision_guard(arg); boost::multiprecision::number, 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, ExpressionTemplates> >("erfc<%1%>(%1%)", nullptr, pol); @@ -2859,6 +2865,8 @@ inline boost::multiprecision::number, ExpressionTemplates> > precision_guard(arg); boost::multiprecision::number, 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, ExpressionTemplates> >("expm1<%1%>(%1%)", nullptr, pol); @@ -2867,7 +2875,7 @@ inline boost::multiprecision::number -inline boost::multiprecision::number, ExpressionTemplates> exm1 BOOST_PREVENT_MACRO_SUBSTITUTION(const boost::multiprecision::number, ExpressionTemplates>& arg) +inline boost::multiprecision::number, ExpressionTemplates> expm1 BOOST_PREVENT_MACRO_SUBSTITUTION(const boost::multiprecision::number, ExpressionTemplates>& arg) { return expm1(arg, policies::policy<>()); }