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 DOUBLE_FIXED_PRECISION_TO_CHARS_TEST_CASES_1_HPP
40 #define DOUBLE_FIXED_PRECISION_TO_CHARS_TEST_CASES_1_HPP
41 
42 #include <charconv>
43 
44 #include "test.hpp"
45 using namespace std;
46 
47 inline constexpr DoublePrecisionToCharsTestCase double_fixed_precision_to_chars_test_cases_1[] = {
48     // Test special cases (zero, inf, nan) and an ordinary case. Also test negative signs.
49     {0.0, chars_format::fixed, 4, "0.0000"},
50     {-0.0, chars_format::fixed, 4, "-0.0000"},
51     {double_inf, chars_format::fixed, 4, "inf"},
52     {-double_inf, chars_format::fixed, 4, "-inf"},
53     {double_nan, chars_format::fixed, 4, "nan"},
54     {-double_nan, chars_format::fixed, 4, "-nan(ind)"},
55     {double_nan_payload, chars_format::fixed, 4, "nan"},
56     {-double_nan_payload, chars_format::fixed, 4, "-nan"},
57     {1.729, chars_format::fixed, 4, "1.7290"},
58     {-1.729, chars_format::fixed, 4, "-1.7290"},
59 
60     // Ryu Printf d2fixed_test.cc D2fixedTest Basic
61     {0x1.000000001869fp+211, chars_format::fixed, 0,
62         "3291009114715486435425664845573426149758869524108446525879746560"},
63 
64     // Ryu Printf d2fixed_test.cc D2fixedTest Zero
65     {0.0, chars_format::fixed, 4, "0.0000"},
66     {0.0, chars_format::fixed, 3, "0.000"},
67     {0.0, chars_format::fixed, 2, "0.00"},
68     {0.0, chars_format::fixed, 1, "0.0"},
69     {0.0, chars_format::fixed, 0, "0"},
70 
71     // Ryu Printf d2fixed_test.cc D2fixedTest MinMax
72     {0x0.0000000000001p-1022, chars_format::fixed, 1074,
73         "0.0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
74         "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
75         "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
76         "000000000000000000000000000000000000000000000000000000049406564584124654417656879286822137"
77         "236505980261432476442558568250067550727020875186529983636163599237979656469544571773092665"
78         "671035593979639877479601078187812630071319031140452784581716784898210368871863605699873072"
79         "305000638740915356498438731247339727316961514003171538539807412623856559117102665855668676"
80         "818703956031062493194527159149245532930545654440112748012970999954193198940908041656332452"
81         "475714786901472678015935523861155013480352649347201937902681071074917033322268447533357208"
82         "324319360923828934583680601060115061698097530783422773183292479049825247307763759272478746"
83         "560847782037344696995336470179726777175851256605511991315048911014510378627381672509558373"
84         "89733598993664809941164205702637090279242767544565229087538682506419718265533447265625"},
85 
86     {0x1.fffffffffffffp+1023, chars_format::fixed, 0,
87         "179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558"
88         "632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245"
89         "490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168"
90         "738177180919299881250404026184124858368"},
91 
92     // Test more corner cases.
93     {0x0.fffffffffffffp-1022, chars_format::fixed, 1074,
94         "0."
95         "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
96         "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
97         "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000022250738585"
98         "0720088902458687608585988765042311224095946549352480256244000922823569517877588880375915526423097809504343"
99         "1208587738715835729182199302029437922422355981982750124204178896957131179108226104397197960400045489739193"
100         "8079198936081525613113376149842043271751033627391549782731594143828136275113838604094249464942286316695429"
101         "1050802018159266421349966065178030950759130587198464239060686371020051087232827846788436319445158661350412"
102         "2347901479236958520832159762106637540161373658304419360371477835530668283453563400507407304013560296804637"
103         "5918583163124224521599262546494300836851861719422417646455137135420132217031370496583210154654068035397417"
104         "9060225895030235019375197730309457631732108525072993050897615825191597207572324554347709124613174935802817"
105         "34466552734375"}, // max subnormal
106     {0x1p-1022, chars_format::fixed, 1022,
107         "0."
108         "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
109         "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
110         "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000022250738585"
111         "0720138309023271733240406421921598046233183055332741688720443481391819585428315901251102056406733973103581"
112         "1005152434161553460108856012385377718821130777993532002330479610147442583636071921565046942503734208375250"
113         "8066506166581589487204911799685916396485006359087701183048747997808877537499494515804516050509153998565824"
114         "7081864511353793580499211598108576605199243335211435239014879569960959128889160299264151106346631339366347"
115         "7586513029371762047325631781485664350872122828637642044846811407613911477062801689853244110024161447421618"
116         "5671661505401542850847167529019031613227788967297073731233340869889831750678388469260927739779728586596549"
117         "41091369095406136467568702398678315290680984617210924625396728515625"}, // min normal
118 
119     // Ryu Printf d2fixed_test.cc D2fixedTest RoundToEven
120     {0.125, chars_format::fixed, 3, "0.125"},
121     {0.125, chars_format::fixed, 2, "0.12"},
122     {0.375, chars_format::fixed, 3, "0.375"},
123     {0.375, chars_format::fixed, 2, "0.38"},
124 
125     // Ryu Printf d2fixed_test.cc D2fixedTest RoundToEvenInteger
126     {2.5, chars_format::fixed, 1, "2.5"},
127     {2.5, chars_format::fixed, 0, "2"},
128     {3.5, chars_format::fixed, 1, "3.5"},
129     {3.5, chars_format::fixed, 0, "4"},
130 
131     // Ryu Printf d2fixed_test.cc D2fixedTest NonRoundToEvenScenarios
132     {0.748046875, chars_format::fixed, 3, "0.748"},
133     {0.748046875, chars_format::fixed, 2, "0.75"},
134     {0.748046875, chars_format::fixed, 1, "0.7"}, // 0.75 would round to "0.8", but this is smaller
135 
136     {0.2509765625, chars_format::fixed, 3, "0.251"},
137     {0.2509765625, chars_format::fixed, 2, "0.25"},
138     {0.2509765625, chars_format::fixed, 1, "0.3"}, // 0.25 would round to "0.2", but this is larger
139 
140     {0x1.0000000000001p-2, chars_format::fixed, 54, "0.250000000000000055511151231257827021181583404541015625"},
141     {0x1.0000000000001p-2, chars_format::fixed, 3, "0.250"},
142     {0x1.0000000000001p-2, chars_format::fixed, 2, "0.25"},
143     {0x1.0000000000001p-2, chars_format::fixed, 1, "0.3"}, // 0.25 would round to "0.2", but this is larger (again)
144 
145     // More rounding tests.
146     {9.5, chars_format::fixed, 1, "9.5"},
147     {9.5, chars_format::fixed, 0, "10"},
148     {10.5, chars_format::fixed, 1, "10.5"},
149     {10.5, chars_format::fixed, 0, "10"},
150 
151     {1.241, chars_format::fixed, 3, "1.241"},
152     {1.241, chars_format::fixed, 1, "1.2"},
153     {1.251, chars_format::fixed, 3, "1.251"},
154     {1.251, chars_format::fixed, 1, "1.3"},
155     {1.261, chars_format::fixed, 3, "1.261"},
156     {1.261, chars_format::fixed, 1, "1.3"},
157     {1.341, chars_format::fixed, 3, "1.341"},
158     {1.341, chars_format::fixed, 1, "1.3"},
159     {1.351, chars_format::fixed, 3, "1.351"},
160     {1.351, chars_format::fixed, 1, "1.4"},
161     {1.361, chars_format::fixed, 3, "1.361"},
162     {1.361, chars_format::fixed, 1, "1.4"},
163 
164     {2.41, chars_format::fixed, 2, "2.41"},
165     {2.41, chars_format::fixed, 0, "2"},
166     {2.51, chars_format::fixed, 2, "2.51"},
167     {2.51, chars_format::fixed, 0, "3"},
168     {2.61, chars_format::fixed, 2, "2.61"},
169     {2.61, chars_format::fixed, 0, "3"},
170     {3.41, chars_format::fixed, 2, "3.41"},
171     {3.41, chars_format::fixed, 0, "3"},
172     {3.51, chars_format::fixed, 2, "3.51"},
173     {3.51, chars_format::fixed, 0, "4"},
174     {3.61, chars_format::fixed, 2, "3.61"},
175     {3.61, chars_format::fixed, 0, "4"},
176 
177     // Ryu Printf d2fixed_test.cc D2fixedTest VaryingPrecision
178     {1729.142857142857, chars_format::fixed, 47, "1729.14285714285711037518922239542007446289062500000"},
179     {1729.142857142857, chars_format::fixed, 46, "1729.1428571428571103751892223954200744628906250000"},
180     {1729.142857142857, chars_format::fixed, 45, "1729.142857142857110375189222395420074462890625000"},
181     {1729.142857142857, chars_format::fixed, 44, "1729.14285714285711037518922239542007446289062500"},
182     {1729.142857142857, chars_format::fixed, 43, "1729.1428571428571103751892223954200744628906250"},
183     {1729.142857142857, chars_format::fixed, 42, "1729.142857142857110375189222395420074462890625"},
184     {1729.142857142857, chars_format::fixed, 41, "1729.14285714285711037518922239542007446289062"},
185     {1729.142857142857, chars_format::fixed, 40, "1729.1428571428571103751892223954200744628906"},
186     {1729.142857142857, chars_format::fixed, 39, "1729.142857142857110375189222395420074462891"},
187     {1729.142857142857, chars_format::fixed, 38, "1729.14285714285711037518922239542007446289"},
188     {1729.142857142857, chars_format::fixed, 37, "1729.1428571428571103751892223954200744629"},
189     {1729.142857142857, chars_format::fixed, 36, "1729.142857142857110375189222395420074463"},
190     {1729.142857142857, chars_format::fixed, 35, "1729.14285714285711037518922239542007446"},
191     {1729.142857142857, chars_format::fixed, 34, "1729.1428571428571103751892223954200745"},
192     {1729.142857142857, chars_format::fixed, 33, "1729.142857142857110375189222395420074"},
193     {1729.142857142857, chars_format::fixed, 32, "1729.14285714285711037518922239542007"},
194     {1729.142857142857, chars_format::fixed, 31, "1729.1428571428571103751892223954201"},
195     {1729.142857142857, chars_format::fixed, 30, "1729.142857142857110375189222395420"},
196     {1729.142857142857, chars_format::fixed, 29, "1729.14285714285711037518922239542"},
197     {1729.142857142857, chars_format::fixed, 28, "1729.1428571428571103751892223954"},
198     {1729.142857142857, chars_format::fixed, 27, "1729.142857142857110375189222395"},
199     {1729.142857142857, chars_format::fixed, 26, "1729.14285714285711037518922240"},
200     {1729.142857142857, chars_format::fixed, 25, "1729.1428571428571103751892224"},
201     {1729.142857142857, chars_format::fixed, 24, "1729.142857142857110375189222"},
202     {1729.142857142857, chars_format::fixed, 23, "1729.14285714285711037518922"},
203     {1729.142857142857, chars_format::fixed, 22, "1729.1428571428571103751892"},
204     {1729.142857142857, chars_format::fixed, 21, "1729.142857142857110375189"},
205     {1729.142857142857, chars_format::fixed, 20, "1729.14285714285711037519"},
206     {1729.142857142857, chars_format::fixed, 19, "1729.1428571428571103752"},
207     {1729.142857142857, chars_format::fixed, 18, "1729.142857142857110375"},
208     {1729.142857142857, chars_format::fixed, 17, "1729.14285714285711038"},
209     {1729.142857142857, chars_format::fixed, 16, "1729.1428571428571104"},
210     {1729.142857142857, chars_format::fixed, 15, "1729.142857142857110"},
211     {1729.142857142857, chars_format::fixed, 14, "1729.14285714285711"},
212     {1729.142857142857, chars_format::fixed, 13, "1729.1428571428571"},
213     {1729.142857142857, chars_format::fixed, 12, "1729.142857142857"},
214     {1729.142857142857, chars_format::fixed, 11, "1729.14285714286"},
215     {1729.142857142857, chars_format::fixed, 10, "1729.1428571429"},
216     {1729.142857142857, chars_format::fixed, 9, "1729.142857143"},
217     {1729.142857142857, chars_format::fixed, 8, "1729.14285714"},
218     {1729.142857142857, chars_format::fixed, 7, "1729.1428571"},
219     {1729.142857142857, chars_format::fixed, 6, "1729.142857"},
220     {1729.142857142857, chars_format::fixed, 5, "1729.14286"},
221     {1729.142857142857, chars_format::fixed, 4, "1729.1429"},
222     {1729.142857142857, chars_format::fixed, 3, "1729.143"},
223     {1729.142857142857, chars_format::fixed, 2, "1729.14"},
224     {1729.142857142857, chars_format::fixed, 1, "1729.1"},
225     {1729.142857142857, chars_format::fixed, 0, "1729"},
226 
227     // Negative precision requests 6 digits of precision.
228     {1729.142857142857, chars_format::fixed, -1, "1729.142857"},
229     {1729.142857142857, chars_format::fixed, -2, "1729.142857"},
230     {1729.142857142857, chars_format::fixed, -3, "1729.142857"},
231 
232     // Ryu Printf d2fixed_test.cc D2fixedTest Carrying
233     {0.0009, chars_format::fixed, 4, "0.0009"},
234     {0.0009, chars_format::fixed, 3, "0.001"},
235     {0.0029, chars_format::fixed, 4, "0.0029"},
236     {0.0029, chars_format::fixed, 3, "0.003"},
237     {0.0099, chars_format::fixed, 4, "0.0099"},
238     {0.0099, chars_format::fixed, 3, "0.010"},
239     {0.0299, chars_format::fixed, 4, "0.0299"},
240     {0.0299, chars_format::fixed, 3, "0.030"},
241     {0.0999, chars_format::fixed, 4, "0.0999"},
242     {0.0999, chars_format::fixed, 3, "0.100"},
243     {0.2999, chars_format::fixed, 4, "0.2999"},
244     {0.2999, chars_format::fixed, 3, "0.300"},
245     {0.9999, chars_format::fixed, 4, "0.9999"},
246     {0.9999, chars_format::fixed, 3, "1.000"},
247     {2.9999, chars_format::fixed, 4, "2.9999"},
248     {2.9999, chars_format::fixed, 3, "3.000"},
249     {9.9999, chars_format::fixed, 4, "9.9999"},
250     {9.9999, chars_format::fixed, 3, "10.000"},
251     {29.9999, chars_format::fixed, 4, "29.9999"},
252     {29.9999, chars_format::fixed, 3, "30.000"},
253     {99.9999, chars_format::fixed, 4, "99.9999"},
254     {99.9999, chars_format::fixed, 3, "100.000"},
255     {299.9999, chars_format::fixed, 4, "299.9999"},
256     {299.9999, chars_format::fixed, 3, "300.000"},
257 
258     {0.09, chars_format::fixed, 2, "0.09"},
259     {0.09, chars_format::fixed, 1, "0.1"},
260     {0.29, chars_format::fixed, 2, "0.29"},
261     {0.29, chars_format::fixed, 1, "0.3"},
262     {0.99, chars_format::fixed, 2, "0.99"},
263     {0.99, chars_format::fixed, 1, "1.0"},
264     {2.99, chars_format::fixed, 2, "2.99"},
265     {2.99, chars_format::fixed, 1, "3.0"},
266     {9.99, chars_format::fixed, 2, "9.99"},
267     {9.99, chars_format::fixed, 1, "10.0"},
268     {29.99, chars_format::fixed, 2, "29.99"},
269     {29.99, chars_format::fixed, 1, "30.0"},
270     {99.99, chars_format::fixed, 2, "99.99"},
271     {99.99, chars_format::fixed, 1, "100.0"},
272     {299.99, chars_format::fixed, 2, "299.99"},
273     {299.99, chars_format::fixed, 1, "300.0"},
274 
275     {0.9, chars_format::fixed, 1, "0.9"},
276     {0.9, chars_format::fixed, 0, "1"},
277     {2.9, chars_format::fixed, 1, "2.9"},
278     {2.9, chars_format::fixed, 0, "3"},
279     {9.9, chars_format::fixed, 1, "9.9"},
280     {9.9, chars_format::fixed, 0, "10"},
281     {29.9, chars_format::fixed, 1, "29.9"},
282     {29.9, chars_format::fixed, 0, "30"},
283     {99.9, chars_format::fixed, 1, "99.9"},
284     {99.9, chars_format::fixed, 0, "100"},
285     {299.9, chars_format::fixed, 1, "299.9"},
286     {299.9, chars_format::fixed, 0, "300"},
287 
288     // Ryu Printf d2fixed_test.cc D2fixedTest RoundingResultZero
289     {0.004, chars_format::fixed, 3, "0.004"},
290     {0.004, chars_format::fixed, 2, "0.00"},
291     {0.4, chars_format::fixed, 1, "0.4"},
292     {0.4, chars_format::fixed, 0, "0"},
293     {0.5, chars_format::fixed, 1, "0.5"},
294     {0.5, chars_format::fixed, 0, "0"},
295 
296     // Ryu Printf d2fixed_test.cc D2fixedTest Regression
297     {7.018232e-82, chars_format::fixed, 6, "0.000000"},
298 };
299 
300 #endif // DOUBLE_FIXED_PRECISION_TO_CHARS_TEST_CASES_1_HPP
301