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)); }