@@ -2087,9 +2087,9 @@ TEST_CASE("bfloat16.general") {
20872087#endif
20882088
20892089template <typename Int>
2090- void integer_multiplication_by_power_of_10_test (Int mantissa,
2091- int decimal_exponent,
2092- double expected) {
2090+ void verify_integer_multiplication_by_power_of_10 (Int mantissa,
2091+ int decimal_exponent,
2092+ double expected) {
20932093 const double actual =
20942094 fast_float::multiply_integer_and_power_of_10 (mantissa, decimal_exponent);
20952095
@@ -2105,34 +2105,41 @@ void integer_multiplication_by_power_of_10_test(Int mantissa,
21052105 CHECK_EQ (actual, expected);
21062106}
21072107
2108- #define verify_integer_multiplication_by_power_of_10 (mantissa, \
2109- decimal_exponent) \
2110- do { \
2111- integer_multiplication_by_power_of_10_test (mantissa, decimal_exponent, \
2112- mantissa##e##decimal_exponent); \
2113- } while (false )
2108+ template <typename Int>
2109+ void verify_integer_multiplication_by_power_of_10 (Int mantissa,
2110+ int decimal_exponent) {
2111+ std::string constructed_string =
2112+ std::to_string (mantissa) + " e" + std::to_string (decimal_exponent);
2113+ double expected_result;
2114+ const auto result = fast_float::from_chars (
2115+ constructed_string.data (),
2116+ constructed_string.data () + constructed_string.size (), expected_result);
2117+ if (result.ec != std::errc ())
2118+ INFO (" Failed to parse: " << constructed_string);
2119+ verify_integer_multiplication_by_power_of_10 (mantissa, decimal_exponent,
2120+ expected_result);
2121+ }
21142122
21152123TEST_CASE (" multiply_integer_and_power_of_10" ) {
21162124 // explicitly verifying API with different types of integers
2117- integer_multiplication_by_power_of_10_test<char >(31 , -1 , 3.1 );
2118- integer_multiplication_by_power_of_10_test<unsigned char >(31 , -1 , 3.1 );
2119- integer_multiplication_by_power_of_10_test<signed char >(31 , -1 , 3.1 );
2120- integer_multiplication_by_power_of_10_test<signed char >(-31 , -1 , -3.1 );
2121- integer_multiplication_by_power_of_10_test<int16_t >(31415 , -4 , 3.1415 );
2122- integer_multiplication_by_power_of_10_test<int16_t >(-31415 , -4 , -3.1415 );
2123- integer_multiplication_by_power_of_10_test<uint16_t >(31415 , -4 , 3.1415 );
2124- integer_multiplication_by_power_of_10_test<int32_t >(314159265 , -8 ,
2125- 3.14159265 );
2126- integer_multiplication_by_power_of_10_test<int32_t >(-314159265 , -8 ,
2127- -3.14159265 );
2128- integer_multiplication_by_power_of_10_test<uint32_t >(3141592653 , -9 ,
2129- 3.141592653 );
2130- integer_multiplication_by_power_of_10_test<int64_t >(3141592653589793238 , -18 ,
2131- 3.141592653589793238 );
2132- integer_multiplication_by_power_of_10_test<int64_t >(-3141592653589793238 , -18 ,
2133- -3.141592653589793238 );
2134- integer_multiplication_by_power_of_10_test<uint64_t >(3141592653589793238 , -18 ,
2135- 3.141592653589793238 );
2125+ verify_integer_multiplication_by_power_of_10<int8_t >(31 , -1 , 3.1 );
2126+ verify_integer_multiplication_by_power_of_10<int8_t >(-31 , -1 , -3.1 );
2127+ verify_integer_multiplication_by_power_of_10<uint8_t >(31 , -1 , 3.1 );
2128+ verify_integer_multiplication_by_power_of_10<int16_t >(31415 , -4 , 3.1415 );
2129+ verify_integer_multiplication_by_power_of_10<int16_t >(-31415 , -4 , -3.1415 );
2130+ verify_integer_multiplication_by_power_of_10<uint16_t >(31415 , -4 , 3.1415 );
2131+ verify_integer_multiplication_by_power_of_10<int32_t >(314159265 , -8 ,
2132+ 3.14159265 );
2133+ verify_integer_multiplication_by_power_of_10<int32_t >(-314159265 , -8 ,
2134+ -3.14159265 );
2135+ verify_integer_multiplication_by_power_of_10<uint32_t >(3141592653 , -9 ,
2136+ 3.141592653 );
2137+ verify_integer_multiplication_by_power_of_10<int64_t >(
2138+ 3141592653589793238 , -18 , 3.141592653589793238 );
2139+ verify_integer_multiplication_by_power_of_10<int64_t >(
2140+ -3141592653589793238 , -18 , -3.141592653589793238 );
2141+ verify_integer_multiplication_by_power_of_10<uint64_t >(
2142+ 3141592653589793238 , -18 , 3.141592653589793238 );
21362143
21372144 for (int mode : {FE_UPWARD, FE_DOWNWARD, FE_TOWARDZERO, FE_TONEAREST}) {
21382145 fesetround (mode);
@@ -2151,48 +2158,78 @@ TEST_CASE("multiply_integer_and_power_of_10") {
21512158 verify_integer_multiplication_by_power_of_10 (-1 , -1 );
21522159 verify_integer_multiplication_by_power_of_10 (-1 , 1 );
21532160 verify_integer_multiplication_by_power_of_10 (1 , -1 );
2154- verify_integer_multiplication_by_power_of_10 (-1 , -1 );
21552161
2156- integer_multiplication_by_power_of_10_test (49406564584124654 , -340 ,
2157- DBL_TRUE_MIN);
2158- integer_multiplication_by_power_of_10_test (22250738585072014 , -324 ,
2159- DBL_MIN);
2160- integer_multiplication_by_power_of_10_test (17976931348623158 , 292 , DBL_MAX);
2162+ verify_integer_multiplication_by_power_of_10 (
2163+ 49406564584124654 , -340 , std::numeric_limits<double >::denorm_min ());
2164+ verify_integer_multiplication_by_power_of_10 (
2165+ 22250738585072014 , -324 , std::numeric_limits<double >::min ());
2166+ verify_integer_multiplication_by_power_of_10 (
2167+ 17976931348623158 , 292 , std::numeric_limits<double >::max ());
21612168
21622169 // DBL_TRUE_MIN / 2 underflows to 0
2163- integer_multiplication_by_power_of_10_test (49406564584124654 / 2 , -340 , 0 .);
2170+ verify_integer_multiplication_by_power_of_10 (49406564584124654 / 2 , -340 ,
2171+ 0 .);
21642172
21652173 // DBL_TRUE_MIN / 2 + 0.0000000000000001e-324 rounds to DBL_TRUE_MIN
2166- integer_multiplication_by_power_of_10_test (49406564584124654 / 2 + 1 , -340 ,
2167- DBL_TRUE_MIN);
2174+ verify_integer_multiplication_by_power_of_10 (
2175+ 49406564584124654 / 2 + 1 , -340 ,
2176+ std::numeric_limits<double >::denorm_min ());
21682177
21692178 // DBL_MAX + 0.0000000000000001e308 overflows to infinity
2170- integer_multiplication_by_power_of_10_test (
2179+ verify_integer_multiplication_by_power_of_10 (
21712180 17976931348623158 + 1 , 292 , std::numeric_limits<double >::infinity ());
2181+ // DBL_MAX + 0.00000000000000001e308 overflows to infinity
2182+ verify_integer_multiplication_by_power_of_10 (
2183+ 179769313486231580 + 1 , 291 , std::numeric_limits<double >::infinity ());
21722184
21732185 // loosely verifying correct rounding of 1 to 64 bits
21742186 // worth of significant digits
21752187 verify_integer_multiplication_by_power_of_10 (1 , 42 );
2188+ verify_integer_multiplication_by_power_of_10 (1 , -42 );
21762189 verify_integer_multiplication_by_power_of_10 (12 , 42 );
2190+ verify_integer_multiplication_by_power_of_10 (12 , -42 );
21772191 verify_integer_multiplication_by_power_of_10 (123 , 42 );
2192+ verify_integer_multiplication_by_power_of_10 (123 , -42 );
21782193 verify_integer_multiplication_by_power_of_10 (1234 , 42 );
2194+ verify_integer_multiplication_by_power_of_10 (1234 , -42 );
21792195 verify_integer_multiplication_by_power_of_10 (12345 , 42 );
2196+ verify_integer_multiplication_by_power_of_10 (12345 , -42 );
21802197 verify_integer_multiplication_by_power_of_10 (123456 , 42 );
2198+ verify_integer_multiplication_by_power_of_10 (123456 , -42 );
21812199 verify_integer_multiplication_by_power_of_10 (1234567 , 42 );
2200+ verify_integer_multiplication_by_power_of_10 (1234567 , -42 );
21822201 verify_integer_multiplication_by_power_of_10 (12345678 , 42 );
2202+ verify_integer_multiplication_by_power_of_10 (12345678 , -42 );
21832203 verify_integer_multiplication_by_power_of_10 (123456789 , 42 );
21842204 verify_integer_multiplication_by_power_of_10 (1234567890 , 42 );
2205+ verify_integer_multiplication_by_power_of_10 (1234567890 , -42 );
21852206 verify_integer_multiplication_by_power_of_10 (12345678901 , 42 );
2207+ verify_integer_multiplication_by_power_of_10 (12345678901 , -42 );
21862208 verify_integer_multiplication_by_power_of_10 (123456789012 , 42 );
2209+ verify_integer_multiplication_by_power_of_10 (123456789012 , -42 );
21872210 verify_integer_multiplication_by_power_of_10 (1234567890123 , 42 );
2211+ verify_integer_multiplication_by_power_of_10 (1234567890123 , -42 );
21882212 verify_integer_multiplication_by_power_of_10 (12345678901234 , 42 );
2213+ verify_integer_multiplication_by_power_of_10 (12345678901234 , -42 );
21892214 verify_integer_multiplication_by_power_of_10 (123456789012345 , 42 );
2215+ verify_integer_multiplication_by_power_of_10 (123456789012345 , -42 );
21902216 verify_integer_multiplication_by_power_of_10 (1234567890123456 , 42 );
2217+ verify_integer_multiplication_by_power_of_10 (1234567890123456 , -42 );
21912218 verify_integer_multiplication_by_power_of_10 (12345678901234567 , 42 );
2219+ verify_integer_multiplication_by_power_of_10 (12345678901234567 , -42 );
21922220 verify_integer_multiplication_by_power_of_10 (123456789012345678 , 42 );
2221+ verify_integer_multiplication_by_power_of_10 (123456789012345678 , -42 );
21932222 verify_integer_multiplication_by_power_of_10 (1234567890123456789 , 42 );
2194- verify_integer_multiplication_by_power_of_10 (12345678901234567890 , 42 );
2195- // ULLONG_MAX
2196- verify_integer_multiplication_by_power_of_10 (18446744073709551615 , 42 );
2223+ verify_integer_multiplication_by_power_of_10 (1234567890123456789 , -42 );
2224+ verify_integer_multiplication_by_power_of_10 (12345678901234567890ull , 42 );
2225+ verify_integer_multiplication_by_power_of_10 (12345678901234567890ull , -42 );
2226+ verify_integer_multiplication_by_power_of_10 (
2227+ std::numeric_limits<int64_t >::max (), 42 );
2228+ verify_integer_multiplication_by_power_of_10 (
2229+ std::numeric_limits<int64_t >::max (), -42 );
2230+ verify_integer_multiplication_by_power_of_10 (
2231+ std::numeric_limits<uint64_t >::max (), 42 );
2232+ verify_integer_multiplication_by_power_of_10 (
2233+ std::numeric_limits<uint64_t >::max (), -42 );
21972234 }
21982235}
0 commit comments