Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
Try to finish denorm_min plus its tests
  • Loading branch information
ckormanyos committed Aug 20, 2023
commit 5ea314a8bdb6e7724bf8c0b71d280e584034c0fc
2 changes: 1 addition & 1 deletion include/boost/multiprecision/gmp.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -3871,7 +3871,7 @@ class numeric_limits<boost::multiprecision::number<boost::multiprecision::gmp_ra
static number_type infinity() { return number_type(); }
static number_type quiet_NaN() { return number_type(); }
static number_type signaling_NaN() { return number_type(); }
static number_type denorm_min() { return number_type(); }
static number_type denorm_min() { return (min)(); }
static constexpr bool is_iec559 = false;
static constexpr bool is_bounded = false;
static constexpr bool is_modulo = false;
Expand Down
2 changes: 1 addition & 1 deletion include/boost/multiprecision/mpfr.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -3550,7 +3550,7 @@ class numeric_limits<boost::multiprecision::number<boost::multiprecision::mpfr_f
return value;
}
static number_type signaling_NaN() { return number_type(0); }
static number_type denorm_min() { return number_type(0); }
static number_type denorm_min() { return (min)(); }
static constexpr bool is_iec559 = false;
static constexpr bool is_bounded = true;
static constexpr bool is_modulo = false;
Expand Down
31 changes: 20 additions & 11 deletions test/test_numeric_limits.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -83,33 +83,33 @@ void test_specific(const std::integral_constant<int, boost::multiprecision::numb
BOOST_CHECK((boost::math::isnormal)(sqrt(minv)));
BOOST_CHECK((boost::math::isnormal)(sqrt(maxv)));

if (std::numeric_limits<Number>::is_specialized)
BOOST_IF_CONSTEXPR(std::numeric_limits<Number>::is_specialized)
{
if (std::numeric_limits<Number>::has_quiet_NaN)
BOOST_IF_CONSTEXPR(std::numeric_limits<Number>::has_quiet_NaN)
{
BOOST_TEST((boost::math::isnan)(std::numeric_limits<Number>::quiet_NaN()));
BOOST_TEST(FP_NAN == (boost::math::fpclassify)(std::numeric_limits<Number>::quiet_NaN()));
BOOST_TEST(!(boost::math::isfinite)(std::numeric_limits<Number>::quiet_NaN()));
BOOST_TEST(!(boost::math::isnormal)(std::numeric_limits<Number>::quiet_NaN()));
BOOST_TEST(!(boost::math::isinf)(std::numeric_limits<Number>::quiet_NaN()));
}
if (std::numeric_limits<Number>::has_signaling_NaN)
BOOST_IF_CONSTEXPR(std::numeric_limits<Number>::has_signaling_NaN)
{
BOOST_TEST((boost::math::isnan)(std::numeric_limits<Number>::signaling_NaN()));
BOOST_TEST(FP_NAN == (boost::math::fpclassify)(std::numeric_limits<Number>::signaling_NaN()));
BOOST_TEST(!(boost::math::isfinite)(std::numeric_limits<Number>::signaling_NaN()));
BOOST_TEST(!(boost::math::isnormal)(std::numeric_limits<Number>::signaling_NaN()));
BOOST_TEST(!(boost::math::isinf)(std::numeric_limits<Number>::signaling_NaN()));
}
if (std::numeric_limits<Number>::has_infinity)
BOOST_IF_CONSTEXPR(std::numeric_limits<Number>::has_infinity)
{
BOOST_TEST((boost::math::isinf)(std::numeric_limits<Number>::infinity()));
BOOST_TEST(FP_INFINITE == (boost::math::fpclassify)(std::numeric_limits<Number>::infinity()));
BOOST_TEST(!(boost::math::isfinite)(std::numeric_limits<Number>::infinity()));
BOOST_TEST(!(boost::math::isnormal)(std::numeric_limits<Number>::infinity()));
BOOST_TEST(!(boost::math::isnan)(std::numeric_limits<Number>::infinity()));
}
if (std::numeric_limits<Number>::has_denorm == std::denorm_present)
BOOST_IF_CONSTEXPR(std::numeric_limits<Number>::has_denorm == std::denorm_present)
{
BOOST_TEST(FP_SUBNORMAL == (boost::math::fpclassify)(std::numeric_limits<Number>::denorm_min()));
BOOST_TEST(FP_SUBNORMAL == (boost::math::fpclassify)((std::numeric_limits<Number>::min)() / 2));
Expand All @@ -121,6 +121,15 @@ void test_specific(const std::integral_constant<int, boost::multiprecision::numb
BOOST_TEST(0 != (std::numeric_limits<Number>::min)() / 2);
BOOST_TEST(0 != std::numeric_limits<Number>::denorm_min());
}
BOOST_IF_CONSTEXPR(std::numeric_limits<Number>::has_denorm == std::denorm_absent)
{
BOOST_TEST(std::numeric_limits<Number>::denorm_min() > 0);
BOOST_TEST(!(std::numeric_limits<Number>::denorm_min() > (std::numeric_limits<Number>::min)()));
BOOST_TEST(!(std::numeric_limits<Number>::denorm_min() < (std::numeric_limits<Number>::min)()));
BOOST_TEST(FP_NORMAL == (boost::math::fpclassify)(std::numeric_limits<Number>::denorm_min()));
BOOST_TEST(FP_NORMAL == (boost::math::fpclassify)(-std::numeric_limits<Number>::denorm_min()));
BOOST_TEST(FP_ZERO != (boost::math::fpclassify)(std::numeric_limits<Number>::denorm_min()));
}
}
Number n = 0;
BOOST_TEST((boost::math::fpclassify)(n) == FP_ZERO);
Expand All @@ -135,11 +144,11 @@ void test_specific(const std::integral_constant<int, boost::multiprecision::numb
BOOST_TEST(!(boost::math::isinf)(n));
BOOST_TEST(!(boost::math::isnan)(n));

if (std::numeric_limits<Number>::round_style == std::round_to_nearest)
BOOST_IF_CONSTEXPR(std::numeric_limits<Number>::round_style == std::round_to_nearest)
{
BOOST_CHECK_EQUAL(std::numeric_limits<Number>::round_error(), 0.5);
}
else if (std::numeric_limits<Number>::round_style != std::round_indeterminate)
else BOOST_IF_CONSTEXPR(std::numeric_limits<Number>::round_style != std::round_indeterminate)
{
// Round error is 1.0:
BOOST_CHECK_EQUAL(std::numeric_limits<Number>::round_error(), 1);
Expand All @@ -154,9 +163,9 @@ void test_specific(const std::integral_constant<int, boost::multiprecision::numb
template <class Number>
void test_specific(const std::integral_constant<int, boost::multiprecision::number_kind_integer>&)
{
if (std::numeric_limits<Number>::is_modulo)
BOOST_IF_CONSTEXPR(std::numeric_limits<Number>::is_modulo)
{
if (!std::numeric_limits<Number>::is_signed)
BOOST_IF_CONSTEXPR(!std::numeric_limits<Number>::is_signed)
{
BOOST_TEST(1 + (std::numeric_limits<Number>::max)() == 0);
BOOST_TEST(--Number(0) == (std::numeric_limits<Number>::max)());
Expand Down Expand Up @@ -186,13 +195,13 @@ void test()
std::cout << "numeric_limits values for type " << typeid(Number).name() << std::endl;

PRINT(is_specialized);
if (std::numeric_limits<Number>::is_integer)
BOOST_IF_CONSTEXPR(std::numeric_limits<Number>::is_integer)
{
std::cout << std::hex << std::showbase;
}
std::cout << "max()"
<< " = " << (std::numeric_limits<Number>::max)() << std::endl;
if (std::numeric_limits<Number>::is_integer)
BOOST_IF_CONSTEXPR(std::numeric_limits<Number>::is_integer)
{
std::cout << std::dec;
}
Expand Down