From ec8679d2e584b10b817985bb6fe6facad6cccdc5 Mon Sep 17 00:00:00 2001 From: ckormanyos Date: Sat, 21 Dec 2024 13:25:08 +0100 Subject: [PATCH] Correct read over-large strings and sqrt(INF) --- include/boost/multiprecision/cpp_double_fp.hpp | 14 +++++++++----- test/test_arithmetic.hpp | 5 +++++ 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/include/boost/multiprecision/cpp_double_fp.hpp b/include/boost/multiprecision/cpp_double_fp.hpp index 7b7343d87..20bebfb06 100644 --- a/include/boost/multiprecision/cpp_double_fp.hpp +++ b/include/boost/multiprecision/cpp_double_fp.hpp @@ -1079,7 +1079,11 @@ bool cpp_double_fp_backend::rd_string(const char* pstr) if (is_definitely_inf) { + const bool b_neg { f_dec.isneg() }; + static_cast(operator=(local_double_fp_type::my_value_inf())); + + if (b_neg) { negate(); } } else { @@ -1394,9 +1398,9 @@ constexpr void eval_sqrt(cpp_double_fp_backend& result, const using double_float_type = cpp_double_fp_backend; using local_float_type = typename double_float_type::float_type; - const auto fpc = eval_fpclassify(o); + const int fpc { eval_fpclassify(o) }; - const auto isneg_o = o.isneg(); + const bool isneg_o { o.isneg() }; if ((fpc != FP_NORMAL) || isneg_o) { @@ -1405,14 +1409,14 @@ constexpr void eval_sqrt(cpp_double_fp_backend& result, const result = double_float_type(0); return; } - else if (fpc == FP_NAN) + else if ((fpc == FP_NAN) || isneg_o) { result = double_float_type::my_value_nan(); return; } - else if ((fpc == FP_INFINITE) || isneg_o) + else if (fpc == FP_INFINITE) { - result = double_float_type::my_value_nan(); + result = double_float_type::my_value_inf(); return; } } diff --git a/test/test_arithmetic.hpp b/test/test_arithmetic.hpp index 8b2dc1f8b..6bc741aa9 100644 --- a/test/test_arithmetic.hpp +++ b/test/test_arithmetic.hpp @@ -1213,6 +1213,11 @@ void test_float_funcs(const std::integral_constant&) a = 4; a = sqrt(a); BOOST_CHECK_CLOSE_FRACTION(a, 2, tol); + BOOST_IF_CONSTEXPR(std::numeric_limits::is_specialized && std::numeric_limits::has_infinity) + { + a = std::numeric_limits::infinity(); + BOOST_CHECK((boost::math::isinf)(a)); + } a = 3; a = exp(a); BOOST_CHECK_CLOSE_FRACTION(a, Real(exp(Real(3))), tol);