diff --git a/include/boost/rational.hpp b/include/boost/rational.hpp index f33bc3b1..afe99839 100644 --- a/include/boost/rational.hpp +++ b/include/boost/rational.hpp @@ -902,7 +902,7 @@ BOOST_CXX14_CONSTEXPR void rational::normalize() num /= g; den /= g; - if (den < -(std::numeric_limits::max)()) { + if (std::numeric_limits::is_bounded && den < -(std::numeric_limits::max)()) { BOOST_THROW_EXCEPTION(bad_rational("bad rational: non-zero singular denominator")); } diff --git a/test/rational_test.cpp b/test/rational_test.cpp index ccd58ea5..d4efe5fc 100644 --- a/test/rational_test.cpp +++ b/test/rational_test.cpp @@ -40,6 +40,7 @@ #include #include #include +#include #include #include #include @@ -1605,4 +1606,16 @@ BOOST_AUTO_TEST_CASE( ticket_9067_test ) #endif } +// arbitrary precision rational with negative denominator throws exception +BOOST_AUTO_TEST_CASE( issue_27_test ) +{ + using namespace boost::multiprecision; + + // Verify that the check to ensure that the denominator is positive works + // with an arbitrary precision rational. + cpp_rational rational(1, -2); + BOOST_CHECK_EQUAL(numerator(rational), -1); + BOOST_CHECK_EQUAL(denominator(rational), 2); +} + BOOST_AUTO_TEST_SUITE_END()