From e5b4fffc79ec61845970f47dd5e6a4cd3ecd6c05 Mon Sep 17 00:00:00 2001 From: Matt Borland Date: Fri, 2 Jun 2023 10:54:14 +0200 Subject: [PATCH] Fix 32 bit nan handling --- src/to_chars.cpp | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/src/to_chars.cpp b/src/to_chars.cpp index 0665a5e..eab78b0 100644 --- a/src/to_chars.cpp +++ b/src/to_chars.cpp @@ -9,6 +9,15 @@ #include #include +// C14 includes an issignaling function that never made it into C++ +#ifndef __STDC_WANT_IEC_60559_BFP_EXT__ +# define __STDC_WANT_IEC_60559_BFP_EXT__ +#endif +extern "C" +{ + #include +} + #ifdef BOOST_CHARCONV_HAS_INT128 # include #endif @@ -603,6 +612,35 @@ boost::charconv::to_chars_result boost::charconv::to_chars(char* first, char* la boost::charconv::to_chars_result boost::charconv::to_chars( char* first, char* last, long double value, boost::charconv::chars_format fmt, int precision) noexcept { + if (isnan(value)) + { + bool is_negative = false; + if (signbit(value)) + { + is_negative = true; + *first++ = '-'; + } + + if (issignaling(value)) + { + std::memcpy(first, "nan(snan)", 9); + return { first + 9 + (int)is_negative, std::errc() }; + } + else + { + if (is_negative) + { + std::memcpy(first, "nan(ind)", 8); + return { first + 9, std::errc() }; + } + else + { + std::memcpy(first, "nan", 3); + return { first + 3, std::errc() }; + } + } + } + (void)fmt; if (precision == -1)