From 16992622e9a1cb43d771b3fdc597ebb367b60ac1 Mon Sep 17 00:00:00 2001 From: ckormanyos Date: Sat, 6 Sep 2025 13:51:02 +0200 Subject: [PATCH] Clarify matters of syntax --- .../boost/multiprecision/cpp_dec_float.hpp | 13 +++++- test/git_issue_734.cpp | 40 ++++++++++++++----- 2 files changed, 40 insertions(+), 13 deletions(-) diff --git a/include/boost/multiprecision/cpp_dec_float.hpp b/include/boost/multiprecision/cpp_dec_float.hpp index e9ae39f5..79bf0a5a 100644 --- a/include/boost/multiprecision/cpp_dec_float.hpp +++ b/include/boost/multiprecision/cpp_dec_float.hpp @@ -1932,8 +1932,17 @@ std::string cpp_dec_float::str(std::intmax_t } else if (f & std::ios_base::scientific) ++number_of_digits; - // Determine the number of elements needed to provide the requested digits from cpp_dec_float. - const std::size_t number_of_elements = (std::min)(static_cast(static_cast(number_of_digits / static_cast(cpp_dec_float_elem_digits10)) + 2u), + + // Determine the number of elements needed to provide the requested + // digits from cpp_dec_float. + const std::intmax_t + number_of_elements_signed + { + (std::max)(static_cast(number_of_digits / static_cast(cpp_dec_float_elem_digits10) + 2), + std::intmax_t { INT8_C(0) }) + }; + + const std::size_t number_of_elements = (std::min)(static_cast(number_of_elements_signed), static_cast(cpp_dec_float_elem_number)); // Extract the remaining digits from cpp_dec_float after the decimal point. diff --git a/test/git_issue_734.cpp b/test/git_issue_734.cpp index 10fc2ce7..77eb1be9 100644 --- a/test/git_issue_734.cpp +++ b/test/git_issue_734.cpp @@ -10,6 +10,7 @@ #include #include #include +#include namespace local { @@ -18,11 +19,17 @@ auto my_stringify_via_top_level_number(const std::streamsize strm_size) -> std:: { using float_type = boost::multiprecision::number; + #if defined(BOOST_MSVC) + using streamsize_type = std::streamsize; + #else + using streamsize_type = int; + #endif + float_type x("0.0000000000000000222222222222222"); std::stringstream strm { }; - strm << std::setprecision(strm_size) << std::fixed; + strm << std::setprecision(static_cast(strm_size)) << std::fixed; strm << x; return strm.str(); @@ -33,11 +40,17 @@ auto my_stringify_via_str_and_backend_str(const std::streamsize strm_size) -> st { using float_type = boost::multiprecision::number; + #if defined(BOOST_MSVC) + using streamsize_type = std::streamsize; + #else + using streamsize_type = int; + #endif + float_type x("0.0000000000000000222222222222222"); std::stringstream strm { }; - strm << std::setprecision(strm_size) << std::fixed; + strm << std::setprecision(static_cast(strm_size)) << std::fixed; return x.str(strm_size, strm.flags()); } @@ -45,15 +58,17 @@ auto my_stringify_via_str_and_backend_str(const std::streamsize strm_size) -> st template auto test() -> void { - BOOST_TEST(my_stringify_via_top_level_number(0) == "0"); - BOOST_TEST(my_stringify_via_top_level_number(8) == "0.00000000"); - BOOST_TEST(my_stringify_via_top_level_number(12) == "0.000000000000"); - BOOST_TEST(my_stringify_via_top_level_number(31) == "0.0000000000000000222222222222222"); + std::cout << "Testing type of test: " << typeid(BackendType).name() << std::endl; - BOOST_TEST(my_stringify_via_str_and_backend_str(0) == "0"); - BOOST_TEST(my_stringify_via_str_and_backend_str(8) == "0.00000000"); - BOOST_TEST(my_stringify_via_str_and_backend_str(12) == "0.000000000000"); - BOOST_TEST(my_stringify_via_str_and_backend_str(31) == "0.0000000000000000222222222222222"); + BOOST_TEST(my_stringify_via_top_level_number(std::streamsize { INT8_C(0) }) == "0"); + BOOST_TEST(my_stringify_via_top_level_number(std::streamsize { INT8_C(8) }) == "0.00000000"); + BOOST_TEST(my_stringify_via_top_level_number(std::streamsize { INT8_C(12) }) == "0.000000000000"); + BOOST_TEST(my_stringify_via_top_level_number(std::streamsize { INT8_C(31) }) == "0.0000000000000000222222222222222"); + + BOOST_TEST(my_stringify_via_str_and_backend_str(std::streamsize { INT8_C(0) }) == "0"); + BOOST_TEST(my_stringify_via_str_and_backend_str(std::streamsize { INT8_C(8) }) == "0.00000000"); + BOOST_TEST(my_stringify_via_str_and_backend_str(std::streamsize { INT8_C(12) }) == "0.000000000000"); + BOOST_TEST(my_stringify_via_str_and_backend_str(std::streamsize { INT8_C(31) }) == "0.0000000000000000222222222222222"); } } // namespace local @@ -62,7 +77,10 @@ auto main() -> int { local::test>(); local::test>(); - local::test>(); + BOOST_IF_CONSTEXPR(std::numeric_limits::digits >= 53) + { + local::test>(); + } return boost::report_errors(); }