From d0f9dd360ef9b6081e047abbd0eb511bab55ca7f Mon Sep 17 00:00:00 2001 From: ckormanyos Date: Tue, 1 Jul 2025 14:34:42 +0200 Subject: [PATCH] Add more tests and sync runner_2025 --- .../boost/multiprecision/cpp_dec_float.hpp | 2 +- test/test_various_edges_cpp_dec_float.cpp | 105 ++++++++++++++++-- 2 files changed, 99 insertions(+), 8 deletions(-) diff --git a/include/boost/multiprecision/cpp_dec_float.hpp b/include/boost/multiprecision/cpp_dec_float.hpp index a5a5e602..7054440f 100644 --- a/include/boost/multiprecision/cpp_dec_float.hpp +++ b/include/boost/multiprecision/cpp_dec_float.hpp @@ -163,7 +163,7 @@ class cpp_dec_float a.prec_elem = cpp_dec_float_elem_number; return a; - } + } // LCOV_EXCL_LINE public: // Public Constructors diff --git a/test/test_various_edges_cpp_dec_float.cpp b/test/test_various_edges_cpp_dec_float.cpp index 7e97a61b..6903e13c 100644 --- a/test/test_various_edges_cpp_dec_float.cpp +++ b/test/test_various_edges_cpp_dec_float.cpp @@ -86,7 +86,7 @@ namespace local } template - bool test_convert() + bool test_edges() { using float_type = FloatType; @@ -116,19 +116,19 @@ namespace local flt_non_finite = std::numeric_limits::quiet_NaN() * dis(gen); ldbl_non_finite = static_cast(flt_non_finite); - result_non_finite_is_ok = isnan(ldbl_non_finite); + result_non_finite_is_ok = (isnan)(ldbl_non_finite); BOOST_TEST(result_non_finite_is_ok); result_is_ok = (result_non_finite_is_ok && result_is_ok); flt_non_finite = std::numeric_limits::infinity() * dis(gen); ldbl_non_finite = static_cast(flt_non_finite); - result_non_finite_is_ok = isinf(ldbl_non_finite); + result_non_finite_is_ok = (isinf)(ldbl_non_finite); BOOST_TEST(result_non_finite_is_ok); result_is_ok = (result_non_finite_is_ok && result_is_ok); flt_non_finite = std::numeric_limits::infinity() * -dis(gen); ldbl_non_finite = static_cast(flt_non_finite); - result_non_finite_is_ok = (isinf(ldbl_non_finite) && signbit(ldbl_non_finite)); + result_non_finite_is_ok = ((isinf)(ldbl_non_finite) && signbit(ldbl_non_finite)); BOOST_TEST(result_non_finite_is_ok); result_is_ok = (result_non_finite_is_ok && result_is_ok); @@ -136,7 +136,7 @@ namespace local * float_type { (std::numeric_limits::max)() } * dis(gen); ldbl_non_finite = static_cast(flt_non_finite); - result_non_finite_is_ok = isinf(ldbl_non_finite); + result_non_finite_is_ok = (isinf)(ldbl_non_finite); BOOST_TEST(result_non_finite_is_ok); result_is_ok = (result_non_finite_is_ok && result_is_ok); @@ -144,7 +144,7 @@ namespace local * float_type { (std::numeric_limits::max)() } * -dis(gen); ldbl_non_finite = static_cast(flt_non_finite); - result_non_finite_is_ok = (isinf(ldbl_non_finite) && signbit(ldbl_non_finite)); + result_non_finite_is_ok = ((isinf)(ldbl_non_finite) && signbit(ldbl_non_finite)); BOOST_TEST(result_non_finite_is_ok); result_is_ok = (result_non_finite_is_ok && result_is_ok); } @@ -271,6 +271,97 @@ namespace local result_is_ok = (result_funky_strings_is_ok && result_is_ok); } + { + using std::ldexp; + + float_type flt_near_max { ldexp((std::numeric_limits::max)(), -1) }; + + const float_type flt_less_near_max { ldexp((std::numeric_limits::max)(), -4) }; + + unsigned index { }; + + while((index < 128U) && (!(boost::multiprecision::isinf)(flt_near_max))) + { + flt_near_max += (flt_less_near_max * dis(gen)); + + ++index; + } + + const bool result_ovf_is_ok { ((index > 1U) && (index < 128U)) }; + + BOOST_TEST(result_ovf_is_ok); + + result_is_ok = (result_ovf_is_ok && result_is_ok); + } + + { + using std::ldexp; + + float_type flt_near_lowest { -ldexp((std::numeric_limits::max)(), -1) }; + + const float_type flt_less_near_max { ldexp((std::numeric_limits::max)(), -4) }; + + unsigned index { }; + + while((index < 128U) && (!(boost::multiprecision::isinf)(flt_near_lowest))) + { + flt_near_lowest -= (flt_less_near_max * dis(gen)); + + ++index; + } + + const bool result_ovf_is_ok { ((index > 1U) && (index < 128U)) && signbit(flt_near_lowest) }; + + BOOST_TEST(result_ovf_is_ok); + + result_is_ok = (result_ovf_is_ok && result_is_ok); + } + + for(int n_loop = static_cast(INT8_C(-16)); n_loop < static_cast(INT8_C(-8)); ++n_loop) + { + using std::ldexp; + using std::fabs; + + float_type flt_near_max { ldexp((std::numeric_limits::max)(), n_loop) * dis(gen) }; + + unsigned index { }; + + while((index < 128U) && (!(boost::multiprecision::isinf)(flt_near_max))) + { + flt_near_max *= static_cast(INT32_C(2)); + + ++index; + } + + const bool result_ovf_is_ok { ((index > 1U) && (index < 128U)) }; + + BOOST_TEST(result_ovf_is_ok); + + result_is_ok = (result_ovf_is_ok && result_is_ok); + } + + { + for(auto index = static_cast(UINT8_C(0)); index < static_cast(UINT8_C(16)); ++index) + { + static_cast(index); + + const float_type flt_nan_denominator { float_type { std::numeric_limits::quiet_NaN() } * dis(gen) }; + + float_type flt_zero_numerator { ::my_zero() * dis(gen) }; + + const bool + result_div_zero_by_nan_is_ok + { + (boost::multiprecision::isnan)(flt_nan_denominator) + && (boost::multiprecision::isnan)(flt_zero_numerator /= flt_nan_denominator) + }; + + BOOST_TEST(result_div_zero_by_nan_is_ok); + + result_is_ok = (result_div_zero_by_nan_is_ok && result_is_ok); + } + } + return result_is_ok; } @@ -285,7 +376,7 @@ auto main() -> int std::cout << "Testing type: " << typeid(float_type).name() << std::endl; - static_cast(local::test_convert()); + static_cast(local::test_edges()); } return boost::report_errors();