diff --git a/include/boost/decimal/decimal128_t.hpp b/include/boost/decimal/decimal128_t.hpp index d598ad945..adc3ec3fa 100644 --- a/include/boost/decimal/decimal128_t.hpp +++ b/include/boost/decimal/decimal128_t.hpp @@ -1052,10 +1052,14 @@ BOOST_DECIMAL_CXX20_CONSTEXPR decimal128_t::decimal128_t(const Float val) noexce { *this = from_bits(detail::d128_nan_mask); } - else if (val == std::numeric_limits::infinity() || val == -std::numeric_limits::infinity()) + else if (val == std::numeric_limits::infinity()) { *this = from_bits(detail::d128_inf_mask); } + else if (val == -std::numeric_limits::infinity()) + { + *this = -from_bits(detail::d128_inf_mask); + } else #endif { diff --git a/include/boost/decimal/decimal32_t.hpp b/include/boost/decimal/decimal32_t.hpp index 18dedecb1..89196ca3f 100644 --- a/include/boost/decimal/decimal32_t.hpp +++ b/include/boost/decimal/decimal32_t.hpp @@ -1801,10 +1801,14 @@ BOOST_DECIMAL_CXX20_CONSTEXPR decimal32_t::decimal32_t(const Float val) noexcept { *this = boost::decimal::from_bits(boost::decimal::detail::d32_nan_mask); } - else if (val == std::numeric_limits::infinity() || val == -std::numeric_limits::infinity()) + else if (val == std::numeric_limits::infinity()) { *this = boost::decimal::from_bits(boost::decimal::detail::d32_inf_mask); } + else if (val == -std::numeric_limits::infinity()) + { + *this = -boost::decimal::from_bits(boost::decimal::detail::d32_inf_mask); + } else #endif { diff --git a/include/boost/decimal/decimal64_t.hpp b/include/boost/decimal/decimal64_t.hpp index 51f2d0ca8..728321136 100644 --- a/include/boost/decimal/decimal64_t.hpp +++ b/include/boost/decimal/decimal64_t.hpp @@ -1006,10 +1006,14 @@ BOOST_DECIMAL_CXX20_CONSTEXPR decimal64_t::decimal64_t(const Float val) noexcept { *this = from_bits(detail::d64_nan_mask); } - else if (val == std::numeric_limits::infinity() || val == -std::numeric_limits::infinity()) + else if (val == std::numeric_limits::infinity()) { *this = from_bits(detail::d64_inf_mask); } + else if (val == -std::numeric_limits::infinity()) + { + *this = -from_bits(detail::d64_inf_mask); + } else #endif { diff --git a/include/boost/decimal/decimal_fast128_t.hpp b/include/boost/decimal/decimal_fast128_t.hpp index cb5f2b035..052282b18 100644 --- a/include/boost/decimal/decimal_fast128_t.hpp +++ b/include/boost/decimal/decimal_fast128_t.hpp @@ -619,10 +619,15 @@ BOOST_DECIMAL_CXX20_CONSTEXPR decimal_fast128_t::decimal_fast128_t(const Float v { significand_ = detail::d128_fast_qnan; } - else if (val == std::numeric_limits::infinity() || val == -std::numeric_limits::infinity()) + else if (val == std::numeric_limits::infinity()) { significand_ = detail::d128_fast_inf; } + else if (val == -std::numeric_limits::infinity()) + { + significand_ = detail::d128_fast_inf; + sign_ = true; + } else #endif { diff --git a/include/boost/decimal/decimal_fast32_t.hpp b/include/boost/decimal/decimal_fast32_t.hpp index 7493a5790..2c34d7180 100644 --- a/include/boost/decimal/decimal_fast32_t.hpp +++ b/include/boost/decimal/decimal_fast32_t.hpp @@ -724,10 +724,15 @@ BOOST_DECIMAL_CXX20_CONSTEXPR decimal_fast32_t::decimal_fast32_t(const Float val { significand_ = detail::d32_fast_qnan; } - else if (val == std::numeric_limits::infinity() || val == -std::numeric_limits::infinity()) + else if (val == std::numeric_limits::infinity()) { significand_ = detail::d32_fast_inf; } + else if (val == -std::numeric_limits::infinity()) + { + significand_ = detail::d32_fast_inf; + sign_ = true; + } else #endif { diff --git a/include/boost/decimal/decimal_fast64_t.hpp b/include/boost/decimal/decimal_fast64_t.hpp index b282e8c8d..6f4046098 100644 --- a/include/boost/decimal/decimal_fast64_t.hpp +++ b/include/boost/decimal/decimal_fast64_t.hpp @@ -621,10 +621,15 @@ BOOST_DECIMAL_CXX20_CONSTEXPR decimal_fast64_t::decimal_fast64_t(const Float val { significand_ = detail::d64_fast_qnan; } - else if (val == std::numeric_limits::infinity() || val == -std::numeric_limits::infinity()) + else if (val == std::numeric_limits::infinity()) { significand_ = detail::d64_fast_inf; } + else if (val == -std::numeric_limits::infinity()) + { + significand_ = detail::d64_fast_inf; + sign_ = true; + } else #endif { diff --git a/test/Jamfile b/test/Jamfile index 903d91d9f..7c277bb70 100644 --- a/test/Jamfile +++ b/test/Jamfile @@ -96,6 +96,7 @@ run github_issue_1361.cpp ; run github_issue_1378.cpp ; run github_issue_1383.cpp ; run github_issue_1384.cpp ; +run github_issue_1398.cpp ; run link_1.cpp link_2.cpp link_3.cpp ; run quick.cpp ; diff --git a/test/github_issue_1384.cpp b/test/github_issue_1384.cpp index 56377d2da..17b2998de 100644 --- a/test/github_issue_1384.cpp +++ b/test/github_issue_1384.cpp @@ -1,3 +1,8 @@ +// Copyright 2026 Chris Kormanyos +// Distributed under the Boost Software License, Version 1.0. +// https://www.boost.org/LICENSE_1_0.txt +// +// See: https://github.com/boostorg/decimal/issues/1384 #include diff --git a/test/github_issue_1398.cpp b/test/github_issue_1398.cpp new file mode 100644 index 000000000..10f854e81 --- /dev/null +++ b/test/github_issue_1398.cpp @@ -0,0 +1,42 @@ +// Copyright 2026 Chris Kormanyos +// Distributed under the Boost Software License, Version 1.0. +// https://www.boost.org/LICENSE_1_0.txt +// +// See: https://github.com/boostorg/decimal/issues/1398 + +#include +#include +#include + +template +void test_driver() +{ + using namespace boost::decimal; + + constexpr auto builtin_neg_inf = -std::numeric_limits::infinity(); + + const auto val = U(builtin_neg_inf); + BOOST_TEST(isinf(val)); + BOOST_TEST(val < 0); +} + +template +void test() +{ + using namespace boost::decimal; + + test_driver(); + test_driver(); + test_driver(); + test_driver(); + test_driver(); + test_driver(); +} + +int main() +{ + test(); + test(); + + return boost::report_errors(); +}