// 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_FIXED_PRECISION_TO_CHARS_TEST_CASES_1_HPP
#define DOUBLE_FIXED_PRECISION_TO_CHARS_TEST_CASES_1_HPP
#include <charconv>
#include "test.hpp"
using namespace std;
inline constexpr DoublePrecisionToCharsTestCase double_fixed_precision_to_chars_test_cases_1[] = {
// Test special cases (zero, inf, nan) and an ordinary case. Also test negative signs.
{0.0, chars_format::fixed, 4, "0.0000"},
{-0.0, chars_format::fixed, 4, "-0.0000"},
{double_inf, chars_format::fixed, 4, "inf"},
{-double_inf, chars_format::fixed, 4, "-inf"},
{double_nan, chars_format::fixed, 4, "nan"},
{-double_nan, chars_format::fixed, 4, "-nan(ind)"},
{double_nan_payload, chars_format::fixed, 4, "nan"},
{-double_nan_payload, chars_format::fixed, 4, "-nan"},
{1.729, chars_format::fixed, 4, "1.7290"},
{-1.729, chars_format::fixed, 4, "-1.7290"},
// Ryu Printf d2fixed_test.cc D2fixedTest Basic
{0x1.000000001869fp+211, chars_format::fixed, 0,
"3291009114715486435425664845573426149758869524108446525879746560"},
// Ryu Printf d2fixed_test.cc D2fixedTest Zero
{0.0, chars_format::fixed, 4, "0.0000"},
{0.0, chars_format::fixed, 3, "0.000"},
{0.0, chars_format::fixed, 2, "0.00"},
{0.0, chars_format::fixed, 1, "0.0"},
{0.0, chars_format::fixed, 0, "0"},
// Ryu Printf d2fixed_test.cc D2fixedTest MinMax
{0x0.0000000000001p-1022, chars_format::fixed, 1074,
"0.0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
"000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
"000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
"000000000000000000000000000000000000000000000000000000049406564584124654417656879286822137"
"236505980261432476442558568250067550727020875186529983636163599237979656469544571773092665"
"671035593979639877479601078187812630071319031140452784581716784898210368871863605699873072"
"305000638740915356498438731247339727316961514003171538539807412623856559117102665855668676"
"818703956031062493194527159149245532930545654440112748012970999954193198940908041656332452"
"475714786901472678015935523861155013480352649347201937902681071074917033322268447533357208"
"324319360923828934583680601060115061698097530783422773183292479049825247307763759272478746"
"560847782037344696995336470179726777175851256605511991315048911014510378627381672509558373"
"89733598993664809941164205702637090279242767544565229087538682506419718265533447265625"},
{0x1.fffffffffffffp+1023, chars_format::fixed, 0,
"179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558"
"632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245"
"490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168"
"738177180919299881250404026184124858368"},
// Test more corner cases.
{0x0.fffffffffffffp-1022, chars_format::fixed, 1074,
"0."
"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000022250738585"
"0720088902458687608585988765042311224095946549352480256244000922823569517877588880375915526423097809504343"
"1208587738715835729182199302029437922422355981982750124204178896957131179108226104397197960400045489739193"
"8079198936081525613113376149842043271751033627391549782731594143828136275113838604094249464942286316695429"
"1050802018159266421349966065178030950759130587198464239060686371020051087232827846788436319445158661350412"
"2347901479236958520832159762106637540161373658304419360371477835530668283453563400507407304013560296804637"
"5918583163124224521599262546494300836851861719422417646455137135420132217031370496583210154654068035397417"
"9060225895030235019375197730309457631732108525072993050897615825191597207572324554347709124613174935802817"
"34466552734375"}, // max subnormal
{0x1p-1022, chars_format::fixed, 1022,
"0."
"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000022250738585"
"0720138309023271733240406421921598046233183055332741688720443481391819585428315901251102056406733973103581"
"1005152434161553460108856012385377718821130777993532002330479610147442583636071921565046942503734208375250"
"8066506166581589487204911799685916396485006359087701183048747997808877537499494515804516050509153998565824"
"7081864511353793580499211598108576605199243335211435239014879569960959128889160299264151106346631339366347"
"7586513029371762047325631781485664350872122828637642044846811407613911477062801689853244110024161447421618"
"5671661505401542850847167529019031613227788967297073731233340869889831750678388469260927739779728586596549"
"41091369095406136467568702398678315290680984617210924625396728515625"}, // min normal
// Ryu Printf d2fixed_test.cc D2fixedTest RoundToEven
{0.125, chars_format::fixed, 3, "0.125"},
{0.125, chars_format::fixed, 2, "0.12"},
{0.375, chars_format::fixed, 3, "0.375"},
{0.375, chars_format::fixed, 2, "0.38"},
// Ryu Printf d2fixed_test.cc D2fixedTest RoundToEvenInteger
{2.5, chars_format::fixed, 1, "2.5"},
{2.5, chars_format::fixed, 0, "2"},
{3.5, chars_format::fixed, 1, "3.5"},
{3.5, chars_format::fixed, 0, "4"},
// Ryu Printf d2fixed_test.cc D2fixedTest NonRoundToEvenScenarios
{0.748046875, chars_format::fixed, 3, "0.748"},
{0.748046875, chars_format::fixed, 2, "0.75"},
{0.748046875, chars_format::fixed, 1, "0.7"}, // 0.75 would round to "0.8", but this is smaller
{0.2509765625, chars_format::fixed, 3, "0.251"},
{0.2509765625, chars_format::fixed, 2, "0.25"},
{0.2509765625, chars_format::fixed, 1, "0.3"}, // 0.25 would round to "0.2", but this is larger
{0x1.0000000000001p-2, chars_format::fixed, 54, "0.250000000000000055511151231257827021181583404541015625"},
{0x1.0000000000001p-2, chars_format::fixed, 3, "0.250"},
{0x1.0000000000001p-2, chars_format::fixed, 2, "0.25"},
{0x1.0000000000001p-2, chars_format::fixed, 1, "0.3"}, // 0.25 would round to "0.2", but this is larger (again)
// More rounding tests.
{9.5, chars_format::fixed, 1, "9.5"},
{9.5, chars_format::fixed, 0, "10"},
{10.5, chars_format::fixed, 1, "10.5"},
{10.5, chars_format::fixed, 0, "10"},
{1.241, chars_format::fixed, 3, "1.241"},
{1.241, chars_format::fixed, 1, "1.2"},
{1.251, chars_format::fixed, 3, "1.251"},
{1.251, chars_format::fixed, 1, "1.3"},
{1.261, chars_format::fixed, 3, "1.261"},
{1.261, chars_format::fixed, 1, "1.3"},
{1.341, chars_format::fixed, 3, "1.341"},
{1.341, chars_format::fixed, 1, "1.3"},
{1.351, chars_format::fixed, 3, "1.351"},
{1.351, chars_format::fixed, 1, "1.4"},
{1.361, chars_format::fixed, 3, "1.361"},
{1.361, chars_format::fixed, 1, "1.4"},
{2.41, chars_format::fixed, 2, "2.41"},
{2.41, chars_format::fixed, 0, "2"},
{2.51, chars_format::fixed, 2, "2.51"},
{2.51, chars_format::fixed, 0, "3"},
{2.61, chars_format::fixed, 2, "2.61"},
{2.61, chars_format::fixed, 0, "3"},
{3.41, chars_format::fixed, 2, "3.41"},
{3.41, chars_format::fixed, 0, "3"},
{3.51, chars_format::fixed, 2, "3.51"},
{3.51, chars_format::fixed, 0, "4"},
{3.61, chars_format::fixed, 2, "3.61"},
{3.61, chars_format::fixed, 0, "4"},
// Ryu Printf d2fixed_test.cc D2fixedTest VaryingPrecision
{1729.142857142857, chars_format::fixed, 47, "1729.14285714285711037518922239542007446289062500000"},
{1729.142857142857, chars_format::fixed, 46, "1729.1428571428571103751892223954200744628906250000"},
{1729.142857142857, chars_format::fixed, 45, "1729.142857142857110375189222395420074462890625000"},
{1729.142857142857, chars_format::fixed, 44, "1729.14285714285711037518922239542007446289062500"},
{1729.142857142857, chars_format::fixed, 43, "1729.1428571428571103751892223954200744628906250"},
{1729.142857142857, chars_format::fixed, 42, "1729.142857142857110375189222395420074462890625"},
{1729.142857142857, chars_format::fixed, 41, "1729.14285714285711037518922239542007446289062"},
{1729.142857142857, chars_format::fixed, 40, "1729.1428571428571103751892223954200744628906"},
{1729.142857142857, chars_format::fixed, 39, "1729.142857142857110375189222395420074462891"},
{1729.142857142857, chars_format::fixed, 38, "1729.14285714285711037518922239542007446289"},
{1729.142857142857, chars_format::fixed, 37, "1729.1428571428571103751892223954200744629"},
{1729.142857142857, chars_format::fixed, 36, "1729.142857142857110375189222395420074463"},
{1729.142857142857, chars_format::fixed, 35, "1729.14285714285711037518922239542007446"},
{1729.142857142857, chars_format::fixed, 34, "1729.1428571428571103751892223954200745"},
{1729.142857142857, chars_format::fixed, 33, "1729.142857142857110375189222395420074"},
{1729.142857142857, chars_format::fixed, 32, "1729.14285714285711037518922239542007"},
{1729.142857142857, chars_format::fixed, 31, "1729.1428571428571103751892223954201"},
{1729.142857142857, chars_format::fixed, 30, "1729.142857142857110375189222395420"},
{1729.142857142857, chars_format::fixed, 29, "1729.14285714285711037518922239542"},
{1729.142857142857, chars_format::fixed, 28, "1729.1428571428571103751892223954"},
{1729.142857142857, chars_format::fixed, 27, "1729.142857142857110375189222395"},
{1729.142857142857, chars_format::fixed, 26, "1729.14285714285711037518922240"},
{1729.142857142857, chars_format::fixed, 25, "1729.1428571428571103751892224"},
{1729.142857142857, chars_format::fixed, 24, "1729.142857142857110375189222"},
{1729.142857142857, chars_format::fixed, 23, "1729.14285714285711037518922"},
{1729.142857142857, chars_format::fixed, 22, "1729.1428571428571103751892"},
{1729.142857142857, chars_format::fixed, 21, "1729.142857142857110375189"},
{1729.142857142857, chars_format::fixed, 20, "1729.14285714285711037519"},
{1729.142857142857, chars_format::fixed, 19, "1729.1428571428571103752"},
{1729.142857142857, chars_format::fixed, 18, "1729.142857142857110375"},
{1729.142857142857, chars_format::fixed, 17, "1729.14285714285711038"},
{1729.142857142857, chars_format::fixed, 16, "1729.1428571428571104"},
{1729.142857142857, chars_format::fixed, 15, "1729.142857142857110"},
{1729.142857142857, chars_format::fixed, 14, "1729.14285714285711"},
{1729.142857142857, chars_format::fixed, 13, "1729.1428571428571"},
{1729.142857142857, chars_format::fixed, 12, "1729.142857142857"},
{1729.142857142857, chars_format::fixed, 11, "1729.14285714286"},
{1729.142857142857, chars_format::fixed, 10, "1729.1428571429"},
{1729.142857142857, chars_format::fixed, 9, "1729.142857143"},
{1729.142857142857, chars_format::fixed, 8, "1729.14285714"},
{1729.142857142857, chars_format::fixed, 7, "1729.1428571"},
{1729.142857142857, chars_format::fixed, 6, "1729.142857"},
{1729.142857142857, chars_format::fixed, 5, "1729.14286"},
{1729.142857142857, chars_format::fixed, 4, "1729.1429"},
{1729.142857142857, chars_format::fixed, 3, "1729.143"},
{1729.142857142857, chars_format::fixed, 2, "1729.14"},
{1729.142857142857, chars_format::fixed, 1, "1729.1"},
{1729.142857142857, chars_format::fixed, 0, "1729"},
// Negative precision requests 6 digits of precision.
{1729.142857142857, chars_format::fixed, -1, "1729.142857"},
{1729.142857142857, chars_format::fixed, -2, "1729.142857"},
{1729.142857142857, chars_format::fixed, -3, "1729.142857"},
// Ryu Printf d2fixed_test.cc D2fixedTest Carrying
{0.0009, chars_format::fixed, 4, "0.0009"},
{0.0009, chars_format::fixed, 3, "0.001"},
{0.0029, chars_format::fixed, 4, "0.0029"},
{0.0029, chars_format::fixed, 3, "0.003"},
{0.0099, chars_format::fixed, 4, "0.0099"},
{0.0099, chars_format::fixed, 3, "0.010"},
{0.0299, chars_format::fixed, 4, "0.0299"},
{0.0299, chars_format::fixed, 3, "0.030"},
{0.0999, chars_format::fixed, 4, "0.0999"},
{0.0999, chars_format::fixed, 3, "0.100"},
{0.2999, chars_format::fixed, 4, "0.2999"},
{0.2999, chars_format::fixed, 3, "0.300"},
{0.9999, chars_format::fixed, 4, "0.9999"},
{0.9999, chars_format::fixed, 3, "1.000"},
{2.9999, chars_format::fixed, 4, "2.9999"},
{2.9999, chars_format::fixed, 3, "3.000"},
{9.9999, chars_format::fixed, 4, "9.9999"},
{9.9999, chars_format::fixed, 3, "10.000"},
{29.9999, chars_format::fixed, 4, "29.9999"},
{29.9999, chars_format::fixed, 3, "30.000"},
{99.9999, chars_format::fixed, 4, "99.9999"},
{99.9999, chars_format::fixed, 3, "100.000"},
{299.9999, chars_format::fixed, 4, "299.9999"},
{299.9999, chars_format::fixed, 3, "300.000"},
{0.09, chars_format::fixed, 2, "0.09"},
{0.09, chars_format::fixed, 1, "0.1"},
{0.29, chars_format::fixed, 2, "0.29"},
{0.29, chars_format::fixed, 1, "0.3"},
{0.99, chars_format::fixed, 2, "0.99"},
{0.99, chars_format::fixed, 1, "1.0"},
{2.99, chars_format::fixed, 2, "2.99"},
{2.99, chars_format::fixed, 1, "3.0"},
{9.99, chars_format::fixed, 2, "9.99"},
{9.99, chars_format::fixed, 1, "10.0"},
{29.99, chars_format::fixed, 2, "29.99"},
{29.99, chars_format::fixed, 1, "30.0"},
{99.99, chars_format::fixed, 2, "99.99"},
{99.99, chars_format::fixed, 1, "100.0"},
{299.99, chars_format::fixed, 2, "299.99"},
{299.99, chars_format::fixed, 1, "300.0"},
{0.9, chars_format::fixed, 1, "0.9"},
{0.9, chars_format::fixed, 0, "1"},
{2.9, chars_format::fixed, 1, "2.9"},
{2.9, chars_format::fixed, 0, "3"},
{9.9, chars_format::fixed, 1, "9.9"},
{9.9, chars_format::fixed, 0, "10"},
{29.9, chars_format::fixed, 1, "29.9"},
{29.9, chars_format::fixed, 0, "30"},
{99.9, chars_format::fixed, 1, "99.9"},
{99.9, chars_format::fixed, 0, "100"},
{299.9, chars_format::fixed, 1, "299.9"},
{299.9, chars_format::fixed, 0, "300"},
// Ryu Printf d2fixed_test.cc D2fixedTest RoundingResultZero
{0.004, chars_format::fixed, 3, "0.004"},
{0.004, chars_format::fixed, 2, "0.00"},
{0.4, chars_format::fixed, 1, "0.4"},
{0.4, chars_format::fixed, 0, "0"},
{0.5, chars_format::fixed, 1, "0.5"},
{0.5, chars_format::fixed, 0, "0"},
// Ryu Printf d2fixed_test.cc D2fixedTest Regression
{7.018232e-82, chars_format::fixed, 6, "0.000000"},
};
#endif // DOUBLE_FIXED_PRECISION_TO_CHARS_TEST_CASES_1_HPP