1// Copyright (c) Microsoft Corporation.
2// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
3
4#ifndef FLOAT_FROM_CHARS_TEST_CASES_HPP
5#define FLOAT_FROM_CHARS_TEST_CASES_HPP
6
7#include <charconv>
8#include <stddef.h>
9#include <system_error>
10using namespace std;
11
12inline constexpr FloatFromCharsTestCase float_from_chars_test_cases[] = {
13 {.input: "1.a0000400", .fmt: chars_format::hex, .correct_idx: 10, .correct_ec: errc{}, .correct_value: 0x1.a00004p0f}, // exact
14 {.input: "1.a0000401", .fmt: chars_format::hex, .correct_idx: 10, .correct_ec: errc{}, .correct_value: 0x1.a00004p0f}, // below midpoint, round down
15 {.input: "1.a0000500", .fmt: chars_format::hex, .correct_idx: 10, .correct_ec: errc{}, .correct_value: 0x1.a00004p0f}, // midpoint, round down to even
16 {.input: "1.a0000501", .fmt: chars_format::hex, .correct_idx: 10, .correct_ec: errc{}, .correct_value: 0x1.a00006p0f}, // above midpoint, round up
17 {.input: "1.a0000600", .fmt: chars_format::hex, .correct_idx: 10, .correct_ec: errc{}, .correct_value: 0x1.a00006p0f}, // exact
18 {.input: "1.a0000601", .fmt: chars_format::hex, .correct_idx: 10, .correct_ec: errc{}, .correct_value: 0x1.a00006p0f}, // below midpoint, round down
19 {.input: "1.a0000700", .fmt: chars_format::hex, .correct_idx: 10, .correct_ec: errc{}, .correct_value: 0x1.a00008p0f}, // midpoint, round up to even
20 {.input: "1.a0000701", .fmt: chars_format::hex, .correct_idx: 10, .correct_ec: errc{}, .correct_value: 0x1.a00008p0f}, // above midpoint, round up
21
22 {.input: "1.0000040", .fmt: chars_format::hex, .correct_idx: 9, .correct_ec: errc{}, .correct_value: 0x1.000004p0f}, // exact
23 {.input: "1.0000041", .fmt: chars_format::hex, .correct_idx: 9, .correct_ec: errc{}, .correct_value: 0x1.000004p0f}, // below midpoint, round down
24 {.input: "1.0000050", .fmt: chars_format::hex, .correct_idx: 9, .correct_ec: errc{}, .correct_value: 0x1.000004p0f}, // midpoint, round down to even
25 {.input: "1.0000051", .fmt: chars_format::hex, .correct_idx: 9, .correct_ec: errc{}, .correct_value: 0x1.000006p0f}, // above midpoint, round up
26 {.input: "1.0000060", .fmt: chars_format::hex, .correct_idx: 9, .correct_ec: errc{}, .correct_value: 0x1.000006p0f}, // exact
27 {.input: "1.0000061", .fmt: chars_format::hex, .correct_idx: 9, .correct_ec: errc{}, .correct_value: 0x1.000006p0f}, // below midpoint, round down
28 {.input: "1.0000070", .fmt: chars_format::hex, .correct_idx: 9, .correct_ec: errc{}, .correct_value: 0x1.000008p0f}, // midpoint, round up to even
29 {.input: "1.0000071", .fmt: chars_format::hex, .correct_idx: 9, .correct_ec: errc{}, .correct_value: 0x1.000008p0f}, // above midpoint, round up
30
31 {.input: "1.0000002384185791015625000000", .fmt: chars_format::general, .correct_idx: 30, .correct_ec: errc{}, .correct_value: 0x1.000004p0f}, // exact
32 {.input: "1.0000002421438694000244140625", .fmt: chars_format::general, .correct_idx: 30, .correct_ec: errc{}, .correct_value: 0x1.000004p0f}, // below midpoint, round down
33 {.input: "1.0000002980232238769531249999", .fmt: chars_format::general, .correct_idx: 30, .correct_ec: errc{}, .correct_value: 0x1.000004p0f}, // below midpoint, round down
34 {.input: "1.0000002980232238769531250000", .fmt: chars_format::general, .correct_idx: 30, .correct_ec: errc{},
35 .correct_value: 0x1.000004p0f}, // midpoint, round down to even
36 {.input: "1.0000002980232238769531250001", .fmt: chars_format::general, .correct_idx: 30, .correct_ec: errc{}, .correct_value: 0x1.000006p0f}, // above midpoint, round up
37 {.input: "1.0000003017485141754150390625", .fmt: chars_format::general, .correct_idx: 30, .correct_ec: errc{}, .correct_value: 0x1.000006p0f}, // above midpoint, round up
38 {.input: "1.0000003576278686523437500000", .fmt: chars_format::general, .correct_idx: 30, .correct_ec: errc{}, .correct_value: 0x1.000006p0f}, // exact
39 {.input: "1.0000003613531589508056640625", .fmt: chars_format::general, .correct_idx: 30, .correct_ec: errc{}, .correct_value: 0x1.000006p0f}, // below midpoint, round down
40 {.input: "1.0000004172325134277343749999", .fmt: chars_format::general, .correct_idx: 30, .correct_ec: errc{}, .correct_value: 0x1.000006p0f}, // below midpoint, round down
41 {.input: "1.0000004172325134277343750000", .fmt: chars_format::general, .correct_idx: 30, .correct_ec: errc{}, .correct_value: 0x1.000008p0f}, // midpoint, round up to even
42 {.input: "1.0000004172325134277343750001", .fmt: chars_format::general, .correct_idx: 30, .correct_ec: errc{}, .correct_value: 0x1.000008p0f}, // above midpoint, round up
43 {.input: "1.0000004209578037261962890625", .fmt: chars_format::general, .correct_idx: 30, .correct_ec: errc{}, .correct_value: 0x1.000008p0f}, // above midpoint, round up
44
45 // VSO-838635 "<charconv>: from_chars() mishandles certain subnormals"
46 // This bug didn't actually affect float, but we should have similar test cases.
47 // These values change on half-ulp boundaries:
48 // 1 * 2^-150 ~= 7.01e-46 (half-ulp between zero and min subnormal)
49 // 2 * 2^-150 ~= 1.40e-45 (min subnormal)
50 // 3 * 2^-150 ~= 2.10e-45 (half-ulp between min subnormal and next subnormal)
51 // 4 * 2^-150 ~= 2.80e-45 (next subnormal)
52 {.input: "6."
53 "6666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666"
54 "6666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666"
55 "6666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666"
56 "6666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666"
57 "6666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666"
58 "6666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666"
59 "6666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666"
60 "6666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666"
61 "6666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666"
62 "6666666666666666666e-46",
63 .fmt: chars_format::scientific, .correct_idx: 1006, .correct_ec: errc::result_out_of_range, .correct_value: 0x0.000000p+0f},
64 {.input: "7."
65 "7777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777"
66 "7777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777"
67 "7777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777"
68 "7777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777"
69 "7777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777"
70 "7777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777"
71 "7777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777"
72 "7777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777"
73 "7777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777"
74 "7777777777777777777e-46",
75 .fmt: chars_format::scientific, .correct_idx: 1006, .correct_ec: errc{}, .correct_value: 0x0.000002p-126f},
76 {.input: "8."
77 "8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888"
78 "8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888"
79 "8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888"
80 "8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888"
81 "8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888"
82 "8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888"
83 "8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888"
84 "8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888"
85 "8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888"
86 "8888888888888888888e-46",
87 .fmt: chars_format::scientific, .correct_idx: 1006, .correct_ec: errc{}, .correct_value: 0x0.000002p-126f},
88 {.input: "9."
89 "9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999"
90 "9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999"
91 "9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999"
92 "9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999"
93 "9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999"
94 "9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999"
95 "9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999"
96 "9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999"
97 "9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999"
98 "9999999999999999999e-46",
99 .fmt: chars_format::scientific, .correct_idx: 1006, .correct_ec: errc{}, .correct_value: 0x0.000002p-126f},
100 {.input: "1."
101 "1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111"
102 "1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111"
103 "1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111"
104 "1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111"
105 "1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111"
106 "1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111"
107 "1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111"
108 "1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111"
109 "1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111"
110 "1111111111111111111e-45",
111 .fmt: chars_format::scientific, .correct_idx: 1006, .correct_ec: errc{}, .correct_value: 0x0.000002p-126f},
112 {.input: "2."
113 "2222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222"
114 "2222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222"
115 "2222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222"
116 "2222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222"
117 "2222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222"
118 "2222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222"
119 "2222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222"
120 "2222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222"
121 "2222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222"
122 "2222222222222222222e-45",
123 .fmt: chars_format::scientific, .correct_idx: 1006, .correct_ec: errc{}, .correct_value: 0x0.000004p-126f},
124
125 // VSO-733765 "<charconv>: [Feedback] double std::from_chars behavior on exponent out of range"
126 // LWG-3081 "Floating point from_chars API does not distinguish between overflow and underflow"
127 // These test cases exercise every overflow/underflow codepath.
128 {.input: "1e+1000", .fmt: chars_format::scientific, .correct_idx: 7, .correct_ec: errc::result_out_of_range, .correct_value: float_inf},
129 {.input: "1e-1000", .fmt: chars_format::scientific, .correct_idx: 7, .correct_ec: errc::result_out_of_range, .correct_value: 0.0f},
130 {.input: "1.ffffffp+127", .fmt: chars_format::hex, .correct_idx: 13, .correct_ec: errc::result_out_of_range, .correct_value: float_inf},
131 {.input: "1e+2000", .fmt: chars_format::scientific, .correct_idx: 7, .correct_ec: errc::result_out_of_range, .correct_value: float_inf},
132 {.input: "1e-2000", .fmt: chars_format::scientific, .correct_idx: 7, .correct_ec: errc::result_out_of_range, .correct_value: 0.0f},
133 {.input: "1e+9999", .fmt: chars_format::scientific, .correct_idx: 7, .correct_ec: errc::result_out_of_range, .correct_value: float_inf},
134 {.input: "1e-9999", .fmt: chars_format::scientific, .correct_idx: 7, .correct_ec: errc::result_out_of_range, .correct_value: 0.0f},
135 {.input: "10e+5199", .fmt: chars_format::scientific, .correct_idx: 8, .correct_ec: errc::result_out_of_range, .correct_value: float_inf},
136 {.input: "0.001e-5199", .fmt: chars_format::scientific, .correct_idx: 11, .correct_ec: errc::result_out_of_range, .correct_value: 0.0f},
137};
138
139#endif // FLOAT_FROM_CHARS_TEST_CASES_HPP
140

source code of libcxx/test/std/utilities/charconv/charconv.msvc/float_from_chars_test_cases.hpp