| // Copyright (c) Microsoft Corporation. |
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
| |
| |
| // Copyright 2018 Ulf Adams |
| // Copyright (c) Microsoft Corporation. All rights reserved. |
| |
| // Boost Software License - Version 1.0 - August 17th, 2003 |
| |
| // Permission is hereby granted, free of charge, to any person or organization |
| // obtaining a copy of the software and accompanying documentation covered by |
| // this license (the "Software") to use, reproduce, display, distribute, |
| // execute, and transmit the Software, and to prepare derivative works of the |
| // Software, and to permit third-parties to whom the Software is furnished to |
| // do so, all subject to the following: |
| |
| // The copyright notices in the Software and this entire statement, including |
| // the above license grant, this restriction and the following disclaimer, |
| // must be included in all copies of the Software, in whole or in part, and |
| // all derivative works of the Software, unless such copies or derivative |
| // works are solely in the form of machine-executable object code generated by |
| // a source language processor. |
| |
| // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
| // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
| // FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT |
| // SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE |
| // FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, |
| // ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER |
| // DEALINGS IN THE SOFTWARE. |
| |
| |
| // This file contains test cases derived from: |
| // https://github.com/ulfjack/ryu |
| // See xcharconv_ryu.h for the exact commit. |
| // (Keep the cgmanifest.json commitHash in sync.) |
| |
| |
| #ifndef DOUBLE_SCIENTIFIC_PRECISION_TO_CHARS_TEST_CASES_1_HPP |
| #define DOUBLE_SCIENTIFIC_PRECISION_TO_CHARS_TEST_CASES_1_HPP |
| |
| #include <charconv> |
| |
| #include "test.hpp" |
| using namespace std; |
| |
| inline constexpr DoublePrecisionToCharsTestCase double_scientific_precision_to_chars_test_cases_1[] = { |
| // Test special cases (zero, inf, nan) and an ordinary case. Also test negative signs. |
| {0.0, chars_format::scientific, 4, "0.0000e+00"}, |
| {-0.0, chars_format::scientific, 4, "-0.0000e+00"}, |
| {double_inf, chars_format::scientific, 4, "inf"}, |
| {-double_inf, chars_format::scientific, 4, "-inf"}, |
| {double_nan, chars_format::scientific, 4, "nan"}, |
| {-double_nan, chars_format::scientific, 4, "-nan(ind)"}, |
| {double_nan_payload, chars_format::scientific, 4, "nan"}, |
| {-double_nan_payload, chars_format::scientific, 4, "-nan"}, |
| {1.729, chars_format::scientific, 4, "1.7290e+00"}, |
| {-1.729, chars_format::scientific, 4, "-1.7290e+00"}, |
| |
| // Ryu Printf d2fixed_test.cc D2expTest Basic |
| {0x1.000000001869fp+211, chars_format::scientific, 62, |
| "3.29100911471548643542566484557342614975886952410844652587974656e+63"}, |
| |
| // Ryu Printf d2fixed_test.cc D2expTest Zero |
| {0.0, chars_format::scientific, 4, "0.0000e+00"}, |
| {0.0, chars_format::scientific, 3, "0.000e+00"}, |
| {0.0, chars_format::scientific, 2, "0.00e+00"}, |
| {0.0, chars_format::scientific, 1, "0.0e+00"}, |
| {0.0, chars_format::scientific, 0, "0e+00"}, |
| |
| // Ryu Printf d2fixed_test.cc D2expTest MinMax |
| {0x0.0000000000001p-1022, chars_format::scientific, 750, |
| "4.9406564584124654417656879286822137236505980261432476442558568250067550727020875186529983" |
| "636163599237979656469544571773092665671035593979639877479601078187812630071319031140452784" |
| "581716784898210368871863605699873072305000638740915356498438731247339727316961514003171538" |
| "539807412623856559117102665855668676818703956031062493194527159149245532930545654440112748" |
| "012970999954193198940908041656332452475714786901472678015935523861155013480352649347201937" |
| "902681071074917033322268447533357208324319360923828934583680601060115061698097530783422773" |
| "183292479049825247307763759272478746560847782037344696995336470179726777175851256605511991" |
| "315048911014510378627381672509558373897335989936648099411642057026370902792427675445652290" |
| "87538682506419718265533447265625e-324"}, |
| |
| {0x1.fffffffffffffp+1023, chars_format::scientific, 308, |
| "1.7976931348623157081452742373170435679807056752584499659891747680315726078002853876058955" |
| "863276687817154045895351438246423432132688946418276846754670353751698604991057655128207624" |
| "549009038932894407586850845513394230458323690322294816580855933212334827479782620414472316" |
| "8738177180919299881250404026184124858368e+308"}, |
| |
| // Test more corner cases. |
| {0x0.fffffffffffffp-1022, chars_format::scientific, 766, |
| "2." |
| "2250738585072008890245868760858598876504231122409594654935248025624400092282356951787758888037591552642309" |
| "7809504343120858773871583572918219930202943792242235598198275012420417889695713117910822610439719796040004" |
| "5489739193807919893608152561311337614984204327175103362739154978273159414382813627511383860409424946494228" |
| "6316695429105080201815926642134996606517803095075913058719846423906068637102005108723282784678843631944515" |
| "8661350412234790147923695852083215976210663754016137365830441936037147783553066828345356340050740730401356" |
| "0296804637591858316312422452159926254649430083685186171942241764645513713542013221703137049658321015465406" |
| "8035397417906022589503023501937519773030945763173210852507299305089761582519159720757232455434770912461317" |
| "493580281734466552734375e-308"}, // max subnormal |
| {0x1p-1022, chars_format::scientific, 714, |
| "2." |
| "2250738585072013830902327173324040642192159804623318305533274168872044348139181958542831590125110205640673" |
| "3973103581100515243416155346010885601238537771882113077799353200233047961014744258363607192156504694250373" |
| "4208375250806650616658158948720491179968591639648500635908770118304874799780887753749949451580451605050915" |
| "3998565824708186451135379358049921159810857660519924333521143523901487956996095912888916029926415110634663" |
| "1339366347758651302937176204732563178148566435087212282863764204484681140761391147706280168985324411002416" |
| "1447421618567166150540154285084716752901903161322778896729707373123334086988983175067838846926092773977972" |
| "858659654941091369095406136467568702398678315290680984617210924625396728515625e-308"}, // min normal |
| |
| // Ryu Printf d2fixed_test.cc D2expTest RoundToEven |
| {0.125, chars_format::scientific, 2, "1.25e-01"}, |
| {0.125, chars_format::scientific, 1, "1.2e-01"}, |
| {0.375, chars_format::scientific, 2, "3.75e-01"}, |
| {0.375, chars_format::scientific, 1, "3.8e-01"}, |
| |
| // Ryu Printf d2fixed_test.cc D2expTest RoundToEvenInteger |
| {2.5, chars_format::scientific, 1, "2.5e+00"}, |
| {2.5, chars_format::scientific, 0, "2e+00"}, |
| {3.5, chars_format::scientific, 1, "3.5e+00"}, |
| {3.5, chars_format::scientific, 0, "4e+00"}, |
| |
| // Ryu Printf d2fixed_test.cc D2expTest NonRoundToEvenScenarios |
| {0.748046875, chars_format::scientific, 2, "7.48e-01"}, |
| {0.748046875, chars_format::scientific, 1, "7.5e-01"}, |
| {0.748046875, chars_format::scientific, 0, "7e-01"}, // 0.75 would round to "8e-01", but this is smaller |
| |
| {0.2509765625, chars_format::scientific, 2, "2.51e-01"}, |
| {0.2509765625, chars_format::scientific, 1, "2.5e-01"}, |
| {0.2509765625, chars_format::scientific, 0, "3e-01"}, // 0.25 would round to "2e-01", but this is larger |
| |
| {0x1.0000000000001p-2, chars_format::scientific, 53, "2.50000000000000055511151231257827021181583404541015625e-01"}, |
| {0x1.0000000000001p-2, chars_format::scientific, 2, "2.50e-01"}, |
| {0x1.0000000000001p-2, chars_format::scientific, 1, "2.5e-01"}, |
| {0x1.0000000000001p-2, chars_format::scientific, 0, |
| "3e-01"}, // 0.25 would round to "2e-01", but this is larger (again) |
| |
| // More rounding tests. |
| {9.5, chars_format::scientific, 1, "9.5e+00"}, |
| {9.5, chars_format::scientific, 0, "1e+01"}, |
| {10.5, chars_format::scientific, 2, "1.05e+01"}, |
| {10.5, chars_format::scientific, 1, "1.0e+01"}, |
| |
| {1.241, chars_format::scientific, 3, "1.241e+00"}, |
| {1.241, chars_format::scientific, 1, "1.2e+00"}, |
| {1.251, chars_format::scientific, 3, "1.251e+00"}, |
| {1.251, chars_format::scientific, 1, "1.3e+00"}, |
| {1.261, chars_format::scientific, 3, "1.261e+00"}, |
| {1.261, chars_format::scientific, 1, "1.3e+00"}, |
| {1.341, chars_format::scientific, 3, "1.341e+00"}, |
| {1.341, chars_format::scientific, 1, "1.3e+00"}, |
| {1.351, chars_format::scientific, 3, "1.351e+00"}, |
| {1.351, chars_format::scientific, 1, "1.4e+00"}, |
| {1.361, chars_format::scientific, 3, "1.361e+00"}, |
| {1.361, chars_format::scientific, 1, "1.4e+00"}, |
| |
| {2.41, chars_format::scientific, 2, "2.41e+00"}, |
| {2.41, chars_format::scientific, 0, "2e+00"}, |
| {2.51, chars_format::scientific, 2, "2.51e+00"}, |
| {2.51, chars_format::scientific, 0, "3e+00"}, |
| {2.61, chars_format::scientific, 2, "2.61e+00"}, |
| {2.61, chars_format::scientific, 0, "3e+00"}, |
| {3.41, chars_format::scientific, 2, "3.41e+00"}, |
| {3.41, chars_format::scientific, 0, "3e+00"}, |
| {3.51, chars_format::scientific, 2, "3.51e+00"}, |
| {3.51, chars_format::scientific, 0, "4e+00"}, |
| {3.61, chars_format::scientific, 2, "3.61e+00"}, |
| {3.61, chars_format::scientific, 0, "4e+00"}, |
| |
| // Ryu Printf d2fixed_test.cc D2expTest VaryingPrecision |
| {1729.142857142857, chars_format::scientific, 50, "1.72914285714285711037518922239542007446289062500000e+03"}, |
| {1729.142857142857, chars_format::scientific, 49, "1.7291428571428571103751892223954200744628906250000e+03"}, |
| {1729.142857142857, chars_format::scientific, 48, "1.729142857142857110375189222395420074462890625000e+03"}, |
| {1729.142857142857, chars_format::scientific, 47, "1.72914285714285711037518922239542007446289062500e+03"}, |
| {1729.142857142857, chars_format::scientific, 46, "1.7291428571428571103751892223954200744628906250e+03"}, |
| {1729.142857142857, chars_format::scientific, 45, "1.729142857142857110375189222395420074462890625e+03"}, |
| {1729.142857142857, chars_format::scientific, 44, "1.72914285714285711037518922239542007446289062e+03"}, |
| {1729.142857142857, chars_format::scientific, 43, "1.7291428571428571103751892223954200744628906e+03"}, |
| {1729.142857142857, chars_format::scientific, 42, "1.729142857142857110375189222395420074462891e+03"}, |
| {1729.142857142857, chars_format::scientific, 41, "1.72914285714285711037518922239542007446289e+03"}, |
| {1729.142857142857, chars_format::scientific, 40, "1.7291428571428571103751892223954200744629e+03"}, |
| {1729.142857142857, chars_format::scientific, 39, "1.729142857142857110375189222395420074463e+03"}, |
| {1729.142857142857, chars_format::scientific, 38, "1.72914285714285711037518922239542007446e+03"}, |
| {1729.142857142857, chars_format::scientific, 37, "1.7291428571428571103751892223954200745e+03"}, |
| {1729.142857142857, chars_format::scientific, 36, "1.729142857142857110375189222395420074e+03"}, |
| {1729.142857142857, chars_format::scientific, 35, "1.72914285714285711037518922239542007e+03"}, |
| {1729.142857142857, chars_format::scientific, 34, "1.7291428571428571103751892223954201e+03"}, |
| {1729.142857142857, chars_format::scientific, 33, "1.729142857142857110375189222395420e+03"}, |
| {1729.142857142857, chars_format::scientific, 32, "1.72914285714285711037518922239542e+03"}, |
| {1729.142857142857, chars_format::scientific, 31, "1.7291428571428571103751892223954e+03"}, |
| {1729.142857142857, chars_format::scientific, 30, "1.729142857142857110375189222395e+03"}, |
| {1729.142857142857, chars_format::scientific, 29, "1.72914285714285711037518922240e+03"}, |
| {1729.142857142857, chars_format::scientific, 28, "1.7291428571428571103751892224e+03"}, |
| {1729.142857142857, chars_format::scientific, 27, "1.729142857142857110375189222e+03"}, |
| {1729.142857142857, chars_format::scientific, 26, "1.72914285714285711037518922e+03"}, |
| {1729.142857142857, chars_format::scientific, 25, "1.7291428571428571103751892e+03"}, |
| {1729.142857142857, chars_format::scientific, 24, "1.729142857142857110375189e+03"}, |
| {1729.142857142857, chars_format::scientific, 23, "1.72914285714285711037519e+03"}, |
| {1729.142857142857, chars_format::scientific, 22, "1.7291428571428571103752e+03"}, |
| {1729.142857142857, chars_format::scientific, 21, "1.729142857142857110375e+03"}, |
| {1729.142857142857, chars_format::scientific, 20, "1.72914285714285711038e+03"}, |
| {1729.142857142857, chars_format::scientific, 19, "1.7291428571428571104e+03"}, |
| {1729.142857142857, chars_format::scientific, 18, "1.729142857142857110e+03"}, |
| {1729.142857142857, chars_format::scientific, 17, "1.72914285714285711e+03"}, |
| {1729.142857142857, chars_format::scientific, 16, "1.7291428571428571e+03"}, |
| {1729.142857142857, chars_format::scientific, 15, "1.729142857142857e+03"}, |
| {1729.142857142857, chars_format::scientific, 14, "1.72914285714286e+03"}, |
| {1729.142857142857, chars_format::scientific, 13, "1.7291428571429e+03"}, |
| {1729.142857142857, chars_format::scientific, 12, "1.729142857143e+03"}, |
| {1729.142857142857, chars_format::scientific, 11, "1.72914285714e+03"}, |
| {1729.142857142857, chars_format::scientific, 10, "1.7291428571e+03"}, |
| {1729.142857142857, chars_format::scientific, 9, "1.729142857e+03"}, |
| {1729.142857142857, chars_format::scientific, 8, "1.72914286e+03"}, |
| {1729.142857142857, chars_format::scientific, 7, "1.7291429e+03"}, |
| {1729.142857142857, chars_format::scientific, 6, "1.729143e+03"}, |
| {1729.142857142857, chars_format::scientific, 5, "1.72914e+03"}, |
| {1729.142857142857, chars_format::scientific, 4, "1.7291e+03"}, |
| {1729.142857142857, chars_format::scientific, 3, "1.729e+03"}, |
| {1729.142857142857, chars_format::scientific, 2, "1.73e+03"}, |
| {1729.142857142857, chars_format::scientific, 1, "1.7e+03"}, |
| {1729.142857142857, chars_format::scientific, 0, "2e+03"}, |
| |
| // Negative precision requests 6 digits of precision. |
| {1729.142857142857, chars_format::scientific, -1, "1.729143e+03"}, |
| {1729.142857142857, chars_format::scientific, -2, "1.729143e+03"}, |
| {1729.142857142857, chars_format::scientific, -3, "1.729143e+03"}, |
| |
| // Ryu Printf d2fixed_test.cc D2expTest Carrying |
| {2.0009, chars_format::scientific, 4, "2.0009e+00"}, |
| {2.0009, chars_format::scientific, 3, "2.001e+00"}, |
| {2.0029, chars_format::scientific, 4, "2.0029e+00"}, |
| {2.0029, chars_format::scientific, 3, "2.003e+00"}, |
| {2.0099, chars_format::scientific, 4, "2.0099e+00"}, |
| {2.0099, chars_format::scientific, 3, "2.010e+00"}, |
| {2.0299, chars_format::scientific, 4, "2.0299e+00"}, |
| {2.0299, chars_format::scientific, 3, "2.030e+00"}, |
| {2.0999, chars_format::scientific, 4, "2.0999e+00"}, |
| {2.0999, chars_format::scientific, 3, "2.100e+00"}, |
| {2.2999, chars_format::scientific, 4, "2.2999e+00"}, |
| {2.2999, chars_format::scientific, 3, "2.300e+00"}, |
| {2.9999, chars_format::scientific, 4, "2.9999e+00"}, |
| {2.9999, chars_format::scientific, 3, "3.000e+00"}, |
| {9.9999, chars_format::scientific, 4, "9.9999e+00"}, |
| {9.9999, chars_format::scientific, 3, "1.000e+01"}, |
| |
| {2.09, chars_format::scientific, 2, "2.09e+00"}, |
| {2.09, chars_format::scientific, 1, "2.1e+00"}, |
| {2.29, chars_format::scientific, 2, "2.29e+00"}, |
| {2.29, chars_format::scientific, 1, "2.3e+00"}, |
| {2.99, chars_format::scientific, 2, "2.99e+00"}, |
| {2.99, chars_format::scientific, 1, "3.0e+00"}, |
| {9.99, chars_format::scientific, 2, "9.99e+00"}, |
| {9.99, chars_format::scientific, 1, "1.0e+01"}, |
| |
| {2.9, chars_format::scientific, 1, "2.9e+00"}, |
| {2.9, chars_format::scientific, 0, "3e+00"}, |
| {9.9, chars_format::scientific, 1, "9.9e+00"}, |
| {9.9, chars_format::scientific, 0, "1e+01"}, |
| |
| // Ryu Printf d2fixed_test.cc D2expTest Exponents |
| {9.99e-100, chars_format::scientific, 2, "9.99e-100"}, |
| {9.99e-99, chars_format::scientific, 2, "9.99e-99"}, |
| {9.99e-10, chars_format::scientific, 2, "9.99e-10"}, |
| {9.99e-09, chars_format::scientific, 2, "9.99e-09"}, |
| {9.99e-01, chars_format::scientific, 2, "9.99e-01"}, |
| {9.99e+00, chars_format::scientific, 2, "9.99e+00"}, |
| {9.99e+01, chars_format::scientific, 2, "9.99e+01"}, |
| {9.99e+09, chars_format::scientific, 2, "9.99e+09"}, |
| {9.99e+10, chars_format::scientific, 2, "9.99e+10"}, |
| {9.99e+99, chars_format::scientific, 2, "9.99e+99"}, |
| {9.99e+100, chars_format::scientific, 2, "9.99e+100"}, |
| |
| {9.99e-100, chars_format::scientific, 1, "1.0e-99"}, |
| {9.99e-99, chars_format::scientific, 1, "1.0e-98"}, |
| {9.99e-10, chars_format::scientific, 1, "1.0e-09"}, |
| {9.99e-09, chars_format::scientific, 1, "1.0e-08"}, |
| {9.99e-01, chars_format::scientific, 1, "1.0e+00"}, |
| {9.99e+00, chars_format::scientific, 1, "1.0e+01"}, |
| {9.99e+01, chars_format::scientific, 1, "1.0e+02"}, |
| {9.99e+09, chars_format::scientific, 1, "1.0e+10"}, |
| {9.99e+10, chars_format::scientific, 1, "1.0e+11"}, |
| {9.99e+99, chars_format::scientific, 1, "1.0e+100"}, |
| {9.99e+100, chars_format::scientific, 1, "1.0e+101"}, |
| |
| // Ryu Printf d2fixed_test.cc D2expTest PrintDecimalPoint |
| // These values exercise each codepath. |
| {1e+54, chars_format::scientific, 0, "1e+54"}, |
| {1e+54, chars_format::scientific, 1, "1.0e+54"}, |
| {1e-63, chars_format::scientific, 0, "1e-63"}, |
| {1e-63, chars_format::scientific, 1, "1.0e-63"}, |
| {1e+83, chars_format::scientific, 0, "1e+83"}, |
| {1e+83, chars_format::scientific, 1, "1.0e+83"}, |
| |
| // The UCRT had trouble with rounding this value. charconv was never affected, but let's test it anyways. |
| {0x1.88e2d605edc3dp+345, chars_format::scientific, 104, |
| "1.09995565999999994887854821710219658911365648587951921896774663603198787416706536331386569598149846892544e+" |
| "104"}, |
| {0x1.88e2d605edc3dp+345, chars_format::scientific, 18, "1.099955659999999949e+104"}, |
| {0x1.88e2d605edc3dp+345, chars_format::scientific, 17, "1.09995565999999995e+104"}, |
| {0x1.88e2d605edc3dp+345, chars_format::scientific, 16, "1.0999556599999999e+104"}, |
| {0x1.88e2d605edc3dp+345, chars_format::scientific, 15, "1.099955660000000e+104"}, |
| {0x1.88e2d605edc3dp+345, chars_format::scientific, 14, "1.09995566000000e+104"}, |
| {0x1.88e2d605edc3dp+345, chars_format::scientific, 13, "1.0999556600000e+104"}, |
| {0x1.88e2d605edc3dp+345, chars_format::scientific, 12, "1.099955660000e+104"}, |
| {0x1.88e2d605edc3dp+345, chars_format::scientific, 11, "1.09995566000e+104"}, |
| {0x1.88e2d605edc3dp+345, chars_format::scientific, 10, "1.0999556600e+104"}, |
| {0x1.88e2d605edc3dp+345, chars_format::scientific, 9, "1.099955660e+104"}, |
| {0x1.88e2d605edc3dp+345, chars_format::scientific, 8, "1.09995566e+104"}, |
| {0x1.88e2d605edc3dp+345, chars_format::scientific, 7, "1.0999557e+104"}, |
| {0x1.88e2d605edc3dp+345, chars_format::scientific, 6, "1.099956e+104"}, |
| {0x1.88e2d605edc3dp+345, chars_format::scientific, 5, "1.09996e+104"}, |
| {0x1.88e2d605edc3dp+345, chars_format::scientific, 4, "1.1000e+104"}, |
| {0x1.88e2d605edc3dp+345, chars_format::scientific, 3, "1.100e+104"}, |
| {0x1.88e2d605edc3dp+345, chars_format::scientific, 2, "1.10e+104"}, |
| {0x1.88e2d605edc3dp+345, chars_format::scientific, 1, "1.1e+104"}, |
| {0x1.88e2d605edc3dp+345, chars_format::scientific, 0, "1e+104"}, |
| |
| // More cases that the UCRT had trouble with (e.g. DevCom-1093399). |
| {0x1.8p+62, chars_format::scientific, 16, "6.9175290276410819e+18"}, |
| {0x1.0a2742p+17, chars_format::scientific, 5, "1.36271e+05"}, |
| {0x1.f8b0f962cdffbp+205, chars_format::scientific, 13, "1.0137595739223e+62"}, |
| {0x1.f8b0f962cdffbp+205, chars_format::scientific, 16, "1.0137595739222531e+62"}, |
| {0x1.f8b0f962cdffbp+205, chars_format::scientific, 50, "1.01375957392225305727423222620636224221808910954041e+62"}, |
| {0x1.f8b0f962cdffbp+205, chars_format::scientific, 54, |
| "1.013759573922253057274232226206362242218089109540405973e+62"}, |
| }; |
| |
| #endif // DOUBLE_SCIENTIFIC_PRECISION_TO_CHARS_TEST_CASES_1_HPP |