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