X-Git-Url: https://git.cworth.org/git?a=blobdiff_plain;f=retrace%2Fjson.hpp;h=4ad2ab35d2fd9f270fd4c53845b4ef0293b0b422;hb=2d4f64cea2e02ab2924ad0d0e0b1b3abfbce610a;hp=14ff501f5681777a19a56b8321643d2e68239388;hpb=41a6d89aa0156103f5217521fe582941782aad8e;p=apitrace diff --git a/retrace/json.hpp b/retrace/json.hpp index 14ff501..4ad2ab3 100644 --- a/retrace/json.hpp +++ b/retrace/json.hpp @@ -34,7 +34,16 @@ #include #include +#ifdef _MSC_VER +# include +# define isfinite _finite +# define isnan _isnan +#else +# include // isfinite, isnan +#endif + #include +#include #include #include @@ -327,15 +336,21 @@ public: template inline void writeNumber(T n) { - if (n != n) { - // NaN - writeNull(); + separator(); + if (isnan(n)) { + // NaN is non-standard but widely supported + os << "NaN"; + } else if (!isfinite(n)) { + // Infinite is non-standard but widely supported + if (n < 0) { + os << '-'; + } + os << "Infinity"; } else { - separator(); - os << std::dec << std::setprecision(9) << n; - value = true; - space = ' '; + os << std::dec << std::setprecision(std::numeric_limits::digits10 + 1) << n; } + value = true; + space = ' '; } inline void writeStringMember(const char *name, const char *s) {