1 // Copyright (c) Microsoft Corporation.
2 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
3 
4 #ifndef DOUBLE_FROM_CHARS_TEST_CASES_HPP
5 #define DOUBLE_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 DoubleFromCharsTestCase double_from_chars_test_cases[] = {
13     {"1.000000000000a000", chars_format::hex, 18, errc{}, 0x1.000000000000ap0}, // exact
14     {"1.000000000000a001", chars_format::hex, 18, errc{}, 0x1.000000000000ap0}, // below midpoint, round down
15     {"1.000000000000a800", chars_format::hex, 18, errc{}, 0x1.000000000000ap0}, // midpoint, round down to even
16     {"1.000000000000a801", chars_format::hex, 18, errc{}, 0x1.000000000000bp0}, // above midpoint, round up
17     {"1.000000000000b000", chars_format::hex, 18, errc{}, 0x1.000000000000bp0}, // exact
18     {"1.000000000000b001", chars_format::hex, 18, errc{}, 0x1.000000000000bp0}, // below midpoint, round down
19     {"1.000000000000b800", chars_format::hex, 18, errc{}, 0x1.000000000000cp0}, // midpoint, round up to even
20     {"1.000000000000b801", chars_format::hex, 18, errc{}, 0x1.000000000000cp0}, // above midpoint, round up
21 
22     {"1.00000000000020", chars_format::hex, 16, errc{}, 0x1.0000000000002p0}, // exact
23     {"1.00000000000021", chars_format::hex, 16, errc{}, 0x1.0000000000002p0}, // below midpoint, round down
24     {"1.00000000000028", chars_format::hex, 16, errc{}, 0x1.0000000000002p0}, // midpoint, round down to even
25     {"1.00000000000029", chars_format::hex, 16, errc{}, 0x1.0000000000003p0}, // above midpoint, round up
26     {"1.00000000000030", chars_format::hex, 16, errc{}, 0x1.0000000000003p0}, // exact
27     {"1.00000000000031", chars_format::hex, 16, errc{}, 0x1.0000000000003p0}, // below midpoint, round down
28     {"1.00000000000038", chars_format::hex, 16, errc{}, 0x1.0000000000004p0}, // midpoint, round up to even
29     {"1.00000000000039", chars_format::hex, 16, errc{}, 0x1.0000000000004p0}, // above midpoint, round up
30 
31     {"1.00000000000000044408920985006261616945266723632812500000", chars_format::general, 58, errc{},
32         0x1.0000000000002p0}, // exact
33     {"1.00000000000000045796699765787707292474806308746337890625", chars_format::general, 58, errc{},
34         0x1.0000000000002p0}, // below midpoint, round down
35     {"1.00000000000000055511151231257827021181583404541015624999", chars_format::general, 58, errc{},
36         0x1.0000000000002p0}, // below midpoint, round down
37     {"1.00000000000000055511151231257827021181583404541015625000", chars_format::general, 58, errc{},
38         0x1.0000000000002p0}, // midpoint, round down to even
39     {"1.00000000000000055511151231257827021181583404541015625001", chars_format::general, 58, errc{},
40         0x1.0000000000003p0}, // above midpoint, round up
41     {"1.00000000000000056898930012039272696711122989654541015625", chars_format::general, 58, errc{},
42         0x1.0000000000003p0}, // above midpoint, round up
43     {"1.00000000000000066613381477509392425417900085449218750000", chars_format::general, 58, errc{},
44         0x1.0000000000003p0}, // exact
45     {"1.00000000000000068001160258290838100947439670562744140625", chars_format::general, 58, errc{},
46         0x1.0000000000003p0}, // below midpoint, round down
47     {"1.00000000000000077715611723760957829654216766357421874999", chars_format::general, 58, errc{},
48         0x1.0000000000003p0}, // below midpoint, round down
49     {"1.00000000000000077715611723760957829654216766357421875000", chars_format::general, 58, errc{},
50         0x1.0000000000004p0}, // midpoint, round up to even
51     {"1.00000000000000077715611723760957829654216766357421875001", chars_format::general, 58, errc{},
52         0x1.0000000000004p0}, // above midpoint, round up
53     {"1.00000000000000079103390504542403505183756351470947265625", chars_format::general, 58, errc{},
54         0x1.0000000000004p0}, // above midpoint, round up
55 
56     // https://www.exploringbinary.com/nondeterministic-floating-point-conversions-in-java/
57     {"0.0000008p-1022", chars_format::hex, 15, errc{}, 0x0.0000008p-1022},
58 
59     // VSO-838635 "<charconv>: from_chars() mishandles certain subnormals"
60     // These values change on half-ulp boundaries:
61     // 1 * 2^-1075 ~= 2.47e-324 (half-ulp between zero and min subnormal)
62     // 2 * 2^-1075 ~= 4.94e-324 (min subnormal)
63     // 3 * 2^-1075 ~= 7.41e-324 (half-ulp between min subnormal and next subnormal)
64     // 4 * 2^-1075 ~= 9.88e-324 (next subnormal)
65     {"1."
66      "1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111"
67      "1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111"
68      "1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111"
69      "1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111"
70      "1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111"
71      "1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111"
72      "1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111"
73      "1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111"
74      "1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111"
75      "1111111111111111111e-324",
76         chars_format::scientific, 1007, errc::result_out_of_range, 0x0.0000000000000p+0},
77     {"2."
78      "2222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222"
79      "2222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222"
80      "2222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222"
81      "2222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222"
82      "2222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222"
83      "2222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222"
84      "2222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222"
85      "2222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222"
86      "2222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222"
87      "2222222222222222222e-324",
88         chars_format::scientific, 1007, errc::result_out_of_range, 0x0.0000000000000p+0},
89     {"3."
90      "3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333"
91      "3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333"
92      "3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333"
93      "3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333"
94      "3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333"
95      "3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333"
96      "3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333"
97      "3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333"
98      "3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333"
99      "3333333333333333333e-324",
100         chars_format::scientific, 1007, errc{}, 0x0.0000000000001p-1022},
101     {"4."
102      "4444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444"
103      "4444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444"
104      "4444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444"
105      "4444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444"
106      "4444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444"
107      "4444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444"
108      "4444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444"
109      "4444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444"
110      "4444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444"
111      "4444444444444444444e-324",
112         chars_format::scientific, 1007, errc{}, 0x0.0000000000001p-1022},
113     {"5."
114      "5555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555"
115      "5555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555"
116      "5555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555"
117      "5555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555"
118      "5555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555"
119      "5555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555"
120      "5555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555"
121      "5555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555"
122      "5555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555"
123      "5555555555555555555e-324",
124         chars_format::scientific, 1007, errc{}, 0x0.0000000000001p-1022},
125     {"6."
126      "6666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666"
127      "6666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666"
128      "6666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666"
129      "6666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666"
130      "6666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666"
131      "6666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666"
132      "6666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666"
133      "6666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666"
134      "6666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666"
135      "6666666666666666666e-324",
136         chars_format::scientific, 1007, errc{}, 0x0.0000000000001p-1022},
137     {"7."
138      "7777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777"
139      "7777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777"
140      "7777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777"
141      "7777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777"
142      "7777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777"
143      "7777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777"
144      "7777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777"
145      "7777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777"
146      "7777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777"
147      "7777777777777777777e-324",
148         chars_format::scientific, 1007, errc{}, 0x0.0000000000002p-1022},
149     {"8."
150      "8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888"
151      "8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888"
152      "8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888"
153      "8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888"
154      "8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888"
155      "8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888"
156      "8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888"
157      "8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888"
158      "8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888"
159      "8888888888888888888e-324",
160         chars_format::scientific, 1007, errc{}, 0x0.0000000000002p-1022},
161     {"9."
162      "9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999"
163      "9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999"
164      "9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999"
165      "9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999"
166      "9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999"
167      "9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999"
168      "9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999"
169      "9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999"
170      "9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999"
171      "9999999999999999999e-324",
172         chars_format::scientific, 1007, errc{}, 0x0.0000000000002p-1022},
173 
174     // VSO-852024: Test cases for round-to-nearest, ties-to-even.
175     // Consider the values:
176     // A: 0x1.0000000000000p+0 == 1.0000000000000000000000000000000000000000000000000000
177     // X:    (1 + 2^-53) * 2^0 == 1.00000000000000011102230246251565404236316680908203125
178     // B: 0x1.0000000000001p+0 == 1.0000000000000002220446049250313080847263336181640625
179     // X is equidistant from A and B. Because they're tied for being nearest, we need to round to even.
180     // That means rounding down to A, because A's least significant hexit 0 is even.
181     // However, values between X and B aren't tied - they're simply nearer to B, so they need to round up to B.
182     // We need to handle tricky cases like the digits of X, followed by a million 0 digits, followed by a 1 digit.
183     // Similarly:
184     // E:      0x1.ffffffffffffep+0 == 1.999999999999999555910790149937383830547332763671875
185     // Y: (1 + 1 - 3 * 2^-53) * 2^0 == 1.99999999999999966693309261245303787291049957275390625
186     // F:      0x1.fffffffffffffp+0 == 1.9999999999999997779553950749686919152736663818359375
187     // The hexit E is 14 and even, while F is 15 and odd.
188 
189     // just below (0 + 2^-53) * 2^-1022: decremented last digit, then appended three 9 digits
190     {"0."
191      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
192      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
193      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002470"
194      "3282292062327208828439643411068618252990130716238221279284125033775363510437593264991818081799618989828234772"
195      "2858865463328355177969898199387398005390939063150356595155702263922908583924491051844359318028499365361525003"
196      "1937045767824921936562366986365848075700158576926990370631192827955855133292783433840935197801553124659726357"
197      "9574622766465272827220056374006485499977096599470454020828166226237857393450736339007967761930577506740176324"
198      "6736009689513405355374585166611342237666786041621596804619144672918403005300575308490487653917113865916462395"
199      "2491262365388187963623937328042389101867234849766823508986338858792562830275599565752445550725518931369083625"
200      "4779186948667994968324049705821028513185451396213837722826145437693412532098591327667236328124999",
201         chars_format::fixed, 1080, errc::result_out_of_range, 0x0.0000000000000p+0},
202 
203     // (0 + 2^-53) * 2^-1022 exactly
204     {"0."
205      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
206      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
207      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002470"
208      "3282292062327208828439643411068618252990130716238221279284125033775363510437593264991818081799618989828234772"
209      "2858865463328355177969898199387398005390939063150356595155702263922908583924491051844359318028499365361525003"
210      "1937045767824921936562366986365848075700158576926990370631192827955855133292783433840935197801553124659726357"
211      "9574622766465272827220056374006485499977096599470454020828166226237857393450736339007967761930577506740176324"
212      "6736009689513405355374585166611342237666786041621596804619144672918403005300575308490487653917113865916462395"
213      "2491262365388187963623937328042389101867234849766823508986338858792562830275599565752445550725518931369083625"
214      "4779186948667994968324049705821028513185451396213837722826145437693412532098591327667236328125",
215         chars_format::fixed, 1077, errc::result_out_of_range, 0x0.0000000000000p+0},
216 
217     // (0 + 2^-53) * 2^-1022 exactly, followed by a thousand 0 digits
218     {"0."
219      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
220      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
221      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002470"
222      "3282292062327208828439643411068618252990130716238221279284125033775363510437593264991818081799618989828234772"
223      "2858865463328355177969898199387398005390939063150356595155702263922908583924491051844359318028499365361525003"
224      "1937045767824921936562366986365848075700158576926990370631192827955855133292783433840935197801553124659726357"
225      "9574622766465272827220056374006485499977096599470454020828166226237857393450736339007967761930577506740176324"
226      "6736009689513405355374585166611342237666786041621596804619144672918403005300575308490487653917113865916462395"
227      "2491262365388187963623937328042389101867234849766823508986338858792562830275599565752445550725518931369083625"
228      "4779186948667994968324049705821028513185451396213837722826145437693412532098591327667236328125000000000000000"
229      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
230      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
231      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
232      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
233      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
234      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
235      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
236      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
237      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
238      "0000",
239         chars_format::fixed, 2077, errc::result_out_of_range, 0x0.0000000000000p+0},
240 
241     // above (0 + 2^-53) * 2^-1022: appended a thousand 0 digits followed by a 1 digit
242     {"0."
243      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
244      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
245      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002470"
246      "3282292062327208828439643411068618252990130716238221279284125033775363510437593264991818081799618989828234772"
247      "2858865463328355177969898199387398005390939063150356595155702263922908583924491051844359318028499365361525003"
248      "1937045767824921936562366986365848075700158576926990370631192827955855133292783433840935197801553124659726357"
249      "9574622766465272827220056374006485499977096599470454020828166226237857393450736339007967761930577506740176324"
250      "6736009689513405355374585166611342237666786041621596804619144672918403005300575308490487653917113865916462395"
251      "2491262365388187963623937328042389101867234849766823508986338858792562830275599565752445550725518931369083625"
252      "4779186948667994968324049705821028513185451396213837722826145437693412532098591327667236328125000000000000000"
253      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
254      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
255      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
256      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
257      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
258      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
259      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
260      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
261      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
262      "00001",
263         chars_format::fixed, 2078, errc{}, 0x0.0000000000001p-1022},
264 
265     // above (0 + 2^-53) * 2^-1022: appended a 1 digit
266     {"0."
267      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
268      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
269      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002470"
270      "3282292062327208828439643411068618252990130716238221279284125033775363510437593264991818081799618989828234772"
271      "2858865463328355177969898199387398005390939063150356595155702263922908583924491051844359318028499365361525003"
272      "1937045767824921936562366986365848075700158576926990370631192827955855133292783433840935197801553124659726357"
273      "9574622766465272827220056374006485499977096599470454020828166226237857393450736339007967761930577506740176324"
274      "6736009689513405355374585166611342237666786041621596804619144672918403005300575308490487653917113865916462395"
275      "2491262365388187963623937328042389101867234849766823508986338858792562830275599565752445550725518931369083625"
276      "47791869486679949683240497058210285131854513962138377228261454376934125320985913276672363281251",
277         chars_format::fixed, 1078, errc{}, 0x0.0000000000001p-1022},
278 
279     // above (0 + 2^-53) * 2^-1022: incremented last digit
280     {"0."
281      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
282      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
283      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002470"
284      "3282292062327208828439643411068618252990130716238221279284125033775363510437593264991818081799618989828234772"
285      "2858865463328355177969898199387398005390939063150356595155702263922908583924491051844359318028499365361525003"
286      "1937045767824921936562366986365848075700158576926990370631192827955855133292783433840935197801553124659726357"
287      "9574622766465272827220056374006485499977096599470454020828166226237857393450736339007967761930577506740176324"
288      "6736009689513405355374585166611342237666786041621596804619144672918403005300575308490487653917113865916462395"
289      "2491262365388187963623937328042389101867234849766823508986338858792562830275599565752445550725518931369083625"
290      "4779186948667994968324049705821028513185451396213837722826145437693412532098591327667236328126",
291         chars_format::fixed, 1077, errc{}, 0x0.0000000000001p-1022},
292 
293     // just below (0 + 1 - 3 * 2^-53) * 2^-1022: decremented last digit, then appended three 9 digits
294     {"0."
295      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
296      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
297      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000022250738585072006419"
298      "9176395546258779936602667813027328296362349540005779643539444484102225369938322261431279727704724131030539099"
299      "2976863718870946851468024222968583977359185141028540361975476844303195813273469348201130421165308554532083149"
300      "3676067608324920106709384047261543474082573017216837765643921010648239116172158852475760231303527077156200284"
301      "1775343298712758123539074213191978739083589771549597066404661620550578925994422322342444472859570416955675758"
302      "5423752417124134805999073137808018133811049489046686648944255834488901008259721496147104204399198556535697531"
303      "0055231935448663898095485089604066035268185282450207861510244351362091237759797852153577038777504570568436147"
304      "5530270683064113556748943345076587312006145811358486831521563686919762403704226016998291015624999",
305         chars_format::fixed, 1080, errc{}, 0x0.ffffffffffffep-1022},
306 
307     // (0 + 1 - 3 * 2^-53) * 2^-1022 exactly
308     {"0."
309      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
310      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
311      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000022250738585072006419"
312      "9176395546258779936602667813027328296362349540005779643539444484102225369938322261431279727704724131030539099"
313      "2976863718870946851468024222968583977359185141028540361975476844303195813273469348201130421165308554532083149"
314      "3676067608324920106709384047261543474082573017216837765643921010648239116172158852475760231303527077156200284"
315      "1775343298712758123539074213191978739083589771549597066404661620550578925994422322342444472859570416955675758"
316      "5423752417124134805999073137808018133811049489046686648944255834488901008259721496147104204399198556535697531"
317      "0055231935448663898095485089604066035268185282450207861510244351362091237759797852153577038777504570568436147"
318      "5530270683064113556748943345076587312006145811358486831521563686919762403704226016998291015625",
319         chars_format::fixed, 1077, errc{}, 0x0.ffffffffffffep-1022},
320 
321     // (0 + 1 - 3 * 2^-53) * 2^-1022 exactly, followed by a thousand 0 digits
322     {"0."
323      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
324      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
325      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000022250738585072006419"
326      "9176395546258779936602667813027328296362349540005779643539444484102225369938322261431279727704724131030539099"
327      "2976863718870946851468024222968583977359185141028540361975476844303195813273469348201130421165308554532083149"
328      "3676067608324920106709384047261543474082573017216837765643921010648239116172158852475760231303527077156200284"
329      "1775343298712758123539074213191978739083589771549597066404661620550578925994422322342444472859570416955675758"
330      "5423752417124134805999073137808018133811049489046686648944255834488901008259721496147104204399198556535697531"
331      "0055231935448663898095485089604066035268185282450207861510244351362091237759797852153577038777504570568436147"
332      "5530270683064113556748943345076587312006145811358486831521563686919762403704226016998291015625000000000000000"
333      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
334      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
335      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
336      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
337      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
338      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
339      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
340      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
341      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
342      "0000",
343         chars_format::fixed, 2077, errc{}, 0x0.ffffffffffffep-1022},
344 
345     // above (0 + 1 - 3 * 2^-53) * 2^-1022: appended a thousand 0 digits followed by a 1 digit
346     {"0."
347      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
348      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
349      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000022250738585072006419"
350      "9176395546258779936602667813027328296362349540005779643539444484102225369938322261431279727704724131030539099"
351      "2976863718870946851468024222968583977359185141028540361975476844303195813273469348201130421165308554532083149"
352      "3676067608324920106709384047261543474082573017216837765643921010648239116172158852475760231303527077156200284"
353      "1775343298712758123539074213191978739083589771549597066404661620550578925994422322342444472859570416955675758"
354      "5423752417124134805999073137808018133811049489046686648944255834488901008259721496147104204399198556535697531"
355      "0055231935448663898095485089604066035268185282450207861510244351362091237759797852153577038777504570568436147"
356      "5530270683064113556748943345076587312006145811358486831521563686919762403704226016998291015625000000000000000"
357      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
358      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
359      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
360      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
361      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
362      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
363      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
364      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
365      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
366      "00001",
367         chars_format::fixed, 2078, errc{}, 0x0.fffffffffffffp-1022},
368 
369     // above (0 + 1 - 3 * 2^-53) * 2^-1022: appended a 1 digit
370     {"0."
371      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
372      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
373      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000022250738585072006419"
374      "9176395546258779936602667813027328296362349540005779643539444484102225369938322261431279727704724131030539099"
375      "2976863718870946851468024222968583977359185141028540361975476844303195813273469348201130421165308554532083149"
376      "3676067608324920106709384047261543474082573017216837765643921010648239116172158852475760231303527077156200284"
377      "1775343298712758123539074213191978739083589771549597066404661620550578925994422322342444472859570416955675758"
378      "5423752417124134805999073137808018133811049489046686648944255834488901008259721496147104204399198556535697531"
379      "0055231935448663898095485089604066035268185282450207861510244351362091237759797852153577038777504570568436147"
380      "55302706830641135567489433450765873120061458113584868315215636869197624037042260169982910156251",
381         chars_format::fixed, 1078, errc{}, 0x0.fffffffffffffp-1022},
382 
383     // above (0 + 1 - 3 * 2^-53) * 2^-1022: incremented last digit
384     {"0."
385      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
386      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
387      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000022250738585072006419"
388      "9176395546258779936602667813027328296362349540005779643539444484102225369938322261431279727704724131030539099"
389      "2976863718870946851468024222968583977359185141028540361975476844303195813273469348201130421165308554532083149"
390      "3676067608324920106709384047261543474082573017216837765643921010648239116172158852475760231303527077156200284"
391      "1775343298712758123539074213191978739083589771549597066404661620550578925994422322342444472859570416955675758"
392      "5423752417124134805999073137808018133811049489046686648944255834488901008259721496147104204399198556535697531"
393      "0055231935448663898095485089604066035268185282450207861510244351362091237759797852153577038777504570568436147"
394      "5530270683064113556748943345076587312006145811358486831521563686919762403704226016998291015626",
395         chars_format::fixed, 1077, errc{}, 0x0.fffffffffffffp-1022},
396 
397     // just below (1 + 2^-53) * 2^-1022: decremented last digit, then appended three 9 digits
398     {"0."
399      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
400      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
401      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000022250738585072016301"
402      "2305563795567615250361241457301801308322872404958664760675944619203679411688695321398552054903200090343478188"
403      "4412325572184367563347617020518175998922941393629966742598285899994830148971433555578567693279306015978183162"
404      "1424250679624607852958851992724935776883207324924799248168692322471659649343292587839501022509739575795105716"
405      "0073834364573849432419299709217920738991976169431413149717326525502008499797367678374315520581880443916381057"
406      "2367791175177756227497413804253387084478193655533073867420834526162513029462022730109054820067654020201547112"
407      "0020281397001415752591234401773622442737124681517501897455599786532342558862196115163359241679580296044770649"
408      "4647018477736093430045142168360701364747951396213837722826145437693412532098591327667236328124999",
409         chars_format::fixed, 1080, errc{}, 0x1.0000000000000p-1022},
410 
411     // (1 + 2^-53) * 2^-1022 exactly
412     {"0."
413      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
414      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
415      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000022250738585072016301"
416      "2305563795567615250361241457301801308322872404958664760675944619203679411688695321398552054903200090343478188"
417      "4412325572184367563347617020518175998922941393629966742598285899994830148971433555578567693279306015978183162"
418      "1424250679624607852958851992724935776883207324924799248168692322471659649343292587839501022509739575795105716"
419      "0073834364573849432419299709217920738991976169431413149717326525502008499797367678374315520581880443916381057"
420      "2367791175177756227497413804253387084478193655533073867420834526162513029462022730109054820067654020201547112"
421      "0020281397001415752591234401773622442737124681517501897455599786532342558862196115163359241679580296044770649"
422      "4647018477736093430045142168360701364747951396213837722826145437693412532098591327667236328125",
423         chars_format::fixed, 1077, errc{}, 0x1.0000000000000p-1022},
424 
425     // (1 + 2^-53) * 2^-1022 exactly, followed by a thousand 0 digits
426     {"0."
427      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
428      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
429      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000022250738585072016301"
430      "2305563795567615250361241457301801308322872404958664760675944619203679411688695321398552054903200090343478188"
431      "4412325572184367563347617020518175998922941393629966742598285899994830148971433555578567693279306015978183162"
432      "1424250679624607852958851992724935776883207324924799248168692322471659649343292587839501022509739575795105716"
433      "0073834364573849432419299709217920738991976169431413149717326525502008499797367678374315520581880443916381057"
434      "2367791175177756227497413804253387084478193655533073867420834526162513029462022730109054820067654020201547112"
435      "0020281397001415752591234401773622442737124681517501897455599786532342558862196115163359241679580296044770649"
436      "4647018477736093430045142168360701364747951396213837722826145437693412532098591327667236328125000000000000000"
437      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
438      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
439      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
440      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
441      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
442      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
443      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
444      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
445      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
446      "0000",
447         chars_format::fixed, 2077, errc{}, 0x1.0000000000000p-1022},
448 
449     // above (1 + 2^-53) * 2^-1022: appended a thousand 0 digits followed by a 1 digit
450     {"0."
451      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
452      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
453      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000022250738585072016301"
454      "2305563795567615250361241457301801308322872404958664760675944619203679411688695321398552054903200090343478188"
455      "4412325572184367563347617020518175998922941393629966742598285899994830148971433555578567693279306015978183162"
456      "1424250679624607852958851992724935776883207324924799248168692322471659649343292587839501022509739575795105716"
457      "0073834364573849432419299709217920738991976169431413149717326525502008499797367678374315520581880443916381057"
458      "2367791175177756227497413804253387084478193655533073867420834526162513029462022730109054820067654020201547112"
459      "0020281397001415752591234401773622442737124681517501897455599786532342558862196115163359241679580296044770649"
460      "4647018477736093430045142168360701364747951396213837722826145437693412532098591327667236328125000000000000000"
461      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
462      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
463      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
464      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
465      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
466      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
467      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
468      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
469      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
470      "00001",
471         chars_format::fixed, 2078, errc{}, 0x1.0000000000001p-1022},
472 
473     // above (1 + 2^-53) * 2^-1022: appended a 1 digit
474     {"0."
475      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
476      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
477      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000022250738585072016301"
478      "2305563795567615250361241457301801308322872404958664760675944619203679411688695321398552054903200090343478188"
479      "4412325572184367563347617020518175998922941393629966742598285899994830148971433555578567693279306015978183162"
480      "1424250679624607852958851992724935776883207324924799248168692322471659649343292587839501022509739575795105716"
481      "0073834364573849432419299709217920738991976169431413149717326525502008499797367678374315520581880443916381057"
482      "2367791175177756227497413804253387084478193655533073867420834526162513029462022730109054820067654020201547112"
483      "0020281397001415752591234401773622442737124681517501897455599786532342558862196115163359241679580296044770649"
484      "46470184777360934300451421683607013647479513962138377228261454376934125320985913276672363281251",
485         chars_format::fixed, 1078, errc{}, 0x1.0000000000001p-1022},
486 
487     // above (1 + 2^-53) * 2^-1022: incremented last digit
488     {"0."
489      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
490      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
491      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000022250738585072016301"
492      "2305563795567615250361241457301801308322872404958664760675944619203679411688695321398552054903200090343478188"
493      "4412325572184367563347617020518175998922941393629966742598285899994830148971433555578567693279306015978183162"
494      "1424250679624607852958851992724935776883207324924799248168692322471659649343292587839501022509739575795105716"
495      "0073834364573849432419299709217920738991976169431413149717326525502008499797367678374315520581880443916381057"
496      "2367791175177756227497413804253387084478193655533073867420834526162513029462022730109054820067654020201547112"
497      "0020281397001415752591234401773622442737124681517501897455599786532342558862196115163359241679580296044770649"
498      "4647018477736093430045142168360701364747951396213837722826145437693412532098591327667236328126",
499         chars_format::fixed, 1077, errc{}, 0x1.0000000000001p-1022},
500 
501     // just below (1 + 1 - 3 * 2^-53) * 2^-1022: decremented last digit, then appended three 9 digits
502     {"0."
503      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
504      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
505      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044501477170144020250"
506      "8199667279499186358524265859260511351695091228726223124931264069530541271189424317838013700808305231545782515"
507      "4530323827726959236845743044099361970891187471508150509418060480375117378320411851935338796416115205148741308"
508      "3163272520124606023105869053620631175265621765214646643181420505164043632222668006474326056011713528291579642"
509      "2274554896821334728738317548403413978098469341510556195293821919814730032341053661708792231510873354131880491"
510      "1055533902788485678121901775450062980622457102958163711745945687733011032421168917765671370549738710820782247"
511      "7584250967061891687062782163335299376138075114200886249979505279101870966346394401564490729731565935244123171"
512      "5398102212132212018470035807616260163568645811358486831521563686919762403704226016998291015624999",
513         chars_format::fixed, 1080, errc{}, 0x1.ffffffffffffep-1022},
514 
515     // (1 + 1 - 3 * 2^-53) * 2^-1022 exactly
516     {"0."
517      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
518      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
519      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044501477170144020250"
520      "8199667279499186358524265859260511351695091228726223124931264069530541271189424317838013700808305231545782515"
521      "4530323827726959236845743044099361970891187471508150509418060480375117378320411851935338796416115205148741308"
522      "3163272520124606023105869053620631175265621765214646643181420505164043632222668006474326056011713528291579642"
523      "2274554896821334728738317548403413978098469341510556195293821919814730032341053661708792231510873354131880491"
524      "1055533902788485678121901775450062980622457102958163711745945687733011032421168917765671370549738710820782247"
525      "7584250967061891687062782163335299376138075114200886249979505279101870966346394401564490729731565935244123171"
526      "5398102212132212018470035807616260163568645811358486831521563686919762403704226016998291015625",
527         chars_format::fixed, 1077, errc{}, 0x1.ffffffffffffep-1022},
528 
529     // (1 + 1 - 3 * 2^-53) * 2^-1022 exactly, followed by a thousand 0 digits
530     {"0."
531      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
532      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
533      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044501477170144020250"
534      "8199667279499186358524265859260511351695091228726223124931264069530541271189424317838013700808305231545782515"
535      "4530323827726959236845743044099361970891187471508150509418060480375117378320411851935338796416115205148741308"
536      "3163272520124606023105869053620631175265621765214646643181420505164043632222668006474326056011713528291579642"
537      "2274554896821334728738317548403413978098469341510556195293821919814730032341053661708792231510873354131880491"
538      "1055533902788485678121901775450062980622457102958163711745945687733011032421168917765671370549738710820782247"
539      "7584250967061891687062782163335299376138075114200886249979505279101870966346394401564490729731565935244123171"
540      "5398102212132212018470035807616260163568645811358486831521563686919762403704226016998291015625000000000000000"
541      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
542      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
543      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
544      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
545      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
546      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
547      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
548      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
549      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
550      "0000",
551         chars_format::fixed, 2077, errc{}, 0x1.ffffffffffffep-1022},
552 
553     // above (1 + 1 - 3 * 2^-53) * 2^-1022: appended a thousand 0 digits followed by a 1 digit
554     {"0."
555      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
556      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
557      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044501477170144020250"
558      "8199667279499186358524265859260511351695091228726223124931264069530541271189424317838013700808305231545782515"
559      "4530323827726959236845743044099361970891187471508150509418060480375117378320411851935338796416115205148741308"
560      "3163272520124606023105869053620631175265621765214646643181420505164043632222668006474326056011713528291579642"
561      "2274554896821334728738317548403413978098469341510556195293821919814730032341053661708792231510873354131880491"
562      "1055533902788485678121901775450062980622457102958163711745945687733011032421168917765671370549738710820782247"
563      "7584250967061891687062782163335299376138075114200886249979505279101870966346394401564490729731565935244123171"
564      "5398102212132212018470035807616260163568645811358486831521563686919762403704226016998291015625000000000000000"
565      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
566      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
567      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
568      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
569      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
570      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
571      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
572      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
573      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
574      "00001",
575         chars_format::fixed, 2078, errc{}, 0x1.fffffffffffffp-1022},
576 
577     // above (1 + 1 - 3 * 2^-53) * 2^-1022: appended a 1 digit
578     {"0."
579      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
580      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
581      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044501477170144020250"
582      "8199667279499186358524265859260511351695091228726223124931264069530541271189424317838013700808305231545782515"
583      "4530323827726959236845743044099361970891187471508150509418060480375117378320411851935338796416115205148741308"
584      "3163272520124606023105869053620631175265621765214646643181420505164043632222668006474326056011713528291579642"
585      "2274554896821334728738317548403413978098469341510556195293821919814730032341053661708792231510873354131880491"
586      "1055533902788485678121901775450062980622457102958163711745945687733011032421168917765671370549738710820782247"
587      "7584250967061891687062782163335299376138075114200886249979505279101870966346394401564490729731565935244123171"
588      "53981022121322120184700358076162601635686458113584868315215636869197624037042260169982910156251",
589         chars_format::fixed, 1078, errc{}, 0x1.fffffffffffffp-1022},
590 
591     // above (1 + 1 - 3 * 2^-53) * 2^-1022: incremented last digit
592     {"0."
593      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
594      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
595      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044501477170144020250"
596      "8199667279499186358524265859260511351695091228726223124931264069530541271189424317838013700808305231545782515"
597      "4530323827726959236845743044099361970891187471508150509418060480375117378320411851935338796416115205148741308"
598      "3163272520124606023105869053620631175265621765214646643181420505164043632222668006474326056011713528291579642"
599      "2274554896821334728738317548403413978098469341510556195293821919814730032341053661708792231510873354131880491"
600      "1055533902788485678121901775450062980622457102958163711745945687733011032421168917765671370549738710820782247"
601      "7584250967061891687062782163335299376138075114200886249979505279101870966346394401564490729731565935244123171"
602      "5398102212132212018470035807616260163568645811358486831521563686919762403704226016998291015626",
603         chars_format::fixed, 1077, errc{}, 0x1.fffffffffffffp-1022},
604 
605     // just below (1 + 2^-53) * 2^-33: decremented last digit, then appended three 9 digits
606     {"0.00000000011641532182693482737782207114105741986576081359316958696581423282623291015624999", chars_format::fixed,
607         91, errc{}, 0x1.0000000000000p-33},
608 
609     // (1 + 2^-53) * 2^-33 exactly
610     {"0.00000000011641532182693482737782207114105741986576081359316958696581423282623291015625", chars_format::fixed,
611         88, errc{}, 0x1.0000000000000p-33},
612 
613     // (1 + 2^-53) * 2^-33 exactly, followed by a thousand 0 digits
614     {"0."
615      "0000000001164153218269348273778220711410574198657608135931695869658142328262329101562500000000000000000000000"
616      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
617      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
618      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
619      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
620      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
621      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
622      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
623      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
624      "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
625         chars_format::fixed, 1088, errc{}, 0x1.0000000000000p-33},
626 
627     // above (1 + 2^-53) * 2^-33: appended a thousand 0 digits followed by a 1 digit
628     {"0."
629      "0000000001164153218269348273778220711410574198657608135931695869658142328262329101562500000000000000000000000"
630      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
631      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
632      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
633      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
634      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
635      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
636      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
637      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
638      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001",
639         chars_format::fixed, 1089, errc{}, 0x1.0000000000001p-33},
640 
641     // above (1 + 2^-53) * 2^-33: appended a 1 digit
642     {"0.000000000116415321826934827377822071141057419865760813593169586965814232826232910156251", chars_format::fixed,
643         89, errc{}, 0x1.0000000000001p-33},
644 
645     // above (1 + 2^-53) * 2^-33: incremented last digit
646     {"0.00000000011641532182693482737782207114105741986576081359316958696581423282623291015626", chars_format::fixed,
647         88, errc{}, 0x1.0000000000001p-33},
648 
649     // just below (1 + 1 - 3 * 2^-53) * 2^-33: decremented last digit, then appended three 9 digits
650     {"0.00000000023283064365386959013215878657682774040271755922049123910255730152130126953124999", chars_format::fixed,
651         91, errc{}, 0x1.ffffffffffffep-33},
652 
653     // (1 + 1 - 3 * 2^-53) * 2^-33 exactly
654     {"0.00000000023283064365386959013215878657682774040271755922049123910255730152130126953125", chars_format::fixed,
655         88, errc{}, 0x1.ffffffffffffep-33},
656 
657     // (1 + 1 - 3 * 2^-53) * 2^-33 exactly, followed by a thousand 0 digits
658     {"0."
659      "0000000002328306436538695901321587865768277404027175592204912391025573015213012695312500000000000000000000000"
660      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
661      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
662      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
663      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
664      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
665      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
666      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
667      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
668      "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
669         chars_format::fixed, 1088, errc{}, 0x1.ffffffffffffep-33},
670 
671     // above (1 + 1 - 3 * 2^-53) * 2^-33: appended a thousand 0 digits followed by a 1 digit
672     {"0."
673      "0000000002328306436538695901321587865768277404027175592204912391025573015213012695312500000000000000000000000"
674      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
675      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
676      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
677      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
678      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
679      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
680      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
681      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
682      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001",
683         chars_format::fixed, 1089, errc{}, 0x1.fffffffffffffp-33},
684 
685     // above (1 + 1 - 3 * 2^-53) * 2^-33: appended a 1 digit
686     {"0.000000000232830643653869590132158786576827740402717559220491239102557301521301269531251", chars_format::fixed,
687         89, errc{}, 0x1.fffffffffffffp-33},
688 
689     // above (1 + 1 - 3 * 2^-53) * 2^-33: incremented last digit
690     {"0.00000000023283064365386959013215878657682774040271755922049123910255730152130126953126", chars_format::fixed,
691         88, errc{}, 0x1.fffffffffffffp-33},
692 
693     // just below (1 + 2^-53) * 2^0: decremented last digit, then appended three 9 digits
694     {"1.00000000000000011102230246251565404236316680908203124999", chars_format::fixed, 58, errc{},
695         0x1.0000000000000p+0},
696 
697     // (1 + 2^-53) * 2^0 exactly
698     {"1.00000000000000011102230246251565404236316680908203125", chars_format::fixed, 55, errc{}, 0x1.0000000000000p+0},
699 
700     // (1 + 2^-53) * 2^0 exactly, followed by a thousand 0 digits
701     {"1."
702      "0000000000000001110223024625156540423631668090820312500000000000000000000000000000000000000000000000000000000"
703      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
704      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
705      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
706      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
707      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
708      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
709      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
710      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
711      "000000000000000000000000000000000000000000000000000000000000000000000000",
712         chars_format::fixed, 1055, errc{}, 0x1.0000000000000p+0},
713 
714     // above (1 + 2^-53) * 2^0: appended a thousand 0 digits followed by a 1 digit
715     {"1."
716      "0000000000000001110223024625156540423631668090820312500000000000000000000000000000000000000000000000000000000"
717      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
718      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
719      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
720      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
721      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
722      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
723      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
724      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
725      "0000000000000000000000000000000000000000000000000000000000000000000000001",
726         chars_format::fixed, 1056, errc{}, 0x1.0000000000001p+0},
727 
728     // above (1 + 2^-53) * 2^0: appended a 1 digit
729     {"1.000000000000000111022302462515654042363166809082031251", chars_format::fixed, 56, errc{}, 0x1.0000000000001p+0},
730 
731     // above (1 + 2^-53) * 2^0: incremented last digit
732     {"1.00000000000000011102230246251565404236316680908203126", chars_format::fixed, 55, errc{}, 0x1.0000000000001p+0},
733 
734     // just below (1 + 1 - 3 * 2^-53) * 2^0: decremented last digit, then appended three 9 digits
735     {"1.99999999999999966693309261245303787291049957275390624999", chars_format::fixed, 58, errc{},
736         0x1.ffffffffffffep+0},
737 
738     // (1 + 1 - 3 * 2^-53) * 2^0 exactly
739     {"1.99999999999999966693309261245303787291049957275390625", chars_format::fixed, 55, errc{}, 0x1.ffffffffffffep+0},
740 
741     // (1 + 1 - 3 * 2^-53) * 2^0 exactly, followed by a thousand 0 digits
742     {"1."
743      "9999999999999996669330926124530378729104995727539062500000000000000000000000000000000000000000000000000000000"
744      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
745      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
746      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
747      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
748      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
749      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
750      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
751      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
752      "000000000000000000000000000000000000000000000000000000000000000000000000",
753         chars_format::fixed, 1055, errc{}, 0x1.ffffffffffffep+0},
754 
755     // above (1 + 1 - 3 * 2^-53) * 2^0: appended a thousand 0 digits followed by a 1 digit
756     {"1."
757      "9999999999999996669330926124530378729104995727539062500000000000000000000000000000000000000000000000000000000"
758      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
759      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
760      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
761      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
762      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
763      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
764      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
765      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
766      "0000000000000000000000000000000000000000000000000000000000000000000000001",
767         chars_format::fixed, 1056, errc{}, 0x1.fffffffffffffp+0},
768 
769     // above (1 + 1 - 3 * 2^-53) * 2^0: appended a 1 digit
770     {"1.999999999999999666933092612453037872910499572753906251", chars_format::fixed, 56, errc{}, 0x1.fffffffffffffp+0},
771 
772     // above (1 + 1 - 3 * 2^-53) * 2^0: incremented last digit
773     {"1.99999999999999966693309261245303787291049957275390626", chars_format::fixed, 55, errc{}, 0x1.fffffffffffffp+0},
774 
775     // just below (1 + 2^-53) * 2^33: decremented last digit, then appended three 9 digits
776     {"8589934592.00000095367431640624999", chars_format::fixed, 34, errc{}, 0x1.0000000000000p+33},
777 
778     // (1 + 2^-53) * 2^33 exactly
779     {"8589934592.00000095367431640625", chars_format::fixed, 31, errc{}, 0x1.0000000000000p+33},
780 
781     // (1 + 2^-53) * 2^33 exactly, followed by a thousand 0 digits
782     {"8589934592."
783      "0000009536743164062500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
784      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
785      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
786      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
787      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
788      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
789      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
790      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
791      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
792      "000000000000000000000000000000000000000",
793         chars_format::fixed, 1031, errc{}, 0x1.0000000000000p+33},
794 
795     // above (1 + 2^-53) * 2^33: appended a thousand 0 digits followed by a 1 digit
796     {"8589934592."
797      "0000009536743164062500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
798      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
799      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
800      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
801      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
802      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
803      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
804      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
805      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
806      "0000000000000000000000000000000000000001",
807         chars_format::fixed, 1032, errc{}, 0x1.0000000000001p+33},
808 
809     // above (1 + 2^-53) * 2^33: appended a 1 digit
810     {"8589934592.000000953674316406251", chars_format::fixed, 32, errc{}, 0x1.0000000000001p+33},
811 
812     // above (1 + 2^-53) * 2^33: incremented last digit
813     {"8589934592.00000095367431640626", chars_format::fixed, 31, errc{}, 0x1.0000000000001p+33},
814 
815     // just below (1 + 1 - 3 * 2^-53) * 2^33: decremented last digit, then appended three 9 digits
816     {"17179869183.99999713897705078124999", chars_format::fixed, 35, errc{}, 0x1.ffffffffffffep+33},
817 
818     // (1 + 1 - 3 * 2^-53) * 2^33 exactly
819     {"17179869183.99999713897705078125", chars_format::fixed, 32, errc{}, 0x1.ffffffffffffep+33},
820 
821     // (1 + 1 - 3 * 2^-53) * 2^33 exactly, followed by a thousand 0 digits
822     {"17179869183."
823      "9999971389770507812500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
824      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
825      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
826      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
827      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
828      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
829      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
830      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
831      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
832      "000000000000000000000000000000000000000",
833         chars_format::fixed, 1032, errc{}, 0x1.ffffffffffffep+33},
834 
835     // above (1 + 1 - 3 * 2^-53) * 2^33: appended a thousand 0 digits followed by a 1 digit
836     {"17179869183."
837      "9999971389770507812500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
838      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
839      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
840      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
841      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
842      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
843      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
844      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
845      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
846      "0000000000000000000000000000000000000001",
847         chars_format::fixed, 1033, errc{}, 0x1.fffffffffffffp+33},
848 
849     // above (1 + 1 - 3 * 2^-53) * 2^33: appended a 1 digit
850     {"17179869183.999997138977050781251", chars_format::fixed, 33, errc{}, 0x1.fffffffffffffp+33},
851 
852     // above (1 + 1 - 3 * 2^-53) * 2^33: incremented last digit
853     {"17179869183.99999713897705078126", chars_format::fixed, 32, errc{}, 0x1.fffffffffffffp+33},
854 
855     // just below (1 + 2^-53) * 2^77: decremented last digit, then appended three 9 digits
856     {"151115727451828663615487.999", chars_format::fixed, 28, errc{}, 0x1.0000000000000p+77},
857 
858     // (1 + 2^-53) * 2^77 exactly
859     {"151115727451828663615488", chars_format::fixed, 24, errc{}, 0x1.0000000000000p+77},
860 
861     // (1 + 2^-53) * 2^77 exactly, followed by a thousand 0 digits
862     {"151115727451828663615488."
863      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
864      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
865      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
866      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
867      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
868      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
869      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
870      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
871      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
872      "0000000000000000000",
873         chars_format::fixed, 1025, errc{}, 0x1.0000000000000p+77},
874 
875     // above (1 + 2^-53) * 2^77: appended a thousand 0 digits followed by a 1 digit
876     {"151115727451828663615488."
877      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
878      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
879      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
880      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
881      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
882      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
883      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
884      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
885      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
886      "00000000000000000001",
887         chars_format::fixed, 1026, errc{}, 0x1.0000000000001p+77},
888 
889     // above (1 + 2^-53) * 2^77: appended a 1 digit
890     {"151115727451828663615488.1", chars_format::fixed, 26, errc{}, 0x1.0000000000001p+77},
891 
892     // above (1 + 2^-53) * 2^77: incremented last digit
893     {"151115727451828663615489", chars_format::fixed, 24, errc{}, 0x1.0000000000001p+77},
894 
895     // just below (1 + 1 - 3 * 2^-53) * 2^77: decremented last digit, then appended three 9 digits
896     {"302231454903657243344895.999", chars_format::fixed, 28, errc{}, 0x1.ffffffffffffep+77},
897 
898     // (1 + 1 - 3 * 2^-53) * 2^77 exactly
899     {"302231454903657243344896", chars_format::fixed, 24, errc{}, 0x1.ffffffffffffep+77},
900 
901     // (1 + 1 - 3 * 2^-53) * 2^77 exactly, followed by a thousand 0 digits
902     {"302231454903657243344896."
903      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
904      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
905      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
906      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
907      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
908      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
909      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
910      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
911      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
912      "0000000000000000000",
913         chars_format::fixed, 1025, errc{}, 0x1.ffffffffffffep+77},
914 
915     // above (1 + 1 - 3 * 2^-53) * 2^77: appended a thousand 0 digits followed by a 1 digit
916     {"302231454903657243344896."
917      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
918      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
919      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
920      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
921      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
922      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
923      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
924      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
925      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
926      "00000000000000000001",
927         chars_format::fixed, 1026, errc{}, 0x1.fffffffffffffp+77},
928 
929     // above (1 + 1 - 3 * 2^-53) * 2^77: appended a 1 digit
930     {"302231454903657243344896.1", chars_format::fixed, 26, errc{}, 0x1.fffffffffffffp+77},
931 
932     // above (1 + 1 - 3 * 2^-53) * 2^77: incremented last digit
933     {"302231454903657243344897", chars_format::fixed, 24, errc{}, 0x1.fffffffffffffp+77},
934 
935     // just below (1 + 2^-53) * 2^1023: decremented last digit, then appended three 9 digits
936     {"8988465674311580536566680721305029496276241413130815897397134275615404541548669375241369800602409693534988440"
937      "3114202125541629105369684531108613657287705365884742938136589844238179474556051429647415148697857438797685859"
938      "063890851407391008830874765563025951597582513936655578157348020066364210154316532161708031.999",
939         chars_format::fixed, 312, errc{}, 0x1.0000000000000p+1023},
940 
941     // (1 + 2^-53) * 2^1023 exactly
942     {"8988465674311580536566680721305029496276241413130815897397134275615404541548669375241369800602409693534988440"
943      "3114202125541629105369684531108613657287705365884742938136589844238179474556051429647415148697857438797685859"
944      "063890851407391008830874765563025951597582513936655578157348020066364210154316532161708032",
945         chars_format::fixed, 308, errc{}, 0x1.0000000000000p+1023},
946 
947     // (1 + 2^-53) * 2^1023 exactly, followed by a thousand 0 digits
948     {"8988465674311580536566680721305029496276241413130815897397134275615404541548669375241369800602409693534988440"
949      "3114202125541629105369684531108613657287705365884742938136589844238179474556051429647415148697857438797685859"
950      "063890851407391008830874765563025951597582513936655578157348020066364210154316532161708032."
951      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
952      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
953      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
954      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
955      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
956      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
957      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
958      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
959      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
960      "0000000000000000000",
961         chars_format::fixed, 1309, errc{}, 0x1.0000000000000p+1023},
962 
963     // above (1 + 2^-53) * 2^1023: appended a thousand 0 digits followed by a 1 digit
964     {"8988465674311580536566680721305029496276241413130815897397134275615404541548669375241369800602409693534988440"
965      "3114202125541629105369684531108613657287705365884742938136589844238179474556051429647415148697857438797685859"
966      "063890851407391008830874765563025951597582513936655578157348020066364210154316532161708032."
967      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
968      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
969      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
970      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
971      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
972      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
973      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
974      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
975      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
976      "00000000000000000001",
977         chars_format::fixed, 1310, errc{}, 0x1.0000000000001p+1023},
978 
979     // above (1 + 2^-53) * 2^1023: appended a 1 digit
980     {"8988465674311580536566680721305029496276241413130815897397134275615404541548669375241369800602409693534988440"
981      "3114202125541629105369684531108613657287705365884742938136589844238179474556051429647415148697857438797685859"
982      "063890851407391008830874765563025951597582513936655578157348020066364210154316532161708032.1",
983         chars_format::fixed, 310, errc{}, 0x1.0000000000001p+1023},
984 
985     // above (1 + 2^-53) * 2^1023: incremented last digit
986     {"8988465674311580536566680721305029496276241413130815897397134275615404541548669375241369800602409693534988440"
987      "3114202125541629105369684531108613657287705365884742938136589844238179474556051429647415148697857438797685859"
988      "063890851407391008830874765563025951597582513936655578157348020066364210154316532161708033",
989         chars_format::fixed, 308, errc{}, 0x1.0000000000001p+1023},
990 
991     // just below (1 + 1 - 3 * 2^-53) * 2^1023: decremented last digit, then appended three 9 digits
992     {"1797693134862315608353258760581052985162070023416521662616611746258695532672923265745300992879465492467506314"
993      "9033587701752208710592698796290627760473556921329019091915239418047621712533496094635638726128664019802903779"
994      "9514183602981511756283727771403830521483963923935633133642802139091669457927874464075218943.999",
995         chars_format::fixed, 313, errc{}, 0x1.ffffffffffffep+1023},
996 
997     // (1 + 1 - 3 * 2^-53) * 2^1023 exactly
998     {"1797693134862315608353258760581052985162070023416521662616611746258695532672923265745300992879465492467506314"
999      "9033587701752208710592698796290627760473556921329019091915239418047621712533496094635638726128664019802903779"
1000      "9514183602981511756283727771403830521483963923935633133642802139091669457927874464075218944",
1001         chars_format::fixed, 309, errc{}, 0x1.ffffffffffffep+1023},
1002 
1003     // (1 + 1 - 3 * 2^-53) * 2^1023 exactly, followed by a thousand 0 digits
1004     {"1797693134862315608353258760581052985162070023416521662616611746258695532672923265745300992879465492467506314"
1005      "9033587701752208710592698796290627760473556921329019091915239418047621712533496094635638726128664019802903779"
1006      "9514183602981511756283727771403830521483963923935633133642802139091669457927874464075218944."
1007      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
1008      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
1009      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
1010      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
1011      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
1012      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
1013      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
1014      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
1015      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
1016      "0000000000000000000",
1017         chars_format::fixed, 1310, errc{}, 0x1.ffffffffffffep+1023},
1018 
1019     // above (1 + 1 - 3 * 2^-53) * 2^1023: appended a thousand 0 digits followed by a 1 digit
1020     {"1797693134862315608353258760581052985162070023416521662616611746258695532672923265745300992879465492467506314"
1021      "9033587701752208710592698796290627760473556921329019091915239418047621712533496094635638726128664019802903779"
1022      "9514183602981511756283727771403830521483963923935633133642802139091669457927874464075218944."
1023      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
1024      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
1025      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
1026      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
1027      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
1028      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
1029      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
1030      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
1031      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
1032      "00000000000000000001",
1033         chars_format::fixed, 1311, errc{}, 0x1.fffffffffffffp+1023},
1034 
1035     // above (1 + 1 - 3 * 2^-53) * 2^1023: appended a 1 digit
1036     {"1797693134862315608353258760581052985162070023416521662616611746258695532672923265745300992879465492467506314"
1037      "9033587701752208710592698796290627760473556921329019091915239418047621712533496094635638726128664019802903779"
1038      "9514183602981511756283727771403830521483963923935633133642802139091669457927874464075218944.1",
1039         chars_format::fixed, 311, errc{}, 0x1.fffffffffffffp+1023},
1040 
1041     // above (1 + 1 - 3 * 2^-53) * 2^1023: incremented last digit
1042     {"1797693134862315608353258760581052985162070023416521662616611746258695532672923265745300992879465492467506314"
1043      "9033587701752208710592698796290627760473556921329019091915239418047621712533496094635638726128664019802903779"
1044      "9514183602981511756283727771403830521483963923935633133642802139091669457927874464075218945",
1045         chars_format::fixed, 309, errc{}, 0x1.fffffffffffffp+1023},
1046 
1047     // VSO-852024 also affected hexfloats.
1048     {"0.00000000000008p-1022", chars_format::hex, 22, errc::result_out_of_range, 0x0.0000000000000p+0},
1049     {"0."
1050      "0000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
1051      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
1052      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
1053      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
1054      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
1055      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
1056      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
1057      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
1058      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
1059      "0000000000000000000000000000000001p-1022",
1060         chars_format::hex, 1023, errc{}, 0x0.0000000000001p-1022},
1061 
1062     {"0.ffffffffffffe8p-1022", chars_format::hex, 22, errc{}, 0x0.ffffffffffffep-1022},
1063     {"0."
1064      "ffffffffffffe800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
1065      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
1066      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
1067      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
1068      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
1069      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
1070      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
1071      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
1072      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
1073      "0000000000000000000000000000000001p-1022",
1074         chars_format::hex, 1023, errc{}, 0x0.fffffffffffffp-1022},
1075 
1076     {"1.00000000000008p+0", chars_format::hex, 19, errc{}, 0x1.0000000000000p+0},
1077     {"1."
1078      "0000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
1079      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
1080      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
1081      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
1082      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
1083      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
1084      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
1085      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
1086      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
1087      "0000000000000000000000000000000001p+0",
1088         chars_format::hex, 1020, errc{}, 0x1.0000000000001p+0},
1089 
1090     {"1.ffffffffffffe8p+0", chars_format::hex, 19, errc{}, 0x1.ffffffffffffep+0},
1091     {"1."
1092      "ffffffffffffe800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
1093      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
1094      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
1095      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
1096      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
1097      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
1098      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
1099      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
1100      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
1101      "0000000000000000000000000000000001p+0",
1102         chars_format::hex, 1020, errc{}, 0x1.fffffffffffffp+0},
1103 
1104     {"1.00000000000008p+1023", chars_format::hex, 22, errc{}, 0x1.0000000000000p+1023},
1105     {"1."
1106      "0000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
1107      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
1108      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
1109      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
1110      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
1111      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
1112      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
1113      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
1114      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
1115      "0000000000000000000000000000000001p+1023",
1116         chars_format::hex, 1023, errc{}, 0x1.0000000000001p+1023},
1117 
1118     {"1.ffffffffffffe8p+1023", chars_format::hex, 22, errc{}, 0x1.ffffffffffffep+1023},
1119     {"1."
1120      "ffffffffffffe800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
1121      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
1122      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
1123      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
1124      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
1125      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
1126      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
1127      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
1128      "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
1129      "0000000000000000000000000000000001p+1023",
1130         chars_format::hex, 1023, errc{}, 0x1.fffffffffffffp+1023},
1131 
1132     // VSO-733765 "<charconv>: [Feedback] double std::from_chars behavior on exponent out of range"
1133     // LWG-3081 "Floating point from_chars API does not distinguish between overflow and underflow"
1134     // These test cases exercise every overflow/underflow codepath.
1135     {"1e+1000", chars_format::scientific, 7, errc::result_out_of_range, double_inf},
1136     {"1e-1000", chars_format::scientific, 7, errc::result_out_of_range, 0.0},
1137     {"1.fffffffffffff8p+1023", chars_format::hex, 22, errc::result_out_of_range, double_inf},
1138     {"1e+2000", chars_format::scientific, 7, errc::result_out_of_range, double_inf},
1139     {"1e-2000", chars_format::scientific, 7, errc::result_out_of_range, 0.0},
1140     {"1e+9999", chars_format::scientific, 7, errc::result_out_of_range, double_inf},
1141     {"1e-9999", chars_format::scientific, 7, errc::result_out_of_range, 0.0},
1142     {"10e+5199", chars_format::scientific, 8, errc::result_out_of_range, double_inf},
1143     {"0.001e-5199", chars_format::scientific, 11, errc::result_out_of_range, 0.0},
1144 };
1145 
1146 #endif // DOUBLE_FROM_CHARS_TEST_CASES_HPP
1147