1c5f01b2fSopenharmony_ci//     __ _____ _____ _____
2c5f01b2fSopenharmony_ci//  __|  |   __|     |   | |  JSON for Modern C++ (supporting code)
3c5f01b2fSopenharmony_ci// |  |  |__   |  |  | | | |  version 3.11.2
4c5f01b2fSopenharmony_ci// |_____|_____|_____|_|___|  https://github.com/nlohmann/json
5c5f01b2fSopenharmony_ci//
6c5f01b2fSopenharmony_ci// SPDX-FileCopyrightText: 2013-2022 Niels Lohmann <https://nlohmann.me>
7c5f01b2fSopenharmony_ci// SPDX-License-Identifier: MIT
8c5f01b2fSopenharmony_ci
9c5f01b2fSopenharmony_ci// XXX:
10c5f01b2fSopenharmony_ci// Only compile these tests if 'float' and 'double' are IEEE-754 single- and
11c5f01b2fSopenharmony_ci// double-precision numbers, resp.
12c5f01b2fSopenharmony_ci
13c5f01b2fSopenharmony_ci#include "doctest_compatibility.h"
14c5f01b2fSopenharmony_ci
15c5f01b2fSopenharmony_ci#include <nlohmann/json.hpp>
16c5f01b2fSopenharmony_ciusing nlohmann::detail::dtoa_impl::reinterpret_bits;
17c5f01b2fSopenharmony_ci
18c5f01b2fSopenharmony_cinamespace
19c5f01b2fSopenharmony_ci{
20c5f01b2fSopenharmony_cifloat make_float(uint32_t sign_bit, uint32_t biased_exponent, uint32_t significand)
21c5f01b2fSopenharmony_ci{
22c5f01b2fSopenharmony_ci    assert(sign_bit == 0 || sign_bit == 1);
23c5f01b2fSopenharmony_ci    assert(biased_exponent <= 0xFF);
24c5f01b2fSopenharmony_ci    assert(significand <= 0x007FFFFF);
25c5f01b2fSopenharmony_ci
26c5f01b2fSopenharmony_ci    uint32_t bits = 0;
27c5f01b2fSopenharmony_ci
28c5f01b2fSopenharmony_ci    bits |= sign_bit << 31;
29c5f01b2fSopenharmony_ci    bits |= biased_exponent << 23;
30c5f01b2fSopenharmony_ci    bits |= significand;
31c5f01b2fSopenharmony_ci
32c5f01b2fSopenharmony_ci    return reinterpret_bits<float>(bits);
33c5f01b2fSopenharmony_ci}
34c5f01b2fSopenharmony_ci
35c5f01b2fSopenharmony_ci// ldexp -- convert f * 2^e to IEEE single precision
36c5f01b2fSopenharmony_cifloat make_float(uint64_t f, int e)
37c5f01b2fSopenharmony_ci{
38c5f01b2fSopenharmony_ci    constexpr uint64_t kHiddenBit               = 0x00800000;
39c5f01b2fSopenharmony_ci    constexpr uint64_t kSignificandMask         = 0x007FFFFF;
40c5f01b2fSopenharmony_ci    constexpr int      kPhysicalSignificandSize = 23;  // Excludes the hidden bit.
41c5f01b2fSopenharmony_ci    constexpr int      kExponentBias            = 0x7F + kPhysicalSignificandSize;
42c5f01b2fSopenharmony_ci    constexpr int      kDenormalExponent        = 1 -    kExponentBias;
43c5f01b2fSopenharmony_ci    constexpr int      kMaxExponent             = 0xFF - kExponentBias;
44c5f01b2fSopenharmony_ci
45c5f01b2fSopenharmony_ci    while (f > kHiddenBit + kSignificandMask)
46c5f01b2fSopenharmony_ci    {
47c5f01b2fSopenharmony_ci        f >>= 1;
48c5f01b2fSopenharmony_ci        e++;
49c5f01b2fSopenharmony_ci    }
50c5f01b2fSopenharmony_ci    if (e >= kMaxExponent)
51c5f01b2fSopenharmony_ci    {
52c5f01b2fSopenharmony_ci        return std::numeric_limits<float>::infinity();
53c5f01b2fSopenharmony_ci    }
54c5f01b2fSopenharmony_ci    if (e < kDenormalExponent)
55c5f01b2fSopenharmony_ci    {
56c5f01b2fSopenharmony_ci        return 0.0;
57c5f01b2fSopenharmony_ci    }
58c5f01b2fSopenharmony_ci    while (e > kDenormalExponent && (f & kHiddenBit) == 0)
59c5f01b2fSopenharmony_ci    {
60c5f01b2fSopenharmony_ci        f <<= 1;
61c5f01b2fSopenharmony_ci        e--;
62c5f01b2fSopenharmony_ci    }
63c5f01b2fSopenharmony_ci
64c5f01b2fSopenharmony_ci    uint64_t biased_exponent = (e == kDenormalExponent && (f & kHiddenBit) == 0)
65c5f01b2fSopenharmony_ci                               ? 0
66c5f01b2fSopenharmony_ci                               : static_cast<uint64_t>(e + kExponentBias);
67c5f01b2fSopenharmony_ci
68c5f01b2fSopenharmony_ci    uint64_t bits = (f & kSignificandMask) | (biased_exponent << kPhysicalSignificandSize);
69c5f01b2fSopenharmony_ci    return reinterpret_bits<float>(static_cast<uint32_t>(bits));
70c5f01b2fSopenharmony_ci}
71c5f01b2fSopenharmony_ci
72c5f01b2fSopenharmony_cidouble make_double(uint64_t sign_bit, uint64_t biased_exponent, uint64_t significand)
73c5f01b2fSopenharmony_ci{
74c5f01b2fSopenharmony_ci    assert(sign_bit == 0 || sign_bit == 1);
75c5f01b2fSopenharmony_ci    assert(biased_exponent <= 0x7FF);
76c5f01b2fSopenharmony_ci    assert(significand <= 0x000FFFFFFFFFFFFF);
77c5f01b2fSopenharmony_ci
78c5f01b2fSopenharmony_ci    uint64_t bits = 0;
79c5f01b2fSopenharmony_ci
80c5f01b2fSopenharmony_ci    bits |= sign_bit << 63;
81c5f01b2fSopenharmony_ci    bits |= biased_exponent << 52;
82c5f01b2fSopenharmony_ci    bits |= significand;
83c5f01b2fSopenharmony_ci
84c5f01b2fSopenharmony_ci    return reinterpret_bits<double>(bits);
85c5f01b2fSopenharmony_ci}
86c5f01b2fSopenharmony_ci
87c5f01b2fSopenharmony_ci// ldexp -- convert f * 2^e to IEEE double precision
88c5f01b2fSopenharmony_cidouble make_double(uint64_t f, int e)
89c5f01b2fSopenharmony_ci{
90c5f01b2fSopenharmony_ci    constexpr uint64_t kHiddenBit               = 0x0010000000000000;
91c5f01b2fSopenharmony_ci    constexpr uint64_t kSignificandMask         = 0x000FFFFFFFFFFFFF;
92c5f01b2fSopenharmony_ci    constexpr int      kPhysicalSignificandSize = 52;  // Excludes the hidden bit.
93c5f01b2fSopenharmony_ci    constexpr int      kExponentBias            = 0x3FF + kPhysicalSignificandSize;
94c5f01b2fSopenharmony_ci    constexpr int      kDenormalExponent        = 1     - kExponentBias;
95c5f01b2fSopenharmony_ci    constexpr int      kMaxExponent             = 0x7FF - kExponentBias;
96c5f01b2fSopenharmony_ci
97c5f01b2fSopenharmony_ci    while (f > kHiddenBit + kSignificandMask)
98c5f01b2fSopenharmony_ci    {
99c5f01b2fSopenharmony_ci        f >>= 1;
100c5f01b2fSopenharmony_ci        e++;
101c5f01b2fSopenharmony_ci    }
102c5f01b2fSopenharmony_ci    if (e >= kMaxExponent)
103c5f01b2fSopenharmony_ci    {
104c5f01b2fSopenharmony_ci        return std::numeric_limits<double>::infinity();
105c5f01b2fSopenharmony_ci    }
106c5f01b2fSopenharmony_ci    if (e < kDenormalExponent)
107c5f01b2fSopenharmony_ci    {
108c5f01b2fSopenharmony_ci        return 0.0;
109c5f01b2fSopenharmony_ci    }
110c5f01b2fSopenharmony_ci    while (e > kDenormalExponent && (f & kHiddenBit) == 0)
111c5f01b2fSopenharmony_ci    {
112c5f01b2fSopenharmony_ci        f <<= 1;
113c5f01b2fSopenharmony_ci        e--;
114c5f01b2fSopenharmony_ci    }
115c5f01b2fSopenharmony_ci
116c5f01b2fSopenharmony_ci    uint64_t biased_exponent = (e == kDenormalExponent && (f & kHiddenBit) == 0)
117c5f01b2fSopenharmony_ci                               ? 0
118c5f01b2fSopenharmony_ci                               : static_cast<uint64_t>(e + kExponentBias);
119c5f01b2fSopenharmony_ci
120c5f01b2fSopenharmony_ci    uint64_t bits = (f & kSignificandMask) | (biased_exponent << kPhysicalSignificandSize);
121c5f01b2fSopenharmony_ci    return reinterpret_bits<double>(bits);
122c5f01b2fSopenharmony_ci}
123c5f01b2fSopenharmony_ci} // namespace
124c5f01b2fSopenharmony_ci
125c5f01b2fSopenharmony_ciTEST_CASE("digit gen")
126c5f01b2fSopenharmony_ci{
127c5f01b2fSopenharmony_ci    SECTION("single precision")
128c5f01b2fSopenharmony_ci    {
129c5f01b2fSopenharmony_ci        auto check_float = [](float number, const std::string & digits, int expected_exponent)
130c5f01b2fSopenharmony_ci        {
131c5f01b2fSopenharmony_ci            CAPTURE(number)
132c5f01b2fSopenharmony_ci            CAPTURE(digits)
133c5f01b2fSopenharmony_ci            CAPTURE(expected_exponent)
134c5f01b2fSopenharmony_ci
135c5f01b2fSopenharmony_ci            std::array<char, 32> buf{};
136c5f01b2fSopenharmony_ci            int len = 0;
137c5f01b2fSopenharmony_ci            int exponent = 0;
138c5f01b2fSopenharmony_ci            nlohmann::detail::dtoa_impl::grisu2(buf.data(), len, exponent, number);
139c5f01b2fSopenharmony_ci
140c5f01b2fSopenharmony_ci            CHECK(digits == std::string(buf.data(), buf.data() + len));
141c5f01b2fSopenharmony_ci            CHECK(expected_exponent == exponent);
142c5f01b2fSopenharmony_ci        };
143c5f01b2fSopenharmony_ci
144c5f01b2fSopenharmony_ci        check_float(make_float(0,   0, 0x00000001),        "1", -45); // min denormal
145c5f01b2fSopenharmony_ci        check_float(make_float(0,   0, 0x007FFFFF), "11754942", -45); // max denormal
146c5f01b2fSopenharmony_ci        check_float(make_float(0,   1, 0x00000000), "11754944", -45); // min normal
147c5f01b2fSopenharmony_ci        check_float(make_float(0,   1, 0x00000001), "11754945", -45);
148c5f01b2fSopenharmony_ci        check_float(make_float(0,   1, 0x007FFFFF), "23509886", -45);
149c5f01b2fSopenharmony_ci        check_float(make_float(0,   2, 0x00000000), "23509887", -45);
150c5f01b2fSopenharmony_ci        check_float(make_float(0,   2, 0x00000001),  "2350989", -44);
151c5f01b2fSopenharmony_ci        check_float(make_float(0,  24, 0x00000000), "98607613", -39); // fail if no special case in normalized boundaries
152c5f01b2fSopenharmony_ci        check_float(make_float(0,  30, 0x00000000), "63108872", -37); // fail if no special case in normalized boundaries
153c5f01b2fSopenharmony_ci        check_float(make_float(0,  31, 0x00000000), "12621775", -36); // fail if no special case in normalized boundaries
154c5f01b2fSopenharmony_ci        check_float(make_float(0,  57, 0x00000000), "84703295", -29); // fail if no special case in normalized boundaries
155c5f01b2fSopenharmony_ci        check_float(make_float(0, 254, 0x007FFFFE), "34028233",  31);
156c5f01b2fSopenharmony_ci        check_float(make_float(0, 254, 0x007FFFFF), "34028235",  31); // max normal
157c5f01b2fSopenharmony_ci
158c5f01b2fSopenharmony_ci        // V. Paxson and W. Kahan, "A Program for Testing IEEE Binary-Decimal Conversion", manuscript, May 1991,
159c5f01b2fSopenharmony_ci        // ftp://ftp.ee.lbl.gov/testbase-report.ps.Z    (report)
160c5f01b2fSopenharmony_ci        // ftp://ftp.ee.lbl.gov/testbase.tar.Z          (program)
161c5f01b2fSopenharmony_ci
162c5f01b2fSopenharmony_ci        // Table 16: Stress Inputs for Converting 24-bit Binary to Decimal, < 1/2 ULP
163c5f01b2fSopenharmony_ci        check_float(make_float(12676506, -102),       "25", -25);
164c5f01b2fSopenharmony_ci        check_float(make_float(12676506, -103),      "125", -26);
165c5f01b2fSopenharmony_ci        check_float(make_float(15445013,   86),     "1195",  30);
166c5f01b2fSopenharmony_ci        check_float(make_float(13734123, -138),    "39415", -39);
167c5f01b2fSopenharmony_ci        check_float(make_float(12428269, -130),   "913085", -38);
168c5f01b2fSopenharmony_ci        check_float(make_float(15334037, -146),  "1719005", -43);
169c5f01b2fSopenharmony_ci        check_float(make_float(11518287,  -41), "52379105", -13);
170c5f01b2fSopenharmony_ci        check_float(make_float(12584953, -145),  "2821644", -43);
171c5f01b2fSopenharmony_ci        check_float(make_float(15961084, -125), "37524328", -38);
172c5f01b2fSopenharmony_ci        check_float(make_float(14915817, -146), "16721209", -44);
173c5f01b2fSopenharmony_ci        check_float(make_float(10845484, -102), "21388946", -31);
174c5f01b2fSopenharmony_ci        check_float(make_float(16431059,  -61),  "7125836", -18);
175c5f01b2fSopenharmony_ci
176c5f01b2fSopenharmony_ci        // Table 17: Stress Inputs for Converting 24-bit Binary to Decimal, > 1/2 ULP
177c5f01b2fSopenharmony_ci        check_float(make_float(16093626,   69),       "95",  26);
178c5f01b2fSopenharmony_ci        check_float(make_float( 9983778,   25),      "335",  12);
179c5f01b2fSopenharmony_ci        check_float(make_float(12745034,  104),     "2585",  35);
180c5f01b2fSopenharmony_ci        check_float(make_float(12706553,   72),    "60005",  24);
181c5f01b2fSopenharmony_ci        check_float(make_float(11005028,   45),   "387205",  15);
182c5f01b2fSopenharmony_ci        check_float(make_float(15059547,   71),  "3555835",  22);
183c5f01b2fSopenharmony_ci        check_float(make_float(16015691,  -99), "25268305", -30);
184c5f01b2fSopenharmony_ci        check_float(make_float( 8667859,   56),  "6245851",  17);
185c5f01b2fSopenharmony_ci        check_float(make_float(14855922,  -82), "30721327", -25);
186c5f01b2fSopenharmony_ci        check_float(make_float(14855922,  -83), "15360663", -25);
187c5f01b2fSopenharmony_ci        check_float(make_float(10144164, -110),   "781478", -32);
188c5f01b2fSopenharmony_ci        check_float(make_float(13248074,   95), "52481028",  28);
189c5f01b2fSopenharmony_ci    }
190c5f01b2fSopenharmony_ci
191c5f01b2fSopenharmony_ci    SECTION("double precision")
192c5f01b2fSopenharmony_ci    {
193c5f01b2fSopenharmony_ci        auto check_double = [](double number, const std::string & digits, int expected_exponent)
194c5f01b2fSopenharmony_ci        {
195c5f01b2fSopenharmony_ci            CAPTURE(number)
196c5f01b2fSopenharmony_ci            CAPTURE(digits)
197c5f01b2fSopenharmony_ci            CAPTURE(expected_exponent)
198c5f01b2fSopenharmony_ci
199c5f01b2fSopenharmony_ci            std::array<char, 32> buf{};
200c5f01b2fSopenharmony_ci            int len = 0;
201c5f01b2fSopenharmony_ci            int exponent = 0;
202c5f01b2fSopenharmony_ci            nlohmann::detail::dtoa_impl::grisu2(buf.data(), len, exponent, number);
203c5f01b2fSopenharmony_ci
204c5f01b2fSopenharmony_ci            CHECK(digits == std::string(buf.data(), buf.data() + len));
205c5f01b2fSopenharmony_ci            CHECK(expected_exponent == exponent);
206c5f01b2fSopenharmony_ci        };
207c5f01b2fSopenharmony_ci
208c5f01b2fSopenharmony_ci        check_double(make_double(0,    0, 0x0000000000000001),                 "5", -324); // min denormal
209c5f01b2fSopenharmony_ci        check_double(make_double(0,    0, 0x000FFFFFFFFFFFFF),  "2225073858507201", -323); // max denormal
210c5f01b2fSopenharmony_ci        check_double(make_double(0,    1, 0x0000000000000000), "22250738585072014", -324); // min normal
211c5f01b2fSopenharmony_ci        check_double(make_double(0,    1, 0x0000000000000001),  "2225073858507202", -323);
212c5f01b2fSopenharmony_ci        check_double(make_double(0,    1, 0x000FFFFFFFFFFFFF), "44501477170144023", -324);
213c5f01b2fSopenharmony_ci        check_double(make_double(0,    2, 0x0000000000000000),  "4450147717014403", -323);
214c5f01b2fSopenharmony_ci        check_double(make_double(0,    2, 0x0000000000000001),  "4450147717014404", -323);
215c5f01b2fSopenharmony_ci        check_double(make_double(0,    4, 0x0000000000000000), "17800590868057611", -323); // fail if no special case in normalized boundaries
216c5f01b2fSopenharmony_ci        check_double(make_double(0,    5, 0x0000000000000000), "35601181736115222", -323); // fail if no special case in normalized boundaries
217c5f01b2fSopenharmony_ci        check_double(make_double(0,    6, 0x0000000000000000),  "7120236347223045", -322); // fail if no special case in normalized boundaries
218c5f01b2fSopenharmony_ci        check_double(make_double(0,   10, 0x0000000000000000), "11392378155556871", -321); // fail if no special case in normalized boundaries
219c5f01b2fSopenharmony_ci        check_double(make_double(0, 2046, 0x000FFFFFFFFFFFFE), "17976931348623155",  292);
220c5f01b2fSopenharmony_ci        check_double(make_double(0, 2046, 0x000FFFFFFFFFFFFF), "17976931348623157",  292); // max normal
221c5f01b2fSopenharmony_ci
222c5f01b2fSopenharmony_ci        // Test different paths in DigitGen
223c5f01b2fSopenharmony_ci        check_double(                  10000,                 "1",    4);
224c5f01b2fSopenharmony_ci        check_double(                1200000,                "12",    5);
225c5f01b2fSopenharmony_ci        check_double(4.9406564584124654e-324,                 "5", -324); // exit integral loop
226c5f01b2fSopenharmony_ci        check_double(2.2250738585072009e-308,  "2225073858507201", -323); // exit fractional loop
227c5f01b2fSopenharmony_ci        check_double(   1.82877982605164e-99,   "182877982605164", -113);
228c5f01b2fSopenharmony_ci        check_double( 1.1505466208671903e-09, "11505466208671903",  -25);
229c5f01b2fSopenharmony_ci        check_double( 5.5645893133766722e+20,  "5564589313376672",    5);
230c5f01b2fSopenharmony_ci        check_double(     53.034830388866226, "53034830388866226",  -15);
231c5f01b2fSopenharmony_ci        check_double(  0.0021066531670178605, "21066531670178605",  -19);
232c5f01b2fSopenharmony_ci
233c5f01b2fSopenharmony_ci        // V. Paxson and W. Kahan, "A Program for Testing IEEE Binary-Decimal Conversion", manuscript, May 1991,
234c5f01b2fSopenharmony_ci        // ftp://ftp.ee.lbl.gov/testbase-report.ps.Z    (report)
235c5f01b2fSopenharmony_ci        // ftp://ftp.ee.lbl.gov/testbase.tar.Z          (program)
236c5f01b2fSopenharmony_ci
237c5f01b2fSopenharmony_ci        // Table 3: Stress Inputs for Converting 53-bit Binary to Decimal, < 1/2 ULP
238c5f01b2fSopenharmony_ci        check_double(make_double(8511030020275656,  -342) /*                9.5e-088 */,                "95",  -89);
239c5f01b2fSopenharmony_ci        check_double(make_double(5201988407066741,  -824) /*               4.65e-233 */,               "465", -235);
240c5f01b2fSopenharmony_ci        check_double(make_double(6406892948269899,  +237) /*              1.415e+087 */,              "1415",   84);
241c5f01b2fSopenharmony_ci        check_double(make_double(8431154198732492,   +72) /*             3.9815e+037 */,             "39815",   33);
242c5f01b2fSopenharmony_ci        check_double(make_double(6475049196144587,   +99) /*            4.10405e+045 */,            "410405",   40);
243c5f01b2fSopenharmony_ci        check_double(make_double(8274307542972842,  +726) /*           2.920845e+234 */,           "2920845",  228);
244c5f01b2fSopenharmony_ci        check_double(make_double(5381065484265332,  -456) /*          2.8919465e-122 */,          "28919465", -129);
245c5f01b2fSopenharmony_ci        check_double(make_double(6761728585499734, -1057) /*         4.37877185e-303 */,         "437877185", -311);
246c5f01b2fSopenharmony_ci        check_double(make_double(7976538478610756,  +376) /*        1.227701635e+129 */,        "1227701635",  120);
247c5f01b2fSopenharmony_ci        check_double(make_double(5982403858958067,  +377) /*       1.8415524525e+129 */,       "18415524525",  119);
248c5f01b2fSopenharmony_ci        check_double(make_double(5536995190630837,   +93) /*      5.48357443505e+043 */,      "548357443505",   32);
249c5f01b2fSopenharmony_ci        check_double(make_double(7225450889282194,  +710) /*     3.891901811465e+229 */,     "3891901811465",  217);
250c5f01b2fSopenharmony_ci        check_double(make_double(7225450889282194,  +709) /*    1.9459509057325e+229 */,    "19459509057325",  216);
251c5f01b2fSopenharmony_ci        check_double(make_double(8703372741147379,  +117) /*   1.44609583816055e+051 */,   "144609583816055",   37);
252c5f01b2fSopenharmony_ci        check_double(make_double(8944262675275217, -1001) /*  4.173677474585315e-286 */,  "4173677474585315", -301);
253c5f01b2fSopenharmony_ci        check_double(make_double(7459803696087692,  -707) /* 1.1079507728788885e-197 */, "11079507728788885", -213);
254c5f01b2fSopenharmony_ci        check_double(make_double(6080469016670379,  -381) /*  1.234550136632744e-099 */,  "1234550136632744", -114);
255c5f01b2fSopenharmony_ci        check_double(make_double(8385515147034757,  +721) /* 9.2503171196036502e+232 */,   "925031711960365",  218);
256c5f01b2fSopenharmony_ci        check_double(make_double(7514216811389786,  -828) /* 4.1980471502848898e-234 */,   "419804715028489", -248);
257c5f01b2fSopenharmony_ci        check_double(make_double(8397297803260511,  -345) /* 1.1716315319786511e-088 */, "11716315319786511", -104);
258c5f01b2fSopenharmony_ci        check_double(make_double(6733459239310543,  +202) /* 4.3281007284461249e+076 */,  "4328100728446125",   61);
259c5f01b2fSopenharmony_ci        check_double(make_double(8091450587292794,  -473) /* 3.3177101181600311e-127 */,  "3317710118160031", -142);
260c5f01b2fSopenharmony_ci
261c5f01b2fSopenharmony_ci        // Table 4: Stress Inputs for Converting 53-bit Binary to Decimal, > 1/2 ULP
262c5f01b2fSopenharmony_ci        check_double(make_double(6567258882077402,  +952) /*                2.5e+302 */,                "25",  301);
263c5f01b2fSopenharmony_ci        check_double(make_double(6712731423444934,  +535) /*               7.55e+176 */,               "755",  174);
264c5f01b2fSopenharmony_ci        check_double(make_double(6712731423444934,  +534) /*              3.775e+176 */,              "3775",  173);
265c5f01b2fSopenharmony_ci        check_double(make_double(5298405411573037,  -957) /*             4.3495e-273 */,             "43495", -277);
266c5f01b2fSopenharmony_ci        check_double(make_double(5137311167659507,  -144) /*            2.30365e-028 */,            "230365",  -33);
267c5f01b2fSopenharmony_ci        check_double(make_double(6722280709661868,  +363) /*           1.263005e+125 */,           "1263005",  119);
268c5f01b2fSopenharmony_ci        check_double(make_double(5344436398034927,  -169) /*          7.1422105e-036 */,          "71422105",  -43);
269c5f01b2fSopenharmony_ci        check_double(make_double(8369123604277281,  -853) /*         1.39345735e-241 */,         "139345735", -249);
270c5f01b2fSopenharmony_ci        check_double(make_double(8995822108487663,  -780) /*        1.414634485e-219 */,        "1414634485", -228);
271c5f01b2fSopenharmony_ci        check_double(make_double(8942832835564782,  -383) /*       4.5392779195e-100 */,       "45392779195", -110);
272c5f01b2fSopenharmony_ci        check_double(make_double(8942832835564782,  -384) /*      2.26963895975e-100 */,      "226963895975", -111);
273c5f01b2fSopenharmony_ci        check_double(make_double(8942832835564782,  -385) /*     1.134819479875e-100 */,     "1134819479875", -112);
274c5f01b2fSopenharmony_ci        check_double(make_double(6965949469487146,  -249) /*    7.7003665618895e-060 */,    "77003665618895",  -73);
275c5f01b2fSopenharmony_ci        check_double(make_double(6965949469487146,  -250) /*   3.85018328094475e-060 */,   "385018328094475",  -74);
276c5f01b2fSopenharmony_ci        check_double(make_double(6965949469487146,  -251) /*  1.925091640472375e-060 */,  "1925091640472375",  -75);
277c5f01b2fSopenharmony_ci        check_double(make_double(7487252720986826,  +548) /* 6.8985865317742005e+180 */, "68985865317742005",  164);
278c5f01b2fSopenharmony_ci        check_double(make_double(5592117679628511,  +164) /* 1.3076622631878654e+065 */, "13076622631878654",   49);
279c5f01b2fSopenharmony_ci        check_double(make_double(8887055249355788,  +665) /* 1.3605202075612124e+216 */, "13605202075612124",  200);
280c5f01b2fSopenharmony_ci        check_double(make_double(6994187472632449,  +690) /* 3.5928102174759597e+223 */, "35928102174759597",  207);
281c5f01b2fSopenharmony_ci        check_double(make_double(8797576579012143,  +588) /* 8.9125197712484552e+192 */,  "8912519771248455",  177);
282c5f01b2fSopenharmony_ci        check_double(make_double(7363326733505337,  +272) /* 5.5876975736230114e+097 */, "55876975736230114",   81);
283c5f01b2fSopenharmony_ci        check_double(make_double(8549497411294502,  -448) /* 1.1762578307285404e-119 */, "11762578307285404", -135);
284c5f01b2fSopenharmony_ci
285c5f01b2fSopenharmony_ci        // Table 20: Stress Inputs for Converting 56-bit Binary to Decimal, < 1/2 ULP
286c5f01b2fSopenharmony_ci        check_double(make_double(50883641005312716, -172) /* 8.4999999999999993e-036 */,  "8499999999999999",  -51);
287c5f01b2fSopenharmony_ci        check_double(make_double(38162730753984537, -170) /* 2.5499999999999999e-035 */,               "255",  -37);
288c5f01b2fSopenharmony_ci        check_double(make_double(50832789069151999, -101) /* 2.0049999999999997e-014 */, "20049999999999997",  -30);
289c5f01b2fSopenharmony_ci        check_double(make_double(51822367833714164, -109) /* 7.9844999999999994e-017 */,  "7984499999999999",  -32);
290c5f01b2fSopenharmony_ci        check_double(make_double(66840152193508133, -172) /* 1.1165499999999999e-035 */, "11165499999999999",  -51);
291c5f01b2fSopenharmony_ci        check_double(make_double(55111239245584393, -138) /*           1.581615e-025 */,           "1581615",  -31);
292c5f01b2fSopenharmony_ci        check_double(make_double(71704866733321482, -112) /*          1.3809855e-017 */,          "13809855",  -24);
293c5f01b2fSopenharmony_ci        check_double(make_double(67160949328233173, -142) /* 1.2046404499999999e-026 */, "12046404499999999",  -42);
294c5f01b2fSopenharmony_ci        check_double(make_double(53237141308040189, -152) /* 9.3251405449999991e-030 */,  "9325140544999999",  -45);
295c5f01b2fSopenharmony_ci        check_double(make_double(62785329394975786, -112) /*       1.2092014595e-017 */,       "12092014595",  -27);
296c5f01b2fSopenharmony_ci        check_double(make_double(48367680154689523,  -77) /* 3.2007045838499998e-007 */,      "320070458385",  -18);
297c5f01b2fSopenharmony_ci        check_double(make_double(42552223180606797, -102) /*  8.391946324354999e-015 */,  "8391946324354999",  -30);
298c5f01b2fSopenharmony_ci        check_double(make_double(63626356173011241, -112) /*    1.2253990460585e-017 */,    "12253990460585",  -30);
299c5f01b2fSopenharmony_ci        check_double(make_double(43566388595783643,  -99) /* 6.8735641489760495e-014 */,   "687356414897605",  -28);
300c5f01b2fSopenharmony_ci        check_double(make_double(54512669636675272, -159) /*  7.459816430480385e-032 */,  "7459816430480385",  -47);
301c5f01b2fSopenharmony_ci        check_double(make_double(52306490527514614, -167) /* 2.7960588398142552e-034 */,  "2796058839814255",  -49);
302c5f01b2fSopenharmony_ci        check_double(make_double(52306490527514614, -168) /* 1.3980294199071276e-034 */, "13980294199071276",  -50);
303c5f01b2fSopenharmony_ci        check_double(make_double(41024721590449423,  -89) /* 6.6279012373057359e-011 */,  "6627901237305736",  -26);
304c5f01b2fSopenharmony_ci        check_double(make_double(37664020415894738, -132) /* 6.9177880043968072e-024 */,  "6917788004396807",  -39);
305c5f01b2fSopenharmony_ci        check_double(make_double(37549883692866294,  -93) /* 3.7915693108349708e-012 */,  "3791569310834971",  -27);
306c5f01b2fSopenharmony_ci        check_double(make_double(69124110374399839, -104) /* 3.4080817676591365e-015 */, "34080817676591365",  -31);
307c5f01b2fSopenharmony_ci        check_double(make_double(69124110374399839, -105) /* 1.7040408838295683e-015 */, "17040408838295683",  -31);
308c5f01b2fSopenharmony_ci
309c5f01b2fSopenharmony_ci        // Table 21: Stress Inputs for Converting 56-bit Binary to Decimal, > 1/2 ULP
310c5f01b2fSopenharmony_ci        check_double(make_double(49517601571415211,  -94) /* 2.4999999999999998e-012 */,                "25",  -13);
311c5f01b2fSopenharmony_ci        check_double(make_double(49517601571415211,  -95) /* 1.2499999999999999e-012 */,               "125",  -14);
312c5f01b2fSopenharmony_ci        check_double(make_double(54390733528642804, -133) /* 4.9949999999999996e-024 */, "49949999999999996",  -40); // shortest: 4995e-27
313c5f01b2fSopenharmony_ci        check_double(make_double(71805402319113924, -157) /* 3.9304999999999998e-031 */, "39304999999999998",  -47); // shortest: 39305e-35
314c5f01b2fSopenharmony_ci        check_double(make_double(40435277969631694, -179) /* 5.2770499999999992e-038 */,  "5277049999999999",  -53);
315c5f01b2fSopenharmony_ci        check_double(make_double(57241991568619049, -165) /*           1.223955e-033 */,           "1223955",  -39);
316c5f01b2fSopenharmony_ci        check_double(make_double(65224162876242886,  +58) /* 1.8799584999999998e+034 */, "18799584999999998",   18);
317c5f01b2fSopenharmony_ci        check_double(make_double(70173376848895368, -138) /*         2.01387715e-025 */,         "201387715",  -33);
318c5f01b2fSopenharmony_ci        check_double(make_double(37072848117383207,  -99) /* 5.8490641049999989e-014 */,  "5849064104999999",  -29);
319c5f01b2fSopenharmony_ci        check_double(make_double(56845051585389697, -176) /* 5.9349003054999999e-037 */,       "59349003055",  -47);
320c5f01b2fSopenharmony_ci        check_double(make_double(54791673366936431, -145) /* 1.2284718039499998e-027 */, "12284718039499998",  -43);
321c5f01b2fSopenharmony_ci        check_double(make_double(66800318669106231, -169) /* 8.9270767180849991e-035 */,  "8927076718084999",  -50);
322c5f01b2fSopenharmony_ci        check_double(make_double(66800318669106231, -170) /* 4.4635383590424995e-035 */, "44635383590424995",  -51);
323c5f01b2fSopenharmony_ci        check_double(make_double(66574323440112438, -119) /* 1.0016990862549499e-019 */, "10016990862549499",  -35);
324c5f01b2fSopenharmony_ci        check_double(make_double(65645179969330963, -173) /* 5.4829412628024647e-036 */,  "5482941262802465",  -51);
325c5f01b2fSopenharmony_ci        check_double(make_double(61847254334681076, -109) /* 9.5290783281036439e-017 */,  "9529078328103644",  -32);
326c5f01b2fSopenharmony_ci        check_double(make_double(39990712921393606, -145) /* 8.9662279366405553e-028 */,  "8966227936640555",  -43);
327c5f01b2fSopenharmony_ci        check_double(make_double(59292318184400283, -149) /* 8.3086234418058538e-029 */,  "8308623441805854",  -44);
328c5f01b2fSopenharmony_ci        check_double(make_double(69116558615326153, -143) /* 6.1985873566126555e-027 */, "61985873566126555",  -43);
329c5f01b2fSopenharmony_ci        check_double(make_double(69116558615326153, -144) /* 3.0992936783063277e-027 */, "30992936783063277",  -43);
330c5f01b2fSopenharmony_ci        check_double(make_double(39462549494468513, -152) /* 6.9123512506176015e-030 */,  "6912351250617602",  -45);
331c5f01b2fSopenharmony_ci        check_double(make_double(39462549494468513, -153) /* 3.4561756253088008e-030 */,  "3456175625308801",  -45);
332c5f01b2fSopenharmony_ci    }
333c5f01b2fSopenharmony_ci}
334c5f01b2fSopenharmony_ci
335c5f01b2fSopenharmony_ciTEST_CASE("formatting")
336c5f01b2fSopenharmony_ci{
337c5f01b2fSopenharmony_ci    SECTION("single precision")
338c5f01b2fSopenharmony_ci    {
339c5f01b2fSopenharmony_ci        auto check_float = [](float number, const std::string & expected)
340c5f01b2fSopenharmony_ci        {
341c5f01b2fSopenharmony_ci            std::array<char, 33> buf{};
342c5f01b2fSopenharmony_ci            char* end = nlohmann::detail::to_chars(buf.data(), buf.data() + 32, number); // NOLINT(cppcoreguidelines-pro-type-vararg,hicpp-vararg)
343c5f01b2fSopenharmony_ci            std::string actual(buf.data(), end);
344c5f01b2fSopenharmony_ci
345c5f01b2fSopenharmony_ci            CHECK(actual == expected);
346c5f01b2fSopenharmony_ci        };
347c5f01b2fSopenharmony_ci        // %.9g
348c5f01b2fSopenharmony_ci        check_float( -1.2345e-22f, "-1.2345e-22"  ); // -1.23450004e-22
349c5f01b2fSopenharmony_ci        check_float( -1.2345e-21f, "-1.2345e-21"  ); // -1.23450002e-21
350c5f01b2fSopenharmony_ci        check_float( -1.2345e-20f, "-1.2345e-20"  ); // -1.23450002e-20
351c5f01b2fSopenharmony_ci        check_float( -1.2345e-19f, "-1.2345e-19"  ); // -1.23449999e-19
352c5f01b2fSopenharmony_ci        check_float( -1.2345e-18f, "-1.2345e-18"  ); // -1.23449996e-18
353c5f01b2fSopenharmony_ci        check_float( -1.2345e-17f, "-1.2345e-17"  ); // -1.23449998e-17
354c5f01b2fSopenharmony_ci        check_float( -1.2345e-16f, "-1.2345e-16"  ); // -1.23449996e-16
355c5f01b2fSopenharmony_ci        check_float( -1.2345e-15f, "-1.2345e-15"  ); // -1.23450002e-15
356c5f01b2fSopenharmony_ci        check_float( -1.2345e-14f, "-1.2345e-14"  ); // -1.23450004e-14
357c5f01b2fSopenharmony_ci        check_float( -1.2345e-13f, "-1.2345e-13"  ); // -1.23449997e-13
358c5f01b2fSopenharmony_ci        check_float( -1.2345e-12f, "-1.2345e-12"  ); // -1.23450002e-12
359c5f01b2fSopenharmony_ci        check_float( -1.2345e-11f, "-1.2345e-11"  ); // -1.2345e-11
360c5f01b2fSopenharmony_ci        check_float( -1.2345e-10f, "-1.2345e-10"  ); // -1.2345e-10
361c5f01b2fSopenharmony_ci        check_float( -1.2345e-9f,  "-1.2345e-09"  ); // -1.23449995e-09
362c5f01b2fSopenharmony_ci        check_float( -1.2345e-8f,  "-1.2345e-08"  ); // -1.23449997e-08
363c5f01b2fSopenharmony_ci        check_float( -1.2345e-7f,  "-1.2345e-07"  ); // -1.23449993e-07
364c5f01b2fSopenharmony_ci        check_float( -1.2345e-6f,  "-1.2345e-06"  ); // -1.23450002e-06
365c5f01b2fSopenharmony_ci        check_float( -1.2345e-5f,  "-1.2345e-05"  ); // -1.2345e-05
366c5f01b2fSopenharmony_ci        check_float( -1.2345e-4f,  "-0.00012345"  ); // -0.000123449994
367c5f01b2fSopenharmony_ci        check_float( -1.2345e-3f,  "-0.0012345"   ); // -0.00123449997
368c5f01b2fSopenharmony_ci        check_float( -1.2345e-2f,  "-0.012345"    ); // -0.0123450002
369c5f01b2fSopenharmony_ci        check_float( -1.2345e-1f,  "-0.12345"     ); // -0.123450004
370c5f01b2fSopenharmony_ci        check_float( -0.0f,        "-0.0"         ); // -0
371c5f01b2fSopenharmony_ci        check_float(  0.0f,         "0.0"         ); //  0
372c5f01b2fSopenharmony_ci        check_float(  1.2345e+0f,   "1.2345"      ); //  1.23450005
373c5f01b2fSopenharmony_ci        check_float(  1.2345e+1f,   "12.345"      ); //  12.3450003
374c5f01b2fSopenharmony_ci        check_float(  1.2345e+2f,   "123.45"      ); //  123.449997
375c5f01b2fSopenharmony_ci        check_float(  1.2345e+3f,   "1234.5"      ); //  1234.5
376c5f01b2fSopenharmony_ci        check_float(  1.2345e+4f,   "12345.0"     ); //  12345
377c5f01b2fSopenharmony_ci        check_float(  1.2345e+5f,   "123450.0"    ); //  123450
378c5f01b2fSopenharmony_ci        check_float(  1.2345e+6f,   "1.2345e+06"  ); //  1234500
379c5f01b2fSopenharmony_ci        check_float(  1.2345e+7f,   "1.2345e+07"  ); //  12345000
380c5f01b2fSopenharmony_ci        check_float(  1.2345e+8f,   "1.2345e+08"  ); //  123450000
381c5f01b2fSopenharmony_ci        check_float(  1.2345e+9f,   "1.2345e+09"  ); //  1.23449997e+09
382c5f01b2fSopenharmony_ci        check_float(  1.2345e+10f,  "1.2345e+10"  ); //  1.23449999e+10
383c5f01b2fSopenharmony_ci        check_float(  1.2345e+11f,  "1.2345e+11"  ); //  1.23449999e+11
384c5f01b2fSopenharmony_ci        check_float(  1.2345e+12f,  "1.2345e+12"  ); //  1.23450006e+12
385c5f01b2fSopenharmony_ci        check_float(  1.2345e+13f,  "1.2345e+13"  ); //  1.23449995e+13
386c5f01b2fSopenharmony_ci        check_float(  1.2345e+14f,  "1.2345e+14"  ); //  1.23450002e+14
387c5f01b2fSopenharmony_ci        check_float(  1.2345e+15f,  "1.2345e+15"  ); //  1.23450003e+15
388c5f01b2fSopenharmony_ci        check_float(  1.2345e+16f,  "1.2345e+16"  ); //  1.23449998e+16
389c5f01b2fSopenharmony_ci        check_float(  1.2345e+17f,  "1.2345e+17"  ); //  1.23449996e+17
390c5f01b2fSopenharmony_ci        check_float(  1.2345e+18f,  "1.2345e+18"  ); //  1.23450004e+18
391c5f01b2fSopenharmony_ci        check_float(  1.2345e+19f,  "1.2345e+19"  ); //  1.23449999e+19
392c5f01b2fSopenharmony_ci        check_float(  1.2345e+20f,  "1.2345e+20"  ); //  1.23449999e+20
393c5f01b2fSopenharmony_ci        check_float(  1.2345e+21f,  "1.2345e+21"  ); //  1.23449999e+21
394c5f01b2fSopenharmony_ci        check_float(  1.2345e+22f,  "1.2345e+22"  ); //  1.23450005e+22
395c5f01b2fSopenharmony_ci    }
396c5f01b2fSopenharmony_ci
397c5f01b2fSopenharmony_ci    SECTION("double precision")
398c5f01b2fSopenharmony_ci    {
399c5f01b2fSopenharmony_ci        auto check_double = [](double number, const std::string & expected)
400c5f01b2fSopenharmony_ci        {
401c5f01b2fSopenharmony_ci            std::array<char, 33> buf{};
402c5f01b2fSopenharmony_ci            char* end = nlohmann::detail::to_chars(buf.data(), buf.data() + 32, number); // NOLINT(cppcoreguidelines-pro-type-vararg,hicpp-vararg)
403c5f01b2fSopenharmony_ci            std::string actual(buf.data(), end);
404c5f01b2fSopenharmony_ci
405c5f01b2fSopenharmony_ci            CHECK(actual == expected);
406c5f01b2fSopenharmony_ci        };
407c5f01b2fSopenharmony_ci        //                           dtoa                           %.15g                     %.17g                     shortest
408c5f01b2fSopenharmony_ci        check_double( -1.2345e-22,  "-1.2345e-22"             ); // -1.2345e-22               -1.2345000000000001e-22   -1.2345e-22
409c5f01b2fSopenharmony_ci        check_double( -1.2345e-21,  "-1.2345e-21"             ); // -1.2345e-21               -1.2345000000000001e-21   -1.2345e-21
410c5f01b2fSopenharmony_ci        check_double( -1.2345e-20,  "-1.2345e-20"             ); // -1.2345e-20               -1.2345e-20               -1.2345e-20
411c5f01b2fSopenharmony_ci        check_double( -1.2345e-19,  "-1.2345e-19"             ); // -1.2345e-19               -1.2345000000000001e-19   -1.2345e-19
412c5f01b2fSopenharmony_ci        check_double( -1.2345e-18,  "-1.2345e-18"             ); // -1.2345e-18               -1.2345000000000001e-18   -1.2345e-18
413c5f01b2fSopenharmony_ci        check_double( -1.2345e-17,  "-1.2345e-17"             ); // -1.2345e-17               -1.2345e-17               -1.2345e-17
414c5f01b2fSopenharmony_ci        check_double( -1.2345e-16,  "-1.2345e-16"             ); // -1.2345e-16               -1.2344999999999999e-16   -1.2345e-16
415c5f01b2fSopenharmony_ci        check_double( -1.2345e-15,  "-1.2345e-15"             ); // -1.2345e-15               -1.2345e-15               -1.2345e-15
416c5f01b2fSopenharmony_ci        check_double( -1.2345e-14,  "-1.2345e-14"             ); // -1.2345e-14               -1.2345e-14               -1.2345e-14
417c5f01b2fSopenharmony_ci        check_double( -1.2345e-13,  "-1.2345e-13"             ); // -1.2345e-13               -1.2344999999999999e-13   -1.2345e-13
418c5f01b2fSopenharmony_ci        check_double( -1.2345e-12,  "-1.2345e-12"             ); // -1.2345e-12               -1.2345e-12               -1.2345e-12
419c5f01b2fSopenharmony_ci        check_double( -1.2345e-11,  "-1.2345e-11"             ); // -1.2345e-11               -1.2345e-11               -1.2345e-11
420c5f01b2fSopenharmony_ci        check_double( -1.2345e-10,  "-1.2345e-10"             ); // -1.2345e-10               -1.2345e-10               -1.2345e-10
421c5f01b2fSopenharmony_ci        check_double( -1.2345e-9,   "-1.2345e-09"             ); // -1.2345e-09               -1.2345e-09               -1.2345e-9
422c5f01b2fSopenharmony_ci        check_double( -1.2345e-8,   "-1.2345e-08"             ); // -1.2345e-08               -1.2345000000000001e-08   -1.2345e-8
423c5f01b2fSopenharmony_ci        check_double( -1.2345e-7,   "-1.2345e-07"             ); // -1.2345e-07               -1.2345000000000001e-07   -1.2345e-7
424c5f01b2fSopenharmony_ci        check_double( -1.2345e-6,   "-1.2345e-06"             ); // -1.2345e-06               -1.2345e-06               -1.2345e-6
425c5f01b2fSopenharmony_ci        check_double( -1.2345e-5,   "-1.2345e-05"             ); // -1.2345e-05               -1.2345e-05               -1.2345e-5
426c5f01b2fSopenharmony_ci        check_double( -1.2345e-4,   "-0.00012345"             ); // -0.00012345               -0.00012344999999999999   -0.00012345
427c5f01b2fSopenharmony_ci        check_double( -1.2345e-3,   "-0.0012345"              ); // -0.0012345                -0.0012344999999999999    -0.0012345
428c5f01b2fSopenharmony_ci        check_double( -1.2345e-2,   "-0.012345"               ); // -0.012345                 -0.012345                 -0.012345
429c5f01b2fSopenharmony_ci        check_double( -1.2345e-1,   "-0.12345"                ); // -0.12345                  -0.12345                  -0.12345
430c5f01b2fSopenharmony_ci        check_double( -0.0,         "-0.0"                    ); // -0                        -0                        -0
431c5f01b2fSopenharmony_ci        check_double(  0.0,          "0.0"                    ); //  0                         0                         0
432c5f01b2fSopenharmony_ci        check_double(  1.2345e+0,    "1.2345"                 ); //  1.2345                    1.2344999999999999        1.2345
433c5f01b2fSopenharmony_ci        check_double(  1.2345e+1,    "12.345"                 ); //  12.345                    12.345000000000001        12.345
434c5f01b2fSopenharmony_ci        check_double(  1.2345e+2,    "123.45"                 ); //  123.45                    123.45                    123.45
435c5f01b2fSopenharmony_ci        check_double(  1.2345e+3,    "1234.5"                 ); //  1234.5                    1234.5                    1234.5
436c5f01b2fSopenharmony_ci        check_double(  1.2345e+4,    "12345.0"                ); //  12345                     12345                     12345
437c5f01b2fSopenharmony_ci        check_double(  1.2345e+5,    "123450.0"               ); //  123450                    123450                    123450
438c5f01b2fSopenharmony_ci        check_double(  1.2345e+6,    "1234500.0"              ); //  1234500                   1234500                   1234500
439c5f01b2fSopenharmony_ci        check_double(  1.2345e+7,    "12345000.0"             ); //  12345000                  12345000                  12345000
440c5f01b2fSopenharmony_ci        check_double(  1.2345e+8,    "123450000.0"            ); //  123450000                 123450000                 123450000
441c5f01b2fSopenharmony_ci        check_double(  1.2345e+9,    "1234500000.0"           ); //  1234500000                1234500000                1234500000
442c5f01b2fSopenharmony_ci        check_double(  1.2345e+10,   "12345000000.0"          ); //  12345000000               12345000000               12345000000
443c5f01b2fSopenharmony_ci        check_double(  1.2345e+11,   "123450000000.0"         ); //  123450000000              123450000000              123450000000
444c5f01b2fSopenharmony_ci        check_double(  1.2345e+12,   "1234500000000.0"        ); //  1234500000000             1234500000000             1234500000000
445c5f01b2fSopenharmony_ci        check_double(  1.2345e+13,   "12345000000000.0"       ); //  12345000000000            12345000000000            12345000000000
446c5f01b2fSopenharmony_ci        check_double(  1.2345e+14,   "123450000000000.0"      ); //  123450000000000           123450000000000           123450000000000
447c5f01b2fSopenharmony_ci        check_double(  1.2345e+15,   "1.2345e+15"             ); //  1.2345e+15                1234500000000000          1.2345e15
448c5f01b2fSopenharmony_ci        check_double(  1.2345e+16,   "1.2345e+16"             ); //  1.2345e+16                12345000000000000         1.2345e16
449c5f01b2fSopenharmony_ci        check_double(  1.2345e+17,   "1.2345e+17"             ); //  1.2345e+17                1.2345e+17                1.2345e17
450c5f01b2fSopenharmony_ci        check_double(  1.2345e+18,   "1.2345e+18"             ); //  1.2345e+18                1.2345e+18                1.2345e18
451c5f01b2fSopenharmony_ci        check_double(  1.2345e+19,   "1.2345e+19"             ); //  1.2345e+19                1.2345e+19                1.2345e19
452c5f01b2fSopenharmony_ci        check_double(  1.2345e+20,   "1.2345e+20"             ); //  1.2345e+20                1.2345e+20                1.2345e20
453c5f01b2fSopenharmony_ci        check_double(  1.2345e+21,   "1.2344999999999999e+21" ); //  1.2345e+21                1.2344999999999999e+21    1.2345e21
454c5f01b2fSopenharmony_ci        check_double(  1.2345e+22,   "1.2345e+22"             ); //  1.2345e+22                1.2345e+22                1.2345e22
455c5f01b2fSopenharmony_ci    }
456c5f01b2fSopenharmony_ci
457c5f01b2fSopenharmony_ci    SECTION("integer")
458c5f01b2fSopenharmony_ci    {
459c5f01b2fSopenharmony_ci        auto check_integer = [](std::int64_t number, const std::string & expected)
460c5f01b2fSopenharmony_ci        {
461c5f01b2fSopenharmony_ci            nlohmann::json j = number;
462c5f01b2fSopenharmony_ci            CHECK(j.dump() == expected);
463c5f01b2fSopenharmony_ci        };
464c5f01b2fSopenharmony_ci
465c5f01b2fSopenharmony_ci        // edge cases
466c5f01b2fSopenharmony_ci        check_integer(INT64_MIN, "-9223372036854775808");
467c5f01b2fSopenharmony_ci        check_integer(INT64_MAX, "9223372036854775807");
468c5f01b2fSopenharmony_ci
469c5f01b2fSopenharmony_ci        // few random big integers
470c5f01b2fSopenharmony_ci        check_integer(-3456789012345678901LL, "-3456789012345678901");
471c5f01b2fSopenharmony_ci        check_integer(3456789012345678901LL, "3456789012345678901");
472c5f01b2fSopenharmony_ci        check_integer(-5678901234567890123LL, "-5678901234567890123");
473c5f01b2fSopenharmony_ci        check_integer(5678901234567890123LL, "5678901234567890123");
474c5f01b2fSopenharmony_ci
475c5f01b2fSopenharmony_ci        // integers with various digit counts
476c5f01b2fSopenharmony_ci        check_integer(-1000000000000000000LL, "-1000000000000000000");
477c5f01b2fSopenharmony_ci        check_integer(-100000000000000000LL, "-100000000000000000");
478c5f01b2fSopenharmony_ci        check_integer(-10000000000000000LL, "-10000000000000000");
479c5f01b2fSopenharmony_ci        check_integer(-1000000000000000LL, "-1000000000000000");
480c5f01b2fSopenharmony_ci        check_integer(-100000000000000LL, "-100000000000000");
481c5f01b2fSopenharmony_ci        check_integer(-10000000000000LL, "-10000000000000");
482c5f01b2fSopenharmony_ci        check_integer(-1000000000000LL, "-1000000000000");
483c5f01b2fSopenharmony_ci        check_integer(-100000000000LL, "-100000000000");
484c5f01b2fSopenharmony_ci        check_integer(-10000000000LL, "-10000000000");
485c5f01b2fSopenharmony_ci        check_integer(-1000000000LL, "-1000000000");
486c5f01b2fSopenharmony_ci        check_integer(-100000000LL, "-100000000");
487c5f01b2fSopenharmony_ci        check_integer(-10000000LL, "-10000000");
488c5f01b2fSopenharmony_ci        check_integer(-1000000LL, "-1000000");
489c5f01b2fSopenharmony_ci        check_integer(-100000LL, "-100000");
490c5f01b2fSopenharmony_ci        check_integer(-10000LL, "-10000");
491c5f01b2fSopenharmony_ci        check_integer(-1000LL, "-1000");
492c5f01b2fSopenharmony_ci        check_integer(-100LL, "-100");
493c5f01b2fSopenharmony_ci        check_integer(-10LL, "-10");
494c5f01b2fSopenharmony_ci        check_integer(-1LL, "-1");
495c5f01b2fSopenharmony_ci        check_integer(0, "0");
496c5f01b2fSopenharmony_ci        check_integer(1LL, "1");
497c5f01b2fSopenharmony_ci        check_integer(10LL, "10");
498c5f01b2fSopenharmony_ci        check_integer(100LL, "100");
499c5f01b2fSopenharmony_ci        check_integer(1000LL, "1000");
500c5f01b2fSopenharmony_ci        check_integer(10000LL, "10000");
501c5f01b2fSopenharmony_ci        check_integer(100000LL, "100000");
502c5f01b2fSopenharmony_ci        check_integer(1000000LL, "1000000");
503c5f01b2fSopenharmony_ci        check_integer(10000000LL, "10000000");
504c5f01b2fSopenharmony_ci        check_integer(100000000LL, "100000000");
505c5f01b2fSopenharmony_ci        check_integer(1000000000LL, "1000000000");
506c5f01b2fSopenharmony_ci        check_integer(10000000000LL, "10000000000");
507c5f01b2fSopenharmony_ci        check_integer(100000000000LL, "100000000000");
508c5f01b2fSopenharmony_ci        check_integer(1000000000000LL, "1000000000000");
509c5f01b2fSopenharmony_ci        check_integer(10000000000000LL, "10000000000000");
510c5f01b2fSopenharmony_ci        check_integer(100000000000000LL, "100000000000000");
511c5f01b2fSopenharmony_ci        check_integer(1000000000000000LL, "1000000000000000");
512c5f01b2fSopenharmony_ci        check_integer(10000000000000000LL, "10000000000000000");
513c5f01b2fSopenharmony_ci        check_integer(100000000000000000LL, "100000000000000000");
514c5f01b2fSopenharmony_ci        check_integer(1000000000000000000LL, "1000000000000000000");
515c5f01b2fSopenharmony_ci    }
516c5f01b2fSopenharmony_ci}
517