1// Copyright (c) Microsoft Corporation.
2// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
3
4
5// Copyright 2018 Ulf Adams
6// Copyright (c) Microsoft Corporation. All rights reserved.
7
8// Boost Software License - Version 1.0 - August 17th, 2003
9
10// Permission is hereby granted, free of charge, to any person or organization
11// obtaining a copy of the software and accompanying documentation covered by
12// this license (the "Software") to use, reproduce, display, distribute,
13// execute, and transmit the Software, and to prepare derivative works of the
14// Software, and to permit third-parties to whom the Software is furnished to
15// do so, all subject to the following:
16
17// The copyright notices in the Software and this entire statement, including
18// the above license grant, this restriction and the following disclaimer,
19// must be included in all copies of the Software, in whole or in part, and
20// all derivative works of the Software, unless such copies or derivative
21// works are solely in the form of machine-executable object code generated by
22// a source language processor.
23
24// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
25// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
26// FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
27// SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
28// FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
29// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
30// DEALINGS IN THE SOFTWARE.
31
32
33// This file contains test cases derived from:
34// https://github.com/ulfjack/ryu
35// See xcharconv_ryu.h for the exact commit.
36// (Keep the cgmanifest.json commitHash in sync.)
37
38
39#ifndef FLOAT_TO_CHARS_TEST_CASES_HPP
40#define FLOAT_TO_CHARS_TEST_CASES_HPP
41
42#include <charconv>
43
44#include "test.hpp"
45using namespace std;
46
47inline constexpr FloatToCharsTestCase float_to_chars_test_cases[] = {
48 // Test special cases (zero, inf, nan) and an ordinary case. Also test negative signs.
49 {.value: 0.0f, .fmt: chars_format::scientific, .correct: "0e+00"},
50 {.value: -0.0f, .fmt: chars_format::scientific, .correct: "-0e+00"},
51 {.value: float_inf, .fmt: chars_format::scientific, .correct: "inf"},
52 {.value: -float_inf, .fmt: chars_format::scientific, .correct: "-inf"},
53 {.value: float_nan, .fmt: chars_format::scientific, .correct: "nan"},
54 {.value: -float_nan, .fmt: chars_format::scientific, .correct: "-nan(ind)"},
55 {.value: float_nan_payload, .fmt: chars_format::scientific, .correct: "nan"},
56 {.value: -float_nan_payload, .fmt: chars_format::scientific, .correct: "-nan"},
57 {.value: 2.018f, .fmt: chars_format::scientific, .correct: "2.018e+00"},
58 {.value: -2.018f, .fmt: chars_format::scientific, .correct: "-2.018e+00"},
59
60 // Ditto for fixed, which doesn't emit exponents.
61 {.value: 0.0f, .fmt: chars_format::fixed, .correct: "0"},
62 {.value: -0.0f, .fmt: chars_format::fixed, .correct: "-0"},
63 {.value: float_inf, .fmt: chars_format::fixed, .correct: "inf"},
64 {.value: -float_inf, .fmt: chars_format::fixed, .correct: "-inf"},
65 {.value: float_nan, .fmt: chars_format::fixed, .correct: "nan"},
66 {.value: -float_nan, .fmt: chars_format::fixed, .correct: "-nan(ind)"},
67 {.value: float_nan_payload, .fmt: chars_format::fixed, .correct: "nan"},
68 {.value: -float_nan_payload, .fmt: chars_format::fixed, .correct: "-nan"},
69 {.value: 2.018f, .fmt: chars_format::fixed, .correct: "2.018"},
70 {.value: -2.018f, .fmt: chars_format::fixed, .correct: "-2.018"},
71
72 // Ditto for general, which selects fixed for the scientific exponent 0.
73 {.value: 0.0f, .fmt: chars_format::general, .correct: "0"},
74 {.value: -0.0f, .fmt: chars_format::general, .correct: "-0"},
75 {.value: float_inf, .fmt: chars_format::general, .correct: "inf"},
76 {.value: -float_inf, .fmt: chars_format::general, .correct: "-inf"},
77 {.value: float_nan, .fmt: chars_format::general, .correct: "nan"},
78 {.value: -float_nan, .fmt: chars_format::general, .correct: "-nan(ind)"},
79 {.value: float_nan_payload, .fmt: chars_format::general, .correct: "nan"},
80 {.value: -float_nan_payload, .fmt: chars_format::general, .correct: "-nan"},
81 {.value: 2.018f, .fmt: chars_format::general, .correct: "2.018"},
82 {.value: -2.018f, .fmt: chars_format::general, .correct: "-2.018"},
83
84 // Ditto for plain, which selects fixed because it's shorter for these values.
85 {.value: 0.0f, .fmt: chars_format{}, .correct: "0"},
86 {.value: -0.0f, .fmt: chars_format{}, .correct: "-0"},
87 {.value: float_inf, .fmt: chars_format{}, .correct: "inf"},
88 {.value: -float_inf, .fmt: chars_format{}, .correct: "-inf"},
89 {.value: float_nan, .fmt: chars_format{}, .correct: "nan"},
90 {.value: -float_nan, .fmt: chars_format{}, .correct: "-nan(ind)"},
91 {.value: float_nan_payload, .fmt: chars_format{}, .correct: "nan"},
92 {.value: -float_nan_payload, .fmt: chars_format{}, .correct: "-nan"},
93 {.value: 2.018f, .fmt: chars_format{}, .correct: "2.018"},
94 {.value: -2.018f, .fmt: chars_format{}, .correct: "-2.018"},
95
96 // Ditto for hex.
97 {.value: 0.0f, .fmt: chars_format::hex, .correct: "0p+0"},
98 {.value: -0.0f, .fmt: chars_format::hex, .correct: "-0p+0"},
99 {.value: float_inf, .fmt: chars_format::hex, .correct: "inf"},
100 {.value: -float_inf, .fmt: chars_format::hex, .correct: "-inf"},
101 {.value: float_nan, .fmt: chars_format::hex, .correct: "nan"},
102 {.value: -float_nan, .fmt: chars_format::hex, .correct: "-nan(ind)"},
103 {.value: float_nan_payload, .fmt: chars_format::hex, .correct: "nan"},
104 {.value: -float_nan_payload, .fmt: chars_format::hex, .correct: "-nan"},
105 {.value: 0x1.729p+0f, .fmt: chars_format::hex, .correct: "1.729p+0"},
106 {.value: -0x1.729p+0f, .fmt: chars_format::hex, .correct: "-1.729p+0"},
107
108 // Ryu f2s_test.cc SwitchToSubnormal
109 {.value: 1.1754944e-38f, .fmt: chars_format::scientific, .correct: "1.1754944e-38"},
110
111 // Ryu f2s_test.cc MinAndMax
112 {.value: 0x1.fffffep+127f, .fmt: chars_format::scientific, .correct: "3.4028235e+38"},
113 {.value: 0x1.000000p-149f, .fmt: chars_format::scientific, .correct: "1e-45"},
114
115 // Ryu f2s_test.cc BoundaryRoundEven
116 {.value: 3.355445e7f, .fmt: chars_format::scientific, .correct: "3.355445e+07"},
117 {.value: 8.999999e9f, .fmt: chars_format::scientific, .correct: "9e+09"},
118 {.value: 3.4366717e10f, .fmt: chars_format::scientific, .correct: "3.436672e+10"},
119
120 // Ryu f2s_test.cc ExactValueRoundEven
121 {.value: 3.0540412e5f, .fmt: chars_format::scientific, .correct: "3.0540412e+05"},
122 {.value: 8.0990312e3f, .fmt: chars_format::scientific, .correct: "8.0990312e+03"},
123
124 // Ryu f2s_test.cc LotsOfTrailingZeros
125 {.value: 2.4414062e-4f, .fmt: chars_format::scientific, .correct: "2.4414062e-04"},
126 {.value: 2.4414062e-3f, .fmt: chars_format::scientific, .correct: "2.4414062e-03"},
127 {.value: 4.3945312e-3f, .fmt: chars_format::scientific, .correct: "4.3945312e-03"},
128 {.value: 6.3476562e-3f, .fmt: chars_format::scientific, .correct: "6.3476562e-03"},
129
130 // Ryu f2s_test.cc Regression
131 {.value: 4.7223665e21f, .fmt: chars_format::scientific, .correct: "4.7223665e+21"},
132 {.value: 8388608.0f, .fmt: chars_format::scientific, .correct: "8.388608e+06"},
133 {.value: 1.6777216e7f, .fmt: chars_format::scientific, .correct: "1.6777216e+07"},
134 {.value: 3.3554436e7f, .fmt: chars_format::scientific, .correct: "3.3554436e+07"},
135 {.value: 6.7131496e7f, .fmt: chars_format::scientific, .correct: "6.7131496e+07"},
136 {.value: 1.9310392e-38f, .fmt: chars_format::scientific, .correct: "1.9310392e-38"},
137 {.value: -2.47e-43f, .fmt: chars_format::scientific, .correct: "-2.47e-43"},
138 {.value: 1.993244e-38f, .fmt: chars_format::scientific, .correct: "1.993244e-38"},
139 {.value: 4103.9003f, .fmt: chars_format::scientific, .correct: "4.1039004e+03"},
140 {.value: 5.3399997e9f, .fmt: chars_format::scientific, .correct: "5.3399997e+09"},
141 {.value: 6.0898e-39f, .fmt: chars_format::scientific, .correct: "6.0898e-39"},
142 {.value: 0.0010310042f, .fmt: chars_format::scientific, .correct: "1.0310042e-03"},
143 {.value: 2.8823261e17f, .fmt: chars_format::scientific, .correct: "2.882326e+17"},
144 {.value: 0x1.5c87fap-84f, .fmt: chars_format::scientific, .correct: "7.038531e-26"}, // TRANSITION, VSO-629490, should be 7.038531e-26f
145 {.value: 9.2234038e17f, .fmt: chars_format::scientific, .correct: "9.223404e+17"},
146 {.value: 6.7108872e7f, .fmt: chars_format::scientific, .correct: "6.710887e+07"},
147 {.value: 1.0e-44f, .fmt: chars_format::scientific, .correct: "1e-44"},
148 {.value: 2.816025e14f, .fmt: chars_format::scientific, .correct: "2.816025e+14"},
149 {.value: 9.223372e18f, .fmt: chars_format::scientific, .correct: "9.223372e+18"},
150 {.value: 1.5846085e29f, .fmt: chars_format::scientific, .correct: "1.5846086e+29"},
151 {.value: 1.1811161e19f, .fmt: chars_format::scientific, .correct: "1.1811161e+19"},
152 {.value: 5.368709e18f, .fmt: chars_format::scientific, .correct: "5.368709e+18"},
153 {.value: 4.6143165e18f, .fmt: chars_format::scientific, .correct: "4.6143166e+18"},
154 {.value: 0.007812537f, .fmt: chars_format::scientific, .correct: "7.812537e-03"},
155 {.value: 1.4e-45f, .fmt: chars_format::scientific, .correct: "1e-45"},
156 {.value: 1.18697724e20f, .fmt: chars_format::scientific, .correct: "1.18697725e+20"},
157 {.value: 1.00014165e-36f, .fmt: chars_format::scientific, .correct: "1.00014165e-36"},
158 {.value: 200.0f, .fmt: chars_format::scientific, .correct: "2e+02"},
159 {.value: 3.3554432e7f, .fmt: chars_format::scientific, .correct: "3.3554432e+07"},
160
161 // Ryu f2s_test.cc LooksLikePow5
162 {.value: 0x1.2a05f2p+59f, .fmt: chars_format::scientific, .correct: "6.7108864e+17"},
163 {.value: 0x1.2a05f2p+60f, .fmt: chars_format::scientific, .correct: "1.3421773e+18"},
164 {.value: 0x1.2a05f2p+61f, .fmt: chars_format::scientific, .correct: "2.6843546e+18"},
165
166 // Ryu f2s_test.cc OutputLength
167 {.value: 1.0f, .fmt: chars_format::scientific, .correct: "1e+00"},
168 {.value: 1.2f, .fmt: chars_format::scientific, .correct: "1.2e+00"},
169 {.value: 1.23f, .fmt: chars_format::scientific, .correct: "1.23e+00"},
170 {.value: 1.234f, .fmt: chars_format::scientific, .correct: "1.234e+00"},
171 {.value: 1.2345f, .fmt: chars_format::scientific, .correct: "1.2345e+00"},
172 {.value: 1.23456f, .fmt: chars_format::scientific, .correct: "1.23456e+00"},
173 {.value: 1.234567f, .fmt: chars_format::scientific, .correct: "1.234567e+00"},
174 {.value: 1.2345678f, .fmt: chars_format::scientific, .correct: "1.2345678e+00"},
175 {.value: 1.23456735e-36f, .fmt: chars_format::scientific, .correct: "1.23456735e-36"},
176
177 // Test all exponents.
178 {.value: 1.729e-45f, .fmt: chars_format::scientific, .correct: "1e-45"},
179 {.value: 1.729e-44f, .fmt: chars_format::scientific, .correct: "1.7e-44"},
180 {.value: 1.729e-43f, .fmt: chars_format::scientific, .correct: "1.72e-43"},
181 {.value: 1.729e-42f, .fmt: chars_format::scientific, .correct: "1.729e-42"},
182 {.value: 1.729e-41f, .fmt: chars_format::scientific, .correct: "1.729e-41"},
183 {.value: 1.729e-40f, .fmt: chars_format::scientific, .correct: "1.729e-40"},
184 {.value: 1.729e-39f, .fmt: chars_format::scientific, .correct: "1.729e-39"},
185 {.value: 1.729e-38f, .fmt: chars_format::scientific, .correct: "1.729e-38"},
186 {.value: 1.729e-37f, .fmt: chars_format::scientific, .correct: "1.729e-37"},
187 {.value: 1.729e-36f, .fmt: chars_format::scientific, .correct: "1.729e-36"},
188 {.value: 1.729e-35f, .fmt: chars_format::scientific, .correct: "1.729e-35"},
189 {.value: 1.729e-34f, .fmt: chars_format::scientific, .correct: "1.729e-34"},
190 {.value: 1.729e-33f, .fmt: chars_format::scientific, .correct: "1.729e-33"},
191 {.value: 1.729e-32f, .fmt: chars_format::scientific, .correct: "1.729e-32"},
192 {.value: 1.729e-31f, .fmt: chars_format::scientific, .correct: "1.729e-31"},
193 {.value: 1.729e-30f, .fmt: chars_format::scientific, .correct: "1.729e-30"},
194 {.value: 1.729e-29f, .fmt: chars_format::scientific, .correct: "1.729e-29"},
195 {.value: 1.729e-28f, .fmt: chars_format::scientific, .correct: "1.729e-28"},
196 {.value: 1.729e-27f, .fmt: chars_format::scientific, .correct: "1.729e-27"},
197 {.value: 1.729e-26f, .fmt: chars_format::scientific, .correct: "1.729e-26"},
198 {.value: 1.729e-25f, .fmt: chars_format::scientific, .correct: "1.729e-25"},
199 {.value: 1.729e-24f, .fmt: chars_format::scientific, .correct: "1.729e-24"},
200 {.value: 1.729e-23f, .fmt: chars_format::scientific, .correct: "1.729e-23"},
201 {.value: 1.729e-22f, .fmt: chars_format::scientific, .correct: "1.729e-22"},
202 {.value: 1.729e-21f, .fmt: chars_format::scientific, .correct: "1.729e-21"},
203 {.value: 1.729e-20f, .fmt: chars_format::scientific, .correct: "1.729e-20"},
204 {.value: 1.729e-19f, .fmt: chars_format::scientific, .correct: "1.729e-19"},
205 {.value: 1.729e-18f, .fmt: chars_format::scientific, .correct: "1.729e-18"},
206 {.value: 1.729e-17f, .fmt: chars_format::scientific, .correct: "1.729e-17"},
207 {.value: 1.729e-16f, .fmt: chars_format::scientific, .correct: "1.729e-16"},
208 {.value: 1.729e-15f, .fmt: chars_format::scientific, .correct: "1.729e-15"},
209 {.value: 1.729e-14f, .fmt: chars_format::scientific, .correct: "1.729e-14"},
210 {.value: 1.729e-13f, .fmt: chars_format::scientific, .correct: "1.729e-13"},
211 {.value: 1.729e-12f, .fmt: chars_format::scientific, .correct: "1.729e-12"},
212 {.value: 1.729e-11f, .fmt: chars_format::scientific, .correct: "1.729e-11"},
213 {.value: 1.729e-10f, .fmt: chars_format::scientific, .correct: "1.729e-10"},
214 {.value: 1.729e-9f, .fmt: chars_format::scientific, .correct: "1.729e-09"},
215 {.value: 1.729e-8f, .fmt: chars_format::scientific, .correct: "1.729e-08"},
216 {.value: 1.729e-7f, .fmt: chars_format::scientific, .correct: "1.729e-07"},
217 {.value: 1.729e-6f, .fmt: chars_format::scientific, .correct: "1.729e-06"},
218 {.value: 1.729e-5f, .fmt: chars_format::scientific, .correct: "1.729e-05"},
219 {.value: 1.729e-4f, .fmt: chars_format::scientific, .correct: "1.729e-04"},
220 {.value: 1.729e-3f, .fmt: chars_format::scientific, .correct: "1.729e-03"},
221 {.value: 1.729e-2f, .fmt: chars_format::scientific, .correct: "1.729e-02"},
222 {.value: 1.729e-1f, .fmt: chars_format::scientific, .correct: "1.729e-01"},
223 {.value: 1.729e0f, .fmt: chars_format::scientific, .correct: "1.729e+00"},
224 {.value: 1.729e1f, .fmt: chars_format::scientific, .correct: "1.729e+01"},
225 {.value: 1.729e2f, .fmt: chars_format::scientific, .correct: "1.729e+02"},
226 {.value: 1.729e3f, .fmt: chars_format::scientific, .correct: "1.729e+03"},
227 {.value: 1.729e4f, .fmt: chars_format::scientific, .correct: "1.729e+04"},
228 {.value: 1.729e5f, .fmt: chars_format::scientific, .correct: "1.729e+05"},
229 {.value: 1.729e6f, .fmt: chars_format::scientific, .correct: "1.729e+06"},
230 {.value: 1.729e7f, .fmt: chars_format::scientific, .correct: "1.729e+07"},
231 {.value: 1.729e8f, .fmt: chars_format::scientific, .correct: "1.729e+08"},
232 {.value: 1.729e9f, .fmt: chars_format::scientific, .correct: "1.729e+09"},
233 {.value: 1.729e10f, .fmt: chars_format::scientific, .correct: "1.729e+10"},
234 {.value: 1.729e11f, .fmt: chars_format::scientific, .correct: "1.729e+11"},
235 {.value: 1.729e12f, .fmt: chars_format::scientific, .correct: "1.729e+12"},
236 {.value: 1.729e13f, .fmt: chars_format::scientific, .correct: "1.729e+13"},
237 {.value: 1.729e14f, .fmt: chars_format::scientific, .correct: "1.729e+14"},
238 {.value: 1.729e15f, .fmt: chars_format::scientific, .correct: "1.729e+15"},
239 {.value: 1.729e16f, .fmt: chars_format::scientific, .correct: "1.729e+16"},
240 {.value: 1.729e17f, .fmt: chars_format::scientific, .correct: "1.729e+17"},
241 {.value: 1.729e18f, .fmt: chars_format::scientific, .correct: "1.729e+18"},
242 {.value: 1.729e19f, .fmt: chars_format::scientific, .correct: "1.729e+19"},
243 {.value: 1.729e20f, .fmt: chars_format::scientific, .correct: "1.729e+20"},
244 {.value: 1.729e21f, .fmt: chars_format::scientific, .correct: "1.729e+21"},
245 {.value: 1.729e22f, .fmt: chars_format::scientific, .correct: "1.729e+22"},
246 {.value: 1.729e23f, .fmt: chars_format::scientific, .correct: "1.729e+23"},
247 {.value: 1.729e24f, .fmt: chars_format::scientific, .correct: "1.729e+24"},
248 {.value: 1.729e25f, .fmt: chars_format::scientific, .correct: "1.729e+25"},
249 {.value: 1.729e26f, .fmt: chars_format::scientific, .correct: "1.729e+26"},
250 {.value: 1.729e27f, .fmt: chars_format::scientific, .correct: "1.729e+27"},
251 {.value: 1.729e28f, .fmt: chars_format::scientific, .correct: "1.729e+28"},
252 {.value: 1.729e29f, .fmt: chars_format::scientific, .correct: "1.729e+29"},
253 {.value: 1.729e30f, .fmt: chars_format::scientific, .correct: "1.729e+30"},
254 {.value: 1.729e31f, .fmt: chars_format::scientific, .correct: "1.729e+31"},
255 {.value: 1.729e32f, .fmt: chars_format::scientific, .correct: "1.729e+32"},
256 {.value: 1.729e33f, .fmt: chars_format::scientific, .correct: "1.729e+33"},
257 {.value: 1.729e34f, .fmt: chars_format::scientific, .correct: "1.729e+34"},
258 {.value: 1.729e35f, .fmt: chars_format::scientific, .correct: "1.729e+35"},
259 {.value: 1.729e36f, .fmt: chars_format::scientific, .correct: "1.729e+36"},
260 {.value: 1.729e37f, .fmt: chars_format::scientific, .correct: "1.729e+37"},
261 {.value: 1.729e38f, .fmt: chars_format::scientific, .correct: "1.729e+38"},
262
263 // Test all of the cases for fixed notation, including the non-Ryu fallback for large integers.
264 {.value: 1.729e-4f, .fmt: chars_format::fixed, .correct: "0.0001729"},
265 {.value: 1.729e-3f, .fmt: chars_format::fixed, .correct: "0.001729"},
266 {.value: 1.729e-2f, .fmt: chars_format::fixed, .correct: "0.01729"},
267 {.value: 1.729e-1f, .fmt: chars_format::fixed, .correct: "0.1729"},
268 {.value: 1.729e0f, .fmt: chars_format::fixed, .correct: "1.729"},
269 {.value: 1.729e1f, .fmt: chars_format::fixed, .correct: "17.29"},
270 {.value: 1.729e2f, .fmt: chars_format::fixed, .correct: "172.9"},
271 {.value: 1.729e3f, .fmt: chars_format::fixed, .correct: "1729"},
272 {.value: 1.729e4f, .fmt: chars_format::fixed, .correct: "17290"},
273 {.value: 1.729e5f, .fmt: chars_format::fixed, .correct: "172900"},
274 {.value: 1.729e6f, .fmt: chars_format::fixed, .correct: "1729000"},
275 {.value: 1.729e7f, .fmt: chars_format::fixed, .correct: "17290000"},
276 {.value: 1.729e8f, .fmt: chars_format::fixed, .correct: "172900000"},
277 {.value: 1.729e9f, .fmt: chars_format::fixed, .correct: "1728999936"},
278 {.value: 1.729e10f, .fmt: chars_format::fixed, .correct: "17290000384"},
279 {.value: 1.729e11f, .fmt: chars_format::fixed, .correct: "172900007936"},
280 {.value: 1.729e12f, .fmt: chars_format::fixed, .correct: "1728999981056"},
281 {.value: 1.729e13f, .fmt: chars_format::fixed, .correct: "17290000072704"},
282 {.value: 1.729e14f, .fmt: chars_format::fixed, .correct: "172899998629888"},
283 {.value: 1.729e15f, .fmt: chars_format::fixed, .correct: "1729000019853312"},
284 {.value: 1.729e16f, .fmt: chars_format::fixed, .correct: "17289999661662208"},
285 {.value: 1.729e17f, .fmt: chars_format::fixed, .correct: "172900007354040320"},
286 {.value: 1.729e18f, .fmt: chars_format::fixed, .correct: "1729000039180664832"},
287 {.value: 1.729e19f, .fmt: chars_format::fixed, .correct: "17289999567172927488"},
288 {.value: 1.729e20f, .fmt: chars_format::fixed, .correct: "172899997870752530432"},
289 {.value: 1.729e21f, .fmt: chars_format::fixed, .correct: "1729000013891897393152"},
290 {.value: 1.729e22f, .fmt: chars_format::fixed, .correct: "17290000138918973931520"},
291 {.value: 1.729e23f, .fmt: chars_format::fixed, .correct: "172899999137389925629952"},
292 {.value: 1.729e24f, .fmt: chars_format::fixed, .correct: "1729000063431493294227456"},
293 {.value: 1.729e25f, .fmt: chars_format::fixed, .correct: "17289999481393428335427584"},
294 {.value: 1.729e26f, .fmt: chars_format::fixed, .correct: "172900004037306320209051648"},
295 {.value: 1.729e27f, .fmt: chars_format::fixed, .correct: "1729000040373063202090516480"},
296 {.value: 1.729e28f, .fmt: chars_format::fixed, .correct: "17290000403730632020905164800"},
297 {.value: 1.729e29f, .fmt: chars_format::fixed, .correct: "172900004037306320209051648000"},
298 {.value: 1.729e30f, .fmt: chars_format::fixed, .correct: "1728999964815199476176193060864"},
299 {.value: 1.729e31f, .fmt: chars_format::fixed, .correct: "17290000252614904569076517961728"},
300 {.value: 1.729e32f, .fmt: chars_format::fixed, .correct: "172899990436890849544473432555520"},
301 {.value: 1.729e33f, .fmt: chars_format::fixed, .correct: "1729000059111413406117268687945728"},
302 {.value: 1.729e34f, .fmt: chars_format::fixed, .correct: "17290000281629124239827618154676224"},
303 {.value: 1.729e35f, .fmt: chars_format::fixed, .correct: "172899995388651006685994532152016896"},
304 {.value: 1.729e36f, .fmt: chars_format::fixed, .correct: "1728999993500591323992114118292144128"},
305 {.value: 1.729e37f, .fmt: chars_format::fixed, .correct: "17289999935005913239921141182921441280"},
306 {.value: 1.729e38f, .fmt: chars_format::fixed, .correct: "172899996814757931942752608835808002048"},
307
308 // Also test one-digit cases, where the decimal point can't appear between digits like "17.29".
309 {.value: 7e-3f, .fmt: chars_format::fixed, .correct: "0.007"},
310 {.value: 7e-2f, .fmt: chars_format::fixed, .correct: "0.07"},
311 {.value: 7e-1f, .fmt: chars_format::fixed, .correct: "0.7"},
312 {.value: 7e0f, .fmt: chars_format::fixed, .correct: "7"},
313 {.value: 7e1f, .fmt: chars_format::fixed, .correct: "70"},
314 {.value: 7e2f, .fmt: chars_format::fixed, .correct: "700"},
315 {.value: 7e3f, .fmt: chars_format::fixed, .correct: "7000"},
316
317 // Test the maximum value in fixed notation.
318 {.value: 0x1.fffffep+127f, .fmt: chars_format::fixed, .correct: "340282346638528859811704183484516925440"},
319
320 // Test highly-trimmed powers of 2.
321 {.value: 0x1p118f, .fmt: chars_format::fixed, .correct: "332306998946228968225951765070086144"},
322 {.value: 0x1p118f, .fmt: chars_format::scientific, .correct: "3.32307e+35"},
323 {.value: 0x1p119f, .fmt: chars_format::fixed, .correct: "664613997892457936451903530140172288"},
324 {.value: 0x1p119f, .fmt: chars_format::scientific, .correct: "6.64614e+35"},
325
326 // Test powers of 10 that are exactly representable.
327 {.value: 1e0f, .fmt: chars_format::fixed, .correct: "1"},
328 {.value: 1e1f, .fmt: chars_format::fixed, .correct: "10"},
329 {.value: 1e2f, .fmt: chars_format::fixed, .correct: "100"},
330 {.value: 1e3f, .fmt: chars_format::fixed, .correct: "1000"},
331 {.value: 1e4f, .fmt: chars_format::fixed, .correct: "10000"},
332 {.value: 1e5f, .fmt: chars_format::fixed, .correct: "100000"},
333 {.value: 1e6f, .fmt: chars_format::fixed, .correct: "1000000"},
334 {.value: 1e7f, .fmt: chars_format::fixed, .correct: "10000000"},
335 {.value: 1e8f, .fmt: chars_format::fixed, .correct: "100000000"},
336 {.value: 1e9f, .fmt: chars_format::fixed, .correct: "1000000000"},
337 {.value: 1e10f, .fmt: chars_format::fixed, .correct: "10000000000"},
338
339 // Test powers of 10 that aren't exactly representable.
340 // This exercises the "adjustment" code.
341 {.value: 1e11f, .fmt: chars_format::fixed, .correct: "99999997952"},
342 {.value: 1e12f, .fmt: chars_format::fixed, .correct: "999999995904"},
343 {.value: 1e13f, .fmt: chars_format::fixed, .correct: "9999999827968"},
344 {.value: 1e14f, .fmt: chars_format::fixed, .correct: "100000000376832"},
345 {.value: 1e15f, .fmt: chars_format::fixed, .correct: "999999986991104"},
346 {.value: 1e16f, .fmt: chars_format::fixed, .correct: "10000000272564224"},
347 {.value: 1e17f, .fmt: chars_format::fixed, .correct: "99999998430674944"},
348 {.value: 1e18f, .fmt: chars_format::fixed, .correct: "999999984306749440"},
349 {.value: 1e19f, .fmt: chars_format::fixed, .correct: "9999999980506447872"},
350 {.value: 1e20f, .fmt: chars_format::fixed, .correct: "100000002004087734272"},
351 {.value: 1e21f, .fmt: chars_format::fixed, .correct: "1000000020040877342720"},
352 {.value: 1e22f, .fmt: chars_format::fixed, .correct: "9999999778196308361216"},
353 {.value: 1e23f, .fmt: chars_format::fixed, .correct: "99999997781963083612160"},
354 {.value: 1e24f, .fmt: chars_format::fixed, .correct: "1000000013848427855085568"},
355 {.value: 1e25f, .fmt: chars_format::fixed, .correct: "9999999562023526247432192"},
356 {.value: 1e26f, .fmt: chars_format::fixed, .correct: "100000002537764290115403776"},
357 {.value: 1e27f, .fmt: chars_format::fixed, .correct: "999999988484154753734934528"},
358 {.value: 1e28f, .fmt: chars_format::fixed, .correct: "9999999442119689768320106496"},
359 {.value: 1e29f, .fmt: chars_format::fixed, .correct: "100000001504746621987668885504"},
360 {.value: 1e30f, .fmt: chars_format::fixed, .correct: "1000000015047466219876688855040"},
361 {.value: 1e31f, .fmt: chars_format::fixed, .correct: "9999999848243207295109594873856"},
362 {.value: 1e32f, .fmt: chars_format::fixed, .correct: "100000003318135351409612647563264"},
363 {.value: 1e33f, .fmt: chars_format::fixed, .correct: "999999994495727286427992885035008"},
364 {.value: 1e34f, .fmt: chars_format::fixed, .correct: "9999999790214767953607394487959552"},
365 {.value: 1e35f, .fmt: chars_format::fixed, .correct: "100000004091847875962975319375216640"},
366 {.value: 1e36f, .fmt: chars_format::fixed, .correct: "999999961690316245365415600208216064"},
367 {.value: 1e37f, .fmt: chars_format::fixed, .correct: "9999999933815812510711506376257961984"},
368 {.value: 1e38f, .fmt: chars_format::fixed, .correct: "99999996802856924650656260769173209088"},
369
370 // These numbers have odd mantissas (unaffected by shifting)
371 // that are barely within the "max shifted mantissa" limit.
372 // They're exactly-representable multiples of powers of 10, and can use Ryu with zero-filling.
373 {.value: 3355443e1f, .fmt: chars_format::fixed, .correct: "33554430"},
374 {.value: 671087e2f, .fmt: chars_format::fixed, .correct: "67108700"},
375 {.value: 134217e3f, .fmt: chars_format::fixed, .correct: "134217000"},
376 {.value: 26843e4f, .fmt: chars_format::fixed, .correct: "268430000"},
377 {.value: 5367e5f, .fmt: chars_format::fixed, .correct: "536700000"},
378 {.value: 1073e6f, .fmt: chars_format::fixed, .correct: "1073000000"},
379 {.value: 213e7f, .fmt: chars_format::fixed, .correct: "2130000000"},
380 {.value: 41e8f, .fmt: chars_format::fixed, .correct: "4100000000"},
381 {.value: 7e9f, .fmt: chars_format::fixed, .correct: "7000000000"},
382 {.value: 1e10f, .fmt: chars_format::fixed, .correct: "10000000000"},
383
384 // These numbers have odd mantissas (unaffected by shifting)
385 // that are barely above the "max shifted mantissa" limit.
386 // This activates the non-Ryu fallback for large integers.
387 {.value: 3355445e1f, .fmt: chars_format::fixed, .correct: "33554448"},
388 {.value: 671089e2f, .fmt: chars_format::fixed, .correct: "67108896"},
389 {.value: 134219e3f, .fmt: chars_format::fixed, .correct: "134219008"},
390 {.value: 26845e4f, .fmt: chars_format::fixed, .correct: "268449984"},
391 {.value: 5369e5f, .fmt: chars_format::fixed, .correct: "536899968"},
392 {.value: 1075e6f, .fmt: chars_format::fixed, .correct: "1075000064"},
393 {.value: 215e7f, .fmt: chars_format::fixed, .correct: "2150000128"},
394 {.value: 43e8f, .fmt: chars_format::fixed, .correct: "4300000256"},
395 {.value: 9e9f, .fmt: chars_format::fixed, .correct: "8999999488"},
396 {.value: 3e10f, .fmt: chars_format::fixed, .correct: "30000001024"},
397
398 // Test the mantissa shifting logic.
399 {.value: 5495808e5f, .fmt: chars_format::fixed, .correct: "549580800000"}, // 5367 * 2^10
400 {.value: 5497856e5f, .fmt: chars_format::fixed, .correct: "549785567232"}, // 5369 * 2^10
401
402 // Inspect all of those numbers in scientific notation.
403 // For the within-limit numbers, this verifies that Ryu is actually being used with zero-filling above.
404 // For the above-limit numbers, this tests Ryu's trimming.
405 {.value: 3355443e1f, .fmt: chars_format::scientific, .correct: "3.355443e+07"},
406 {.value: 671087e2f, .fmt: chars_format::scientific, .correct: "6.71087e+07"},
407 {.value: 134217e3f, .fmt: chars_format::scientific, .correct: "1.34217e+08"},
408 {.value: 26843e4f, .fmt: chars_format::scientific, .correct: "2.6843e+08"},
409 {.value: 5367e5f, .fmt: chars_format::scientific, .correct: "5.367e+08"},
410 {.value: 1073e6f, .fmt: chars_format::scientific, .correct: "1.073e+09"},
411 {.value: 213e7f, .fmt: chars_format::scientific, .correct: "2.13e+09"},
412 {.value: 41e8f, .fmt: chars_format::scientific, .correct: "4.1e+09"},
413 {.value: 7e9f, .fmt: chars_format::scientific, .correct: "7e+09"},
414 {.value: 1e10f, .fmt: chars_format::scientific, .correct: "1e+10"},
415 {.value: 3355445e1f, .fmt: chars_format::scientific, .correct: "3.355445e+07"},
416 {.value: 671089e2f, .fmt: chars_format::scientific, .correct: "6.71089e+07"},
417 {.value: 134219e3f, .fmt: chars_format::scientific, .correct: "1.34219e+08"},
418 {.value: 26845e4f, .fmt: chars_format::scientific, .correct: "2.6845e+08"},
419 {.value: 5369e5f, .fmt: chars_format::scientific, .correct: "5.369e+08"},
420 {.value: 1075e6f, .fmt: chars_format::scientific, .correct: "1.075e+09"},
421 {.value: 215e7f, .fmt: chars_format::scientific, .correct: "2.15e+09"},
422 {.value: 43e8f, .fmt: chars_format::scientific, .correct: "4.3e+09"},
423 {.value: 9e9f, .fmt: chars_format::scientific, .correct: "9e+09"},
424 {.value: 3e10f, .fmt: chars_format::scientific, .correct: "3e+10"},
425 {.value: 5495808e5f, .fmt: chars_format::scientific, .correct: "5.495808e+11"},
426 {.value: 5497856e5f, .fmt: chars_format::scientific, .correct: "5.497856e+11"},
427
428 // Test the switching logic of chars_format::general.
429 // C11 7.21.6.1 "The fprintf function"/8:
430 // "Let P equal [...] 6 if the precision is omitted [...].
431 // Then, if a conversion with style E would have an exponent of X:
432 // - if P > X >= -4, the conversion is with style f [...].
433 // - otherwise, the conversion is with style e [...]."
434 {.value: 1e-6f, .fmt: chars_format::general, .correct: "1e-06"},
435 {.value: 1e-5f, .fmt: chars_format::general, .correct: "1e-05"},
436 {.value: 1e-4f, .fmt: chars_format::general, .correct: "0.0001"},
437 {.value: 1e-3f, .fmt: chars_format::general, .correct: "0.001"},
438 {.value: 1e-2f, .fmt: chars_format::general, .correct: "0.01"},
439 {.value: 1e-1f, .fmt: chars_format::general, .correct: "0.1"},
440 {.value: 1e0f, .fmt: chars_format::general, .correct: "1"},
441 {.value: 1e1f, .fmt: chars_format::general, .correct: "10"},
442 {.value: 1e2f, .fmt: chars_format::general, .correct: "100"},
443 {.value: 1e3f, .fmt: chars_format::general, .correct: "1000"},
444 {.value: 1e4f, .fmt: chars_format::general, .correct: "10000"},
445 {.value: 1e5f, .fmt: chars_format::general, .correct: "100000"},
446 {.value: 1e6f, .fmt: chars_format::general, .correct: "1e+06"},
447 {.value: 1e7f, .fmt: chars_format::general, .correct: "1e+07"},
448 {.value: 1.234e-6f, .fmt: chars_format::general, .correct: "1.234e-06"},
449 {.value: 1.234e-5f, .fmt: chars_format::general, .correct: "1.234e-05"},
450 {.value: 1.234e-4f, .fmt: chars_format::general, .correct: "0.0001234"},
451 {.value: 1.234e-3f, .fmt: chars_format::general, .correct: "0.001234"},
452 {.value: 1.234e-2f, .fmt: chars_format::general, .correct: "0.01234"},
453 {.value: 1.234e-1f, .fmt: chars_format::general, .correct: "0.1234"},
454 {.value: 1.234e0f, .fmt: chars_format::general, .correct: "1.234"},
455 {.value: 1.234e1f, .fmt: chars_format::general, .correct: "12.34"},
456 {.value: 1.234e2f, .fmt: chars_format::general, .correct: "123.4"},
457 {.value: 1.234e3f, .fmt: chars_format::general, .correct: "1234"},
458 {.value: 1.234e4f, .fmt: chars_format::general, .correct: "12340"},
459 {.value: 1.234e5f, .fmt: chars_format::general, .correct: "123400"},
460 {.value: 1.234e6f, .fmt: chars_format::general, .correct: "1.234e+06"},
461 {.value: 1.234e7f, .fmt: chars_format::general, .correct: "1.234e+07"},
462 {.value: 1.234e8f, .fmt: chars_format::general, .correct: "1.234e+08"},
463 {.value: 1.234e9f, .fmt: chars_format::general, .correct: "1.234e+09"},
464 {.value: 1.234e10f, .fmt: chars_format::general, .correct: "1.234e+10"},
465
466 // Test the switching logic of the plain overload.
467 // N4762 19.19.2 [charconv.to.chars]/8:
468 // "The conversion specifier is f or e, chosen according to the requirement
469 // for a shortest representation (see above); a tie is resolved in favor of f."
470 {.value: 1e-6f, .fmt: chars_format{}, .correct: "1e-06"},
471 {.value: 1e-5f, .fmt: chars_format{}, .correct: "1e-05"},
472 {.value: 1e-4f, .fmt: chars_format{}, .correct: "1e-04"},
473 {.value: 1e-3f, .fmt: chars_format{}, .correct: "0.001"},
474 {.value: 1e-2f, .fmt: chars_format{}, .correct: "0.01"},
475 {.value: 1e-1f, .fmt: chars_format{}, .correct: "0.1"},
476 {.value: 1e0f, .fmt: chars_format{}, .correct: "1"},
477 {.value: 1e1f, .fmt: chars_format{}, .correct: "10"},
478 {.value: 1e2f, .fmt: chars_format{}, .correct: "100"},
479 {.value: 1e3f, .fmt: chars_format{}, .correct: "1000"},
480 {.value: 1e4f, .fmt: chars_format{}, .correct: "10000"},
481 {.value: 1e5f, .fmt: chars_format{}, .correct: "1e+05"},
482 {.value: 1e6f, .fmt: chars_format{}, .correct: "1e+06"},
483 {.value: 1e7f, .fmt: chars_format{}, .correct: "1e+07"},
484 {.value: 1.234e-6f, .fmt: chars_format{}, .correct: "1.234e-06"},
485 {.value: 1.234e-5f, .fmt: chars_format{}, .correct: "1.234e-05"},
486 {.value: 1.234e-4f, .fmt: chars_format{}, .correct: "0.0001234"},
487 {.value: 1.234e-3f, .fmt: chars_format{}, .correct: "0.001234"},
488 {.value: 1.234e-2f, .fmt: chars_format{}, .correct: "0.01234"},
489 {.value: 1.234e-1f, .fmt: chars_format{}, .correct: "0.1234"},
490 {.value: 1.234e0f, .fmt: chars_format{}, .correct: "1.234"},
491 {.value: 1.234e1f, .fmt: chars_format{}, .correct: "12.34"},
492 {.value: 1.234e2f, .fmt: chars_format{}, .correct: "123.4"},
493 {.value: 1.234e3f, .fmt: chars_format{}, .correct: "1234"},
494 {.value: 1.234e4f, .fmt: chars_format{}, .correct: "12340"},
495 {.value: 1.234e5f, .fmt: chars_format{}, .correct: "123400"},
496 {.value: 1.234e6f, .fmt: chars_format{}, .correct: "1234000"},
497 {.value: 1.234e7f, .fmt: chars_format{}, .correct: "12340000"},
498 {.value: 1.234e8f, .fmt: chars_format{}, .correct: "123400000"},
499 {.value: 1.234e9f, .fmt: chars_format{}, .correct: "1.234e+09"},
500 {.value: 1.234e10f, .fmt: chars_format{}, .correct: "1.234e+10"},
501
502 // Test hexfloat corner cases.
503 {.value: 0x1.728p+0f, .fmt: chars_format::hex, .correct: "1.728p+0"}, // instead of "2.e5p-1"
504 {.value: 0x0.000002p-126f, .fmt: chars_format::hex, .correct: "0.000002p-126"}, // instead of "1p-149", min subnormal
505 {.value: 0x0.fffffep-126f, .fmt: chars_format::hex, .correct: "0.fffffep-126"}, // max subnormal
506 {.value: 0x1p-126f, .fmt: chars_format::hex, .correct: "1p-126"}, // min normal
507 {.value: 0x1.fffffep+127f, .fmt: chars_format::hex, .correct: "1.fffffep+127"}, // max normal
508
509 // Test hexfloat exponents.
510 {.value: 0x1p-109f, .fmt: chars_format::hex, .correct: "1p-109"},
511 {.value: 0x1p-99f, .fmt: chars_format::hex, .correct: "1p-99"},
512 {.value: 0x1p-9f, .fmt: chars_format::hex, .correct: "1p-9"},
513 {.value: 0x1p+0f, .fmt: chars_format::hex, .correct: "1p+0"},
514 {.value: 0x1p+9f, .fmt: chars_format::hex, .correct: "1p+9"},
515 {.value: 0x1p+99f, .fmt: chars_format::hex, .correct: "1p+99"},
516 {.value: 0x1p+109f, .fmt: chars_format::hex, .correct: "1p+109"},
517
518 // Test hexfloat hexits.
519 {.value: 0x1.0123p+0f, .fmt: chars_format::hex, .correct: "1.0123p+0"},
520 {.value: 0x1.4567p+0f, .fmt: chars_format::hex, .correct: "1.4567p+0"},
521 {.value: 0x1.89abp+0f, .fmt: chars_format::hex, .correct: "1.89abp+0"},
522 {.value: 0x1.cdefp+0f, .fmt: chars_format::hex, .correct: "1.cdefp+0"},
523
524 // Test hexfloat trimming.
525 {.value: 0x1.00000ap+0f, .fmt: chars_format::hex, .correct: "1.00000ap+0"},
526 {.value: 0x1.0000ap+0f, .fmt: chars_format::hex, .correct: "1.0000ap+0"},
527 {.value: 0x1.000ap+0f, .fmt: chars_format::hex, .correct: "1.000ap+0"},
528 {.value: 0x1.00ap+0f, .fmt: chars_format::hex, .correct: "1.00ap+0"},
529 {.value: 0x1.0ap+0f, .fmt: chars_format::hex, .correct: "1.0ap+0"},
530 {.value: 0x1.ap+0f, .fmt: chars_format::hex, .correct: "1.ap+0"},
531 {.value: 0x1p+0f, .fmt: chars_format::hex, .correct: "1p+0"},
532
533 // https://www.exploringbinary.com/the-shortest-decimal-string-that-round-trips-may-not-be-the-nearest/
534 // This is an exhaustive list of anomalous values.
535 // (See double_to_chars_test_cases.hpp for more details.)
536 {.value: 0x1p90f, .fmt: chars_format::scientific, .correct: "1.2379401e+27"},
537 {.value: 0x1p87f, .fmt: chars_format::scientific, .correct: "1.5474251e+26"},
538 {.value: 0x1p-96f, .fmt: chars_format::scientific, .correct: "1.2621775e-29"},
539};
540
541#endif // FLOAT_TO_CHARS_TEST_CASES_HPP
542

source code of libcxx/test/std/utilities/charconv/charconv.msvc/float_to_chars_test_cases.hpp