diff --git a/include/boost/multiprecision/cpp_bin_float.hpp b/include/boost/multiprecision/cpp_bin_float.hpp index e393d131..f988fb47 100644 --- a/include/boost/multiprecision/cpp_bin_float.hpp +++ b/include/boost/multiprecision/cpp_bin_float.hpp @@ -581,8 +581,8 @@ inline void do_eval_subtract(cpp_bin_float::exponent_infinity: - res.exponent() = cpp_bin_float::exponent_nan; - res.sign() = false; + res.exponent() = cpp_bin_float::exponent_infinity; + res.sign() = true; res.bits() = static_cast(0u); return; // result is a NaN. case cpp_bin_float::exponent_nan: diff --git a/include/boost/multiprecision/cpp_dec_float.hpp b/include/boost/multiprecision/cpp_dec_float.hpp index 4c469190..26fe9815 100644 --- a/include/boost/multiprecision/cpp_dec_float.hpp +++ b/include/boost/multiprecision/cpp_dec_float.hpp @@ -662,6 +662,12 @@ cpp_dec_float& cpp_dec_float((cpp_dec_float_elem_number - 1) * cpp_dec_float_elem_digits10); diff --git a/test/test_arithmetic.hpp b/test/test_arithmetic.hpp index 52e0a592..340afaad 100644 --- a/test/test_arithmetic.hpp +++ b/test/test_arithmetic.hpp @@ -993,6 +993,74 @@ void test_float_ops(const boost::mpl::int_::has_quiet_NaN) + { + v = 20.25; + r = std::numeric_limits::quiet_NaN(); + BOOST_CHECK((boost::math::isnan)(v + r)); + BOOST_CHECK((boost::math::isnan)(r + v)); + BOOST_CHECK((boost::math::isnan)(r - v)); + BOOST_CHECK((boost::math::isnan)(v - r)); + BOOST_CHECK((boost::math::isnan)(r * v)); + BOOST_CHECK((boost::math::isnan)(v * r)); + BOOST_CHECK((boost::math::isnan)(r / v)); + BOOST_CHECK((boost::math::isnan)(v / r)); + Real t = v; + BOOST_CHECK((boost::math::isnan)(t += r)); + t = r; + BOOST_CHECK((boost::math::isnan)(t += v)); + t = r; + BOOST_CHECK((boost::math::isnan)(t -= v)); + t = v; + BOOST_CHECK((boost::math::isnan)(t -= r)); + t = r; + BOOST_CHECK((boost::math::isnan)(t *= v)); + t = v; + BOOST_CHECK((boost::math::isnan)(t *= r)); + t = r; + BOOST_CHECK((boost::math::isnan)(t /= v)); + t = v; + BOOST_CHECK((boost::math::isnan)(t /= r)); + } + // + // Operations involving infinities as one argument: + // + if(std::numeric_limits::has_infinity) + { + v = 20.25; + r = std::numeric_limits::infinity(); + BOOST_CHECK((boost::math::isinf)(v + r)); + BOOST_CHECK((boost::math::isinf)(r + v)); + BOOST_CHECK((boost::math::isinf)(r - v)); + BOOST_CHECK((boost::math::isinf)(v - r)); + BOOST_CHECK_LT(v - r, 0); + BOOST_CHECK((boost::math::isinf)(r * v)); + BOOST_CHECK((boost::math::isinf)(v * r)); + BOOST_CHECK((boost::math::isinf)(r / v)); + BOOST_CHECK_EQUAL(v / r, 0); + Real t = v; + BOOST_CHECK((boost::math::isinf)(t += r)); + t = r; + BOOST_CHECK((boost::math::isinf)(t += v)); + t = r; + BOOST_CHECK((boost::math::isinf)(t -= v)); + t = v; + BOOST_CHECK((boost::math::isinf)(t -= r)); + t = v; + BOOST_CHECK(t -= r < 0); + t = r; + BOOST_CHECK((boost::math::isinf)(t *= v)); + t = v; + BOOST_CHECK((boost::math::isinf)(t *= r)); + t = r; + BOOST_CHECK((boost::math::isinf)(t /= v)); + t = v; + BOOST_CHECK((t /= r) == 0); + } + test_float_funcs(boost::mpl::bool_::is_specialized>()); }