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