From 92693d6e601d42d9166bfca0bb1e2fa48b814661 Mon Sep 17 00:00:00 2001 From: Jeppe Tarp Date: Sat, 3 Aug 2019 13:14:13 +0200 Subject: [PATCH] Make sure output of NaN, Infinity and -Infinity is identical on all platforms --- include/yaml-cpp/emitter.h | 26 +++++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/include/yaml-cpp/emitter.h b/include/yaml-cpp/emitter.h index 37de878..9f43060 100644 --- a/include/yaml-cpp/emitter.h +++ b/include/yaml-cpp/emitter.h @@ -8,9 +8,11 @@ #endif #include +#include #include #include #include +#include #include "yaml-cpp/binary.h" #include "yaml-cpp/dll.h" @@ -153,7 +155,29 @@ inline Emitter& Emitter::WriteStreamable(T value) { std::stringstream stream; SetStreamablePrecision(stream); - stream << value; + + bool special = false; + if (std::is_floating_point_v) { + if ((std::numeric_limits::has_quiet_NaN && + value == std::numeric_limits::quiet_NaN()) || + (std::numeric_limits::has_signaling_NaN && + value == std::numeric_limits::signaling_NaN())) { + special = true; + stream << ".nan"; + } else if (std::numeric_limits::has_infinity) { + if (value == std::numeric_limits::infinity()) { + special = true; + stream << ".inf"; + } else if (value == -std::numeric_limits::infinity()) { + special = true; + stream << "-.inf"; + } + } + } + + if (!special) { + stream << value; + } m_stream << stream.str(); StartedScalar();