Patching.

This commit is contained in:
Daniel Lemire 2020-11-02 20:17:11 -05:00
parent 8df999e44e
commit 078095d1e3
2 changed files with 22 additions and 7 deletions

View File

@ -24,14 +24,13 @@ from_chars_result parse_infnan(const char *first, const char *last, T &value) n
from_chars_result answer; from_chars_result answer;
answer.ec = std::errc(); // be optimistic answer.ec = std::errc(); // be optimistic
if (last - first >= 3) { if (last - first >= 3) {
if (fastfloat_strncasecmp(first, "nan", 3) == 0) { if (fastfloat_strncasecmp(first, "nan", 3)) {
answer.ptr = first + 3; answer.ptr = first + 3;
value = std::numeric_limits<T>::quiet_NaN(); value = std::numeric_limits<T>::quiet_NaN();
return answer; return answer;
} }
if (fastfloat_strncasecmp(first, "inf", 3) == 0) { if (fastfloat_strncasecmp(first, "inf", 3)) {
if ((last - first >= 8) && fastfloat_strncasecmp(first, "infinity", 8)) {
if ((last - first >= 8) && (fastfloat_strncasecmp(first, "infinity", 8) == 0)) {
answer.ptr = first + 8; answer.ptr = first + 8;
} else { } else {
answer.ptr = first + 3; answer.ptr = first + 3;
@ -40,7 +39,7 @@ from_chars_result parse_infnan(const char *first, const char *last, T &value) n
return answer; return answer;
} }
if (last - first >= 4) { 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; answer.ptr = first + 4;
value = std::numeric_limits<T>::quiet_NaN(); value = std::numeric_limits<T>::quiet_NaN();
if (first[0] == '-') { if (first[0] == '-') {
@ -49,8 +48,8 @@ from_chars_result parse_infnan(const char *first, const char *last, T &value) n
return answer; return answer;
} }
if ((fastfloat_strncasecmp(first, "+inf", 4) == 0) || (fastfloat_strncasecmp(first, "-inf", 4) == 0)) { if (fastfloat_strncasecmp(first, "+inf", 4) || fastfloat_strncasecmp(first, "-inf", 4)) {
if ((last - first >= 8) && (fastfloat_strncasecmp(first + 1, "infinity", 8) == 0)) { if ((last - first >= 8) && fastfloat_strncasecmp(first + 1, "infinity", 8)) {
answer.ptr = first + 9; answer.ptr = first + 9;
} else { } else {
answer.ptr = first + 4; answer.ptr = first + 4;

View File

@ -150,6 +150,14 @@ int main() {
std::cout << "======= 64 bits " << std::endl; std::cout << "======= 64 bits " << std::endl;
Assert(basic_test_64bit("INF",std::numeric_limits<double>::infinity()));
Assert(basic_test_64bit("-INF",-std::numeric_limits<double>::infinity()));
Assert(basic_test_64bit("INFINITY",std::numeric_limits<double>::infinity()));
Assert(basic_test_64bit("-INFINITY",-std::numeric_limits<double>::infinity()));
Assert(basic_test_64bit("infinity",std::numeric_limits<double>::infinity()));
Assert(basic_test_64bit("-infinity",-std::numeric_limits<double>::infinity()));
Assert(basic_test_64bit("inf",std::numeric_limits<double>::infinity()));
Assert(basic_test_64bit("-inf",-std::numeric_limits<double>::infinity()));
Assert(basic_test_64bit("9355950000000000000.00000000000000000000000000000000001844674407370955161600000184467440737095516161844674407370955161407370955161618446744073709551616000184467440737095516166000001844674407370955161618446744073709551614073709551616184467440737095516160001844674407370955161601844674407370955674451616184467440737095516140737095516161844674407370955161600018446744073709551616018446744073709551611616000184467440737095001844674407370955161600184467440737095516160018446744073709551168164467440737095516160001844073709551616018446744073709551616184467440737095516160001844674407536910751601611616000184467440737095001844674407370955161600184467440737095516160018446744073709551616184467440737095516160001844955161618446744073709551616000184467440753691075160018446744073709",0x1.03ae05e8fca1cp+63)); Assert(basic_test_64bit("9355950000000000000.00000000000000000000000000000000001844674407370955161600000184467440737095516161844674407370955161407370955161618446744073709551616000184467440737095516166000001844674407370955161618446744073709551614073709551616184467440737095516160001844674407370955161601844674407370955674451616184467440737095516140737095516161844674407370955161600018446744073709551616018446744073709551611616000184467440737095001844674407370955161600184467440737095516160018446744073709551168164467440737095516160001844073709551616018446744073709551616184467440737095516160001844674407536910751601611616000184467440737095001844674407370955161600184467440737095516160018446744073709551616184467440737095516160001844955161618446744073709551616000184467440753691075160018446744073709",0x1.03ae05e8fca1cp+63));
Assert(basic_test_64bit("-0",-0.0)); Assert(basic_test_64bit("-0",-0.0));
Assert(basic_test_64bit("2.22507385850720212418870147920222032907240528279439037814303133837435107319244194686754406432563881851382188218502438069999947733013005649884107791928741341929297200970481951993067993290969042784064731682041565926728632933630474670123316852983422152744517260835859654566319282835244787787799894310779783833699159288594555213714181128458251145584319223079897504395086859412457230891738946169368372321191373658977977723286698840356390251044443035457396733706583981055420456693824658413747607155981176573877626747665912387199931904006317334709003012790188175203447190250028061277777916798391090578584006464715943810511489154282775041174682194133952466682503431306181587829379004205392375072083366693241580002758391118854188641513168478436313080237596295773983001708984375e-308", 0x1.0000000000002p-1022)); Assert(basic_test_64bit("2.22507385850720212418870147920222032907240528279439037814303133837435107319244194686754406432563881851382188218502438069999947733013005649884107791928741341929297200970481951993067993290969042784064731682041565926728632933630474670123316852983422152744517260835859654566319282835244787787799894310779783833699159288594555213714181128458251145584319223079897504395086859412457230891738946169368372321191373658977977723286698840356390251044443035457396733706583981055420456693824658413747607155981176573877626747665912387199931904006317334709003012790188175203447190250028061277777916798391090578584006464715943810511489154282775041174682194133952466682503431306181587829379004205392375072083366693241580002758391118854188641513168478436313080237596295773983001708984375e-308", 0x1.0000000000002p-1022));
@ -209,6 +217,14 @@ int main() {
std::cout << std::endl; std::cout << std::endl;
std::cout << "======= 32 bits " << std::endl; std::cout << "======= 32 bits " << std::endl;
Assert(basic_test_32bit("INF",std::numeric_limits<double>::infinity()));
Assert(basic_test_32bit("-INF",-std::numeric_limits<double>::infinity()));
Assert(basic_test_32bit("INFINITY",std::numeric_limits<double>::infinity()));
Assert(basic_test_32bit("-INFINITY",-std::numeric_limits<double>::infinity()));
Assert(basic_test_32bit("infinity",std::numeric_limits<double>::infinity()));
Assert(basic_test_32bit("-infinity",-std::numeric_limits<double>::infinity()));
Assert(basic_test_32bit("inf",std::numeric_limits<double>::infinity()));
Assert(basic_test_32bit("-inf",-std::numeric_limits<double>::infinity()));
Assert(basic_test_32bit("-0",-0.0f)); Assert(basic_test_32bit("-0",-0.0f));
Assert(basic_test_32bit("1090544144181609348835077142190",0x1.b877ap+99f)); Assert(basic_test_32bit("1090544144181609348835077142190",0x1.b877ap+99f));
Assert(basic_test_32bit("1.1754943508e-38",1.1754943508e-38f)); Assert(basic_test_32bit("1.1754943508e-38",1.1754943508e-38f));