From 078095d1e30c3e4ca5a49bb4333ea3cda7c32fce Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Mon, 2 Nov 2020 20:17:11 -0500 Subject: [PATCH] Patching. --- include/fast_float/parse_number.h | 13 ++++++------- tests/basictest.cpp | 16 ++++++++++++++++ 2 files changed, 22 insertions(+), 7 deletions(-) diff --git a/include/fast_float/parse_number.h b/include/fast_float/parse_number.h index a9f5a84..9b2d5b5 100644 --- a/include/fast_float/parse_number.h +++ b/include/fast_float/parse_number.h @@ -24,14 +24,13 @@ from_chars_result parse_infnan(const char *first, const char *last, T &value) n from_chars_result answer; answer.ec = std::errc(); // be optimistic if (last - first >= 3) { - if (fastfloat_strncasecmp(first, "nan", 3) == 0) { + if (fastfloat_strncasecmp(first, "nan", 3)) { answer.ptr = first + 3; value = std::numeric_limits::quiet_NaN(); return answer; } - if (fastfloat_strncasecmp(first, "inf", 3) == 0) { - - if ((last - first >= 8) && (fastfloat_strncasecmp(first, "infinity", 8) == 0)) { + if (fastfloat_strncasecmp(first, "inf", 3)) { + if ((last - first >= 8) && fastfloat_strncasecmp(first, "infinity", 8)) { answer.ptr = first + 8; } else { answer.ptr = first + 3; @@ -40,7 +39,7 @@ from_chars_result parse_infnan(const char *first, const char *last, T &value) n return answer; } if (last - first >= 4) { - if ((fastfloat_strncasecmp(first, "+nan", 4) == 0) || (fastfloat_strncasecmp(first, "-nan", 4) == 0)) { + if (fastfloat_strncasecmp(first, "+nan", 4) || fastfloat_strncasecmp(first, "-nan", 4)) { answer.ptr = first + 4; value = std::numeric_limits::quiet_NaN(); if (first[0] == '-') { @@ -49,8 +48,8 @@ from_chars_result parse_infnan(const char *first, const char *last, T &value) n return answer; } - if ((fastfloat_strncasecmp(first, "+inf", 4) == 0) || (fastfloat_strncasecmp(first, "-inf", 4) == 0)) { - if ((last - first >= 8) && (fastfloat_strncasecmp(first + 1, "infinity", 8) == 0)) { + if (fastfloat_strncasecmp(first, "+inf", 4) || fastfloat_strncasecmp(first, "-inf", 4)) { + if ((last - first >= 8) && fastfloat_strncasecmp(first + 1, "infinity", 8)) { answer.ptr = first + 9; } else { answer.ptr = first + 4; diff --git a/tests/basictest.cpp b/tests/basictest.cpp index e829203..39aefc4 100644 --- a/tests/basictest.cpp +++ b/tests/basictest.cpp @@ -150,6 +150,14 @@ int main() { std::cout << "======= 64 bits " << std::endl; + Assert(basic_test_64bit("INF",std::numeric_limits::infinity())); + Assert(basic_test_64bit("-INF",-std::numeric_limits::infinity())); + Assert(basic_test_64bit("INFINITY",std::numeric_limits::infinity())); + Assert(basic_test_64bit("-INFINITY",-std::numeric_limits::infinity())); + Assert(basic_test_64bit("infinity",std::numeric_limits::infinity())); + Assert(basic_test_64bit("-infinity",-std::numeric_limits::infinity())); + Assert(basic_test_64bit("inf",std::numeric_limits::infinity())); + Assert(basic_test_64bit("-inf",-std::numeric_limits::infinity())); Assert(basic_test_64bit("9355950000000000000.00000000000000000000000000000000001844674407370955161600000184467440737095516161844674407370955161407370955161618446744073709551616000184467440737095516166000001844674407370955161618446744073709551614073709551616184467440737095516160001844674407370955161601844674407370955674451616184467440737095516140737095516161844674407370955161600018446744073709551616018446744073709551611616000184467440737095001844674407370955161600184467440737095516160018446744073709551168164467440737095516160001844073709551616018446744073709551616184467440737095516160001844674407536910751601611616000184467440737095001844674407370955161600184467440737095516160018446744073709551616184467440737095516160001844955161618446744073709551616000184467440753691075160018446744073709",0x1.03ae05e8fca1cp+63)); Assert(basic_test_64bit("-0",-0.0)); Assert(basic_test_64bit("2.22507385850720212418870147920222032907240528279439037814303133837435107319244194686754406432563881851382188218502438069999947733013005649884107791928741341929297200970481951993067993290969042784064731682041565926728632933630474670123316852983422152744517260835859654566319282835244787787799894310779783833699159288594555213714181128458251145584319223079897504395086859412457230891738946169368372321191373658977977723286698840356390251044443035457396733706583981055420456693824658413747607155981176573877626747665912387199931904006317334709003012790188175203447190250028061277777916798391090578584006464715943810511489154282775041174682194133952466682503431306181587829379004205392375072083366693241580002758391118854188641513168478436313080237596295773983001708984375e-308", 0x1.0000000000002p-1022)); @@ -209,6 +217,14 @@ int main() { std::cout << std::endl; std::cout << "======= 32 bits " << std::endl; + Assert(basic_test_32bit("INF",std::numeric_limits::infinity())); + Assert(basic_test_32bit("-INF",-std::numeric_limits::infinity())); + Assert(basic_test_32bit("INFINITY",std::numeric_limits::infinity())); + Assert(basic_test_32bit("-INFINITY",-std::numeric_limits::infinity())); + Assert(basic_test_32bit("infinity",std::numeric_limits::infinity())); + Assert(basic_test_32bit("-infinity",-std::numeric_limits::infinity())); + Assert(basic_test_32bit("inf",std::numeric_limits::infinity())); + Assert(basic_test_32bit("-inf",-std::numeric_limits::infinity())); Assert(basic_test_32bit("-0",-0.0f)); Assert(basic_test_32bit("1090544144181609348835077142190",0x1.b877ap+99f)); Assert(basic_test_32bit("1.1754943508e-38",1.1754943508e-38f));