43 {
"-0", 0x80000000u,
true},
44 {
"1", 0x3F800000u,
true},
45 {
"-1", 0xBF800000u,
true},
46 {
"0.5", 0x3F000000u,
true},
47 {
"2.5", 0x40200000u,
true},
48 {
"3.14159", 0x40490FD0u,
false},
49 {
"2.71828", 0x402DF84Du,
false},
50 {
"100", 0x42C80000u,
true},
51 {
"1000", 0x447A0000u,
true},
52 {
"1e30", 0x7149F2CAu,
false},
53 {
"1e-30", 0x0DA24260u,
false},
54 {
"1e-40", 0x00000000u,
true},
55 {
"1e40", 0x7F800000u,
true},
56 {
"-1e40", 0xFF800000u,
true}},
57 format_cases{{0x00000000u, 6,
"0.000000"},
58 {0x80000000u, 6,
"-0.000000"},
59 {0x3F800000u, 6,
"1.000000"},
60 {0xBF800000u, 6,
"-1.000000"},
61 {0x3F000000u, 6,
"0.500000"},
62 {0x41200000u, 2,
"10.00"},
63 {0x7F800000u, 6,
"inf"},
64 {0xFF800000u, 6,
"-inf"},
65 {0x7FC00000u, 6,
"nan"}},
66 round_trip_bits{0x00000000u, 0x80000000u, 0x3F800000u, 0xBF800000u,
67 0x3F000000u, 0x40200000u, 0x40490FDBu, 0x40B00000u,
68 0x42C80000u, 0x447A0000u} {}
76 return a > b ? a - b : b - a;
80 if (actual == expected) {
83 if ((actual & 0x80000000u) != (expected & 0x80000000u)) {
86 return absDiff(actual, expected) <= 1u;
106 r.first_failure =
nullptr;
110 for (fl::size i = 0; i <
sizeof(
state.parse_cases) /
sizeof(
state.parse_cases[0]); ++i) {
112 fl::size consumed = 0;
113 const fl::u32 actual =
115 const bool value_ok = c.
exact
122 for (fl::size i = 0; i <
sizeof(
state.format_cases) /
sizeof(
state.format_cases[0]); ++i) {
129 for (fl::size i = 0; i <
sizeof(
state.round_trip_bits) /
sizeof(
state.round_trip_bits[0]); ++i) {
130 const fl::u32 expected =
state.round_trip_bits[i];
132 const fl::u32 actual =
138 fl::size consumed = 123u;
140 recordCheck(r,
"nan-reject", consumed == 0u, 0u,
static_cast<fl::u32
>(consumed));
142 r.success = r.tests_failed == 0u;
static T & instance() FL_NO_EXCEPT
const char * c_str() const FL_NO_EXCEPT
fl::size size() const FL_NO_EXCEPT
Ieee754CaseState & ieee754CaseState()
void recordCheck(Result &r, const char *name, bool passed, fl::u32 expected=0, fl::u32 actual=0) FL_NO_EXCEPT
bool withinOneUlp(fl::u32 actual, fl::u32 expected) FL_NO_EXCEPT
fl::u32 absDiff(fl::u32 a, fl::u32 b) FL_NO_EXCEPT
const char * first_failure
const char * expected_text
u32 ieee754_parse_decimal(const char *s, fl::size len, fl::size *consumed) FL_NO_EXCEPT
Parse a decimal floating-point number into IEEE 754 single-precision bits.
size_t strlen(const char *s) FL_NO_EXCEPT
fl::string ieee754_format_decimal(u32 bits, int precision) FL_NO_EXCEPT
Format IEEE 754 single-precision bits as decimal text.
ParseCase parse_cases[15]
FormatCase format_cases[9]
fl::u32 round_trip_bits[10]