1 // Copyright (c) Microsoft Corporation.
2 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
3 
4 #ifndef FLOAT_FROM_CHARS_TEST_CASES_HPP
5 #define FLOAT_FROM_CHARS_TEST_CASES_HPP
6 
7 #include <charconv>
8 #include <stddef.h>
9 #include <system_error>
10 using namespace std;
11 
12 inline constexpr FloatFromCharsTestCase float_from_chars_test_cases[] = {
13     {"1.a0000400", chars_format::hex, 10, errc{}, 0x1.a00004p0f}, // exact
14     {"1.a0000401", chars_format::hex, 10, errc{}, 0x1.a00004p0f}, // below midpoint, round down
15     {"1.a0000500", chars_format::hex, 10, errc{}, 0x1.a00004p0f}, // midpoint, round down to even
16     {"1.a0000501", chars_format::hex, 10, errc{}, 0x1.a00006p0f}, // above midpoint, round up
17     {"1.a0000600", chars_format::hex, 10, errc{}, 0x1.a00006p0f}, // exact
18     {"1.a0000601", chars_format::hex, 10, errc{}, 0x1.a00006p0f}, // below midpoint, round down
19     {"1.a0000700", chars_format::hex, 10, errc{}, 0x1.a00008p0f}, // midpoint, round up to even
20     {"1.a0000701", chars_format::hex, 10, errc{}, 0x1.a00008p0f}, // above midpoint, round up
21 
22     {"1.0000040", chars_format::hex, 9, errc{}, 0x1.000004p0f}, // exact
23     {"1.0000041", chars_format::hex, 9, errc{}, 0x1.000004p0f}, // below midpoint, round down
24     {"1.0000050", chars_format::hex, 9, errc{}, 0x1.000004p0f}, // midpoint, round down to even
25     {"1.0000051", chars_format::hex, 9, errc{}, 0x1.000006p0f}, // above midpoint, round up
26     {"1.0000060", chars_format::hex, 9, errc{}, 0x1.000006p0f}, // exact
27     {"1.0000061", chars_format::hex, 9, errc{}, 0x1.000006p0f}, // below midpoint, round down
28     {"1.0000070", chars_format::hex, 9, errc{}, 0x1.000008p0f}, // midpoint, round up to even
29     {"1.0000071", chars_format::hex, 9, errc{}, 0x1.000008p0f}, // above midpoint, round up
30 
31     {"1.0000002384185791015625000000", chars_format::general, 30, errc{}, 0x1.000004p0f}, // exact
32     {"1.0000002421438694000244140625", chars_format::general, 30, errc{}, 0x1.000004p0f}, // below midpoint, round down
33     {"1.0000002980232238769531249999", chars_format::general, 30, errc{}, 0x1.000004p0f}, // below midpoint, round down
34     {"1.0000002980232238769531250000", chars_format::general, 30, errc{},
35         0x1.000004p0f}, // midpoint, round down to even
36     {"1.0000002980232238769531250001", chars_format::general, 30, errc{}, 0x1.000006p0f}, // above midpoint, round up
37     {"1.0000003017485141754150390625", chars_format::general, 30, errc{}, 0x1.000006p0f}, // above midpoint, round up
38     {"1.0000003576278686523437500000", chars_format::general, 30, errc{}, 0x1.000006p0f}, // exact
39     {"1.0000003613531589508056640625", chars_format::general, 30, errc{}, 0x1.000006p0f}, // below midpoint, round down
40     {"1.0000004172325134277343749999", chars_format::general, 30, errc{}, 0x1.000006p0f}, // below midpoint, round down
41     {"1.0000004172325134277343750000", chars_format::general, 30, errc{}, 0x1.000008p0f}, // midpoint, round up to even
42     {"1.0000004172325134277343750001", chars_format::general, 30, errc{}, 0x1.000008p0f}, // above midpoint, round up
43     {"1.0000004209578037261962890625", chars_format::general, 30, errc{}, 0x1.000008p0f}, // above midpoint, round up
44 
45     // VSO-838635 "<charconv>: from_chars() mishandles certain subnormals"
46     // This bug didn't actually affect float, but we should have similar test cases.
47     // These values change on half-ulp boundaries:
48     // 1 * 2^-150 ~= 7.01e-46 (half-ulp between zero and min subnormal)
49     // 2 * 2^-150 ~= 1.40e-45 (min subnormal)
50     // 3 * 2^-150 ~= 2.10e-45 (half-ulp between min subnormal and next subnormal)
51     // 4 * 2^-150 ~= 2.80e-45 (next subnormal)
52     {"6."
53      "6666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666"
54      "6666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666"
55      "6666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666"
56      "6666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666"
57      "6666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666"
58      "6666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666"
59      "6666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666"
60      "6666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666"
61      "6666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666"
62      "6666666666666666666e-46",
63         chars_format::scientific, 1006, errc::result_out_of_range, 0x0.000000p+0f},
64     {"7."
65      "7777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777"
66      "7777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777"
67      "7777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777"
68      "7777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777"
69      "7777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777"
70      "7777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777"
71      "7777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777"
72      "7777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777"
73      "7777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777"
74      "7777777777777777777e-46",
75         chars_format::scientific, 1006, errc{}, 0x0.000002p-126f},
76     {"8."
77      "8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888"
78      "8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888"
79      "8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888"
80      "8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888"
81      "8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888"
82      "8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888"
83      "8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888"
84      "8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888"
85      "8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888"
86      "8888888888888888888e-46",
87         chars_format::scientific, 1006, errc{}, 0x0.000002p-126f},
88     {"9."
89      "9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999"
90      "9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999"
91      "9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999"
92      "9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999"
93      "9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999"
94      "9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999"
95      "9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999"
96      "9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999"
97      "9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999"
98      "9999999999999999999e-46",
99         chars_format::scientific, 1006, errc{}, 0x0.000002p-126f},
100     {"1."
101      "1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111"
102      "1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111"
103      "1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111"
104      "1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111"
105      "1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111"
106      "1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111"
107      "1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111"
108      "1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111"
109      "1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111"
110      "1111111111111111111e-45",
111         chars_format::scientific, 1006, errc{}, 0x0.000002p-126f},
112     {"2."
113      "2222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222"
114      "2222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222"
115      "2222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222"
116      "2222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222"
117      "2222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222"
118      "2222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222"
119      "2222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222"
120      "2222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222"
121      "2222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222"
122      "2222222222222222222e-45",
123         chars_format::scientific, 1006, errc{}, 0x0.000004p-126f},
124 
125     // VSO-733765 "<charconv>: [Feedback] double std::from_chars behavior on exponent out of range"
126     // LWG-3081 "Floating point from_chars API does not distinguish between overflow and underflow"
127     // These test cases exercise every overflow/underflow codepath.
128     {"1e+1000", chars_format::scientific, 7, errc::result_out_of_range, float_inf},
129     {"1e-1000", chars_format::scientific, 7, errc::result_out_of_range, 0.0f},
130     {"1.ffffffp+127", chars_format::hex, 13, errc::result_out_of_range, float_inf},
131     {"1e+2000", chars_format::scientific, 7, errc::result_out_of_range, float_inf},
132     {"1e-2000", chars_format::scientific, 7, errc::result_out_of_range, 0.0f},
133     {"1e+9999", chars_format::scientific, 7, errc::result_out_of_range, float_inf},
134     {"1e-9999", chars_format::scientific, 7, errc::result_out_of_range, 0.0f},
135     {"10e+5199", chars_format::scientific, 8, errc::result_out_of_range, float_inf},
136     {"0.001e-5199", chars_format::scientific, 11, errc::result_out_of_range, 0.0f},
137 };
138 
139 #endif // FLOAT_FROM_CHARS_TEST_CASES_HPP
140