From 4239d93dad32a11e4c3829050f8070d456266133 Mon Sep 17 00:00:00 2001 From: jzmaddock Date: Wed, 1 Jun 2022 19:35:36 +0100 Subject: [PATCH] Update multiprecision_float_test.cpp to not overflow type double. Previously the max value for uint1024_t could just squeeze into a double because truncation occurred during the conversion, now that cpp_int performs correctly rounded conversions, overflow occurs, and the computation fails. Changed the problem distribution to use a multiprecision weight type, rather than double. --- test/multiprecision_float_test.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/multiprecision_float_test.cpp b/test/multiprecision_float_test.cpp index bc2a936..2b53483 100644 --- a/libs/random/test/multiprecision_float_test.cpp +++ b/libs/random/test/multiprecision_float_test.cpp @@ -77,7 +77,7 @@ typedef boost::mpl::list < boost::random::lognormal_distribution, boost::random::normal_distribution, #ifndef BOOST_NO_CXX11_EXPLICIT_CONVERSION_OPERATORS - boost::random::piecewise_constant_distribution, + boost::random::piecewise_constant_distribution, boost::random::piecewise_linear_distribution, #endif boost::random::student_t_distribution, From 7561690135c67ecf88c2133bad7680ebd2665c36 Mon Sep 17 00:00:00 2001 From: jzmaddock Date: Wed, 1 Jun 2022 19:32:55 +0100 Subject: [PATCH] Update multiprecision_int_test.cpp to not accidentality overflow type double. Multiprecision now performs correct rounding when converting to double - previously the max value for uint1024_t would just fit in a double if it was truncated. But now that it's correctly rounded it overflows and breaks the calculation. --- test/multiprecision_int_test.cpp | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/test/multiprecision_int_test.cpp b/test/multiprecision_int_test.cpp index 41ec229b5..a861cca39 100644 --- a/libs/random/test/multiprecision_int_test.cpp +++ b/libs/random/test/multiprecision_int_test.cpp @@ -215,8 +215,11 @@ BOOST_AUTO_TEST_CASE_TEMPLATE(discrete_distributions, distribution_type, other_d distribution_type d2; ss >> d2; BOOST_CHECK(d == d2); - - boost::random::independent_bits_engine::digits, boost::multiprecision::uint1024_t > big_random; + // + // The number of digits in the independent_bits_engine must be low enough that we don't overflow + // when converting to a double (see other_distributions declared above). + // + boost::random::independent_bits_engine::digits - 2, boost::multiprecision::uint1024_t > big_random; for(unsigned i = 0; i < 200; ++i) { result_type r = d(big_random);