diff --git a/include/boost/spirit/home/karma/numeric/detail/real_utils.hpp b/include/boost/spirit/home/karma/numeric/detail/real_utils.hpp index 526985d280..84ea67dd4b 100644 --- a/include/boost/spirit/home/karma/numeric/detail/real_utils.hpp +++ b/include/boost/spirit/home/karma/numeric/detail/real_utils.hpp @@ -105,7 +105,13 @@ namespace boost { namespace spirit { namespace karma if (exp != -dim) ++exp; dim = static_cast(-exp); - n *= spirit::traits::pow10(exp); + // detect and handle denormalized numbers to prevent overflow in pow10 + if (exp > std::numeric_limits::max_exponent10) + { + n *= spirit::traits::pow10(std::numeric_limits::max_exponent10); + n *= spirit::traits::pow10(exp - std::numeric_limits::max_exponent10); + } else + n *= spirit::traits::pow10(exp); } }