From 3f0d91f08a048a799e3eead16c10bd21977da53a Mon Sep 17 00:00:00 2001 From: fo40225 Date: Sat, 5 May 2018 14:38:53 +0800 Subject: [PATCH 1/3] fix ValueTest/specialFloats test failure when fp:fast on msvc --- src/lib_json/json_writer.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lib_json/json_writer.cpp b/src/lib_json/json_writer.cpp index be03a66..3b22ee8 100644 --- a/src/lib_json/json_writer.cpp +++ b/src/lib_json/json_writer.cpp @@ -149,7 +149,7 @@ JSONCPP_STRING valueToString(double value, bool useSpecialFloats, unsigned int p } else { // IEEE standard states that NaN values will not compare to themselves - if (value != value) { + if (isnan(value)) { len = snprintf(buffer, sizeof(buffer), useSpecialFloats ? "NaN" : "null"); } else if (value < 0) { len = snprintf(buffer, sizeof(buffer), useSpecialFloats ? "-Infinity" : "-1e+9999"); From 4050143288562d0775e0f028910ce5451c326846 Mon Sep 17 00:00:00 2001 From: fo40225 Date: Sat, 5 May 2018 15:05:22 +0800 Subject: [PATCH 2/3] fix ValueTest/integers, CharReaderAllowSpecialFloatsTest/issue209 test failure when fp:fast on msvc --- src/test_lib_json/main.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/test_lib_json/main.cpp b/src/test_lib_json/main.cpp index cbf4823..9cddf41 100644 --- a/src/test_lib_json/main.cpp +++ b/src/test_lib_json/main.cpp @@ -972,8 +972,8 @@ JSONTEST_FIXTURE(ValueTest, integers) { JSONTEST_ASSERT_EQUAL(Json::UInt64(1) << 63, val.asUInt64()); JSONTEST_ASSERT_EQUAL(Json::UInt64(1) << 63, val.asLargestUInt()); JSONTEST_ASSERT_EQUAL(uint64ToDouble(Json::UInt64(1) << 63), val.asDouble()); - JSONTEST_ASSERT_EQUAL(float(uint64ToDouble(Json::UInt64(1) << 63)), - val.asFloat()); + JSONTEST_ASSERT_EQUAL(float(Json::UInt64(1) << 63), val.asFloat()); + JSONTEST_ASSERT_EQUAL(true, val.asBool()); JSONTEST_ASSERT_STRING_EQUAL("9.2233720368547758e+18", normalizeFloatingPointStr(JsonTest::ToJsonString(val.asString()))); @@ -2405,7 +2405,7 @@ JSONTEST_FIXTURE(CharReaderAllowSpecialFloatsTest, issue209) { JSONTEST_ASSERT_STRING_EQUAL("", errs); JSONTEST_ASSERT_EQUAL(3u, root.size()); double n = root["a"].asDouble(); - JSONTEST_ASSERT(n != n); + JSONTEST_ASSERT(isnan(n)); JSONTEST_ASSERT_EQUAL(std::numeric_limits::infinity(), root.get("b", 0.0)); JSONTEST_ASSERT_EQUAL(-std::numeric_limits::infinity(), root.get("c", 0.0)); } From 6e5e9be7368e5da375dab5cd0b200fd22ab4795c Mon Sep 17 00:00:00 2001 From: fo40225 Date: Tue, 8 May 2018 12:35:08 +0800 Subject: [PATCH 3/3] corss compiler isnan --- src/lib_json/json_writer.cpp | 21 ++++++++++++++++++++- src/test_lib_json/main.cpp | 3 ++- 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/src/lib_json/json_writer.cpp b/src/lib_json/json_writer.cpp index 3b22ee8..b8c7223 100644 --- a/src/lib_json/json_writer.cpp +++ b/src/lib_json/json_writer.cpp @@ -68,6 +68,25 @@ #define snprintf _snprintf #endif +#if defined(_MSC_VER) && !defined(__clang__) +#if _MSC_VER >= 1900 && defined(_WIN64) +#include +#define isnan _isnanf +#else +#include +#define isnan _isnan +#endif +#elif __cplusplus >= 201103L +#include +#define isnan std::isnan +#else +#include +#if !define(isnan) +// IEEE standard states that NaN values will not compare to themselves +#define isnan(x) (x!=x) +#endif +#endif + #if defined(_MSC_VER) && _MSC_VER >= 1400 // VC++ 8.0 // Disable warning about strdup being deprecated. #pragma warning(disable : 4996) @@ -148,7 +167,7 @@ JSONCPP_STRING valueToString(double value, bool useSpecialFloats, unsigned int p } } else { - // IEEE standard states that NaN values will not compare to themselves + if (isnan(value)) { len = snprintf(buffer, sizeof(buffer), useSpecialFloats ? "NaN" : "null"); } else if (value < 0) { diff --git a/src/test_lib_json/main.cpp b/src/test_lib_json/main.cpp index 9cddf41..a0c26eb 100644 --- a/src/test_lib_json/main.cpp +++ b/src/test_lib_json/main.cpp @@ -18,6 +18,7 @@ #include #include #include +#include // Make numeric limits more convenient to talk about. // Assumes int type in 32 bits. @@ -2405,7 +2406,7 @@ JSONTEST_FIXTURE(CharReaderAllowSpecialFloatsTest, issue209) { JSONTEST_ASSERT_STRING_EQUAL("", errs); JSONTEST_ASSERT_EQUAL(3u, root.size()); double n = root["a"].asDouble(); - JSONTEST_ASSERT(isnan(n)); + JSONTEST_ASSERT(std::isnan(n)); JSONTEST_ASSERT_EQUAL(std::numeric_limits::infinity(), root.get("b", 0.0)); JSONTEST_ASSERT_EQUAL(-std::numeric_limits::infinity(), root.get("c", 0.0)); }