// Copyright 2024 Matt Borland // Distributed under the Boost Software License, Version 1.0. // https://www.boost.org/LICENSE_1_0.txt // // See: https://github.com/boostorg/charconv/issues/166 #include #ifdef BOOST_CHARCONV_HAS_QUADMATH #include #include template void test() { constexpr T value = 3746.348756384763; constexpr int precision = 6; char buffer[1024]; const auto result = boost::charconv::to_chars(buffer, buffer + sizeof(buffer), value, boost::charconv::chars_format::fixed, precision); *result.ptr = '\0'; BOOST_TEST(result.ec == std::errc()); BOOST_TEST_EQ(std::string{buffer}, std::to_string(3746.348756)); } template void rounding() { constexpr T value = 3746.348759784763; constexpr int precision = 6; char buffer[1024]; const auto result = boost::charconv::to_chars(buffer, buffer + sizeof(buffer), value, boost::charconv::chars_format::fixed, precision); *result.ptr = '\0'; BOOST_TEST(result.ec == std::errc()); BOOST_TEST_EQ(std::string{buffer}, std::to_string(3746.348760)); } template void more_rounding() { constexpr T value = 3746.89999999999999999; constexpr int precision = 6; char buffer[1024]; const auto result = boost::charconv::to_chars(buffer, buffer + sizeof(buffer), value, boost::charconv::chars_format::fixed, precision); *result.ptr = '\0'; BOOST_TEST(result.ec == std::errc()); BOOST_TEST_EQ(std::string{buffer}, std::to_string(3746.900000)); } template void full_rounding_test() { constexpr T value = 9999.999999999999999999; constexpr int precision = 6; char buffer[1024]; const auto result = boost::charconv::to_chars(buffer, buffer + sizeof(buffer), value, boost::charconv::chars_format::fixed, precision); *result.ptr = '\0'; BOOST_TEST(result.ec == std::errc()); BOOST_TEST_EQ(std::string{buffer}, std::to_string(10000.000000)); } int main() { test<__float128>(); rounding<__float128>(); more_rounding<__float128>(); full_rounding_test<__float128>(); #ifdef BOOST_CHARCONV_HAS_STDFLOAT128 test(); rounding(); more_rounding(); full_rounding_test(); #endif return boost::report_errors(); } #else int main() { return 0; } #endif