Skip to content

Commit

Permalink
Make sure cpp_int::eval_convert_to is noexcept as advertised.
Browse files Browse the repository at this point in the history
  • Loading branch information
jzmaddock committed May 21, 2023
1 parent 97b27c4 commit d51f2e9
Showing 1 changed file with 10 additions and 2 deletions.
12 changes: 10 additions & 2 deletions include/boost/multiprecision/cpp_int/misc.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -184,7 +184,7 @@ eval_convert_to(R* result, const cpp_int_backend<MinBits1, MaxBits1, SignType1,

template <class R, std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1>
inline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<std::is_floating_point<R>::value && !is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value, void>::type
eval_convert_to(R* result, const cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>& backend) noexcept(boost::multiprecision::detail::is_arithmetic<R>::value)
eval_convert_to(R* result, const cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>& backend) noexcept(boost::multiprecision::detail::is_arithmetic<R>::value && std::numeric_limits<R>::has_infinity)
{
BOOST_MP_FLOAT128_USING using std::ldexp;
if (eval_is_zero(backend))
Expand Down Expand Up @@ -244,7 +244,15 @@ eval_convert_to(R* result, const cpp_int_backend<MinBits1, MaxBits1, SignType1,
if ((eval_lsb_imp(backend) < static_cast<std::size_t>(bits)) || eval_bit_test(backend, static_cast<std::size_t>(bits + 1)))
{
#ifdef BOOST_MP_MATH_AVAILABLE
*result = boost::math::float_next(*result);
BOOST_IF_CONSTEXPR(std::numeric_limits<R>::has_infinity)
{
// Must NOT throw:
*result = boost::math::float_next(*result, boost::math::policies::make_policy(boost::math::policies::overflow_error<boost::math::policies::ignore_error>()));
}
else
{
*result = boost::math::float_next(*result);
}
#else
using std::nextafter; BOOST_MP_FLOAT128_USING
*result = nextafter(*result, *result * 2);
Expand Down

0 comments on commit d51f2e9

Please sign in to comment.