/////////////////////////////////////////////////////////////////////////////// // Copyright 2023 John Maddock. Distributed under the Boost // Software License, Version 1.0. (See accompanying file // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) #include #include #include "test.hpp" template void test(F f, bool big) { Float f2(f); if (big) { F tol = f * static_cast(std::numeric_limits::epsilon()); F max = static_cast((std::numeric_limits::max)()); F diff = static_cast(f2) - f; if (diff < 0) diff = -diff; if (f > max) { BOOST_CHECK(isinf(f2) || (diff < tol)); } else { BOOST_CHECK_LE(diff, tol); } } else { BOOST_CHECK_EQUAL(static_cast(f2), f); } } template void test() { std::int64_t i = static_cast(1) << (std::numeric_limits::max_exponent + 1); Float f(i); BOOST_CHECK_EQUAL(f, std::numeric_limits::infinity()); if (std::numeric_limits::max_exponent < std::numeric_limits::digits) { BOOST_CHECK_EQUAL(Float(static_cast(i)), std::numeric_limits::infinity()); } if (std::numeric_limits::max_exponent < std::numeric_limits::digits) { BOOST_CHECK_EQUAL(Float(static_cast(i)), std::numeric_limits::infinity()); } if (std::numeric_limits::max_exponent < std::numeric_limits::digits) { BOOST_CHECK_EQUAL(Float(static_cast(i)), std::numeric_limits::infinity()); } #ifdef BOOST_HAS_FLOAT128 if (std::numeric_limits::max_exponent < std::numeric_limits<__float128>::digits) { BOOST_CHECK_EQUAL(Float(static_cast<__float128>(i)), std::numeric_limits::infinity()); } #endif --i; while (i) { Float f2(i); BOOST_CHECK_NE(f2, std::numeric_limits::infinity()); bool big = boost::multiprecision::msb(i) >= std::numeric_limits::digits; if (big) { BOOST_CHECK_LE(static_cast(f2), i); } else { BOOST_CHECK_EQUAL(static_cast(f2), i); } if (std::numeric_limits::max_exponent < std::numeric_limits::digits) { test(static_cast(i), big); for (int exp = -1; exp >= std::numeric_limits::min_exponent; --exp) test(std::ldexp(static_cast(i), exp), big); } if (std::numeric_limits::max_exponent < std::numeric_limits::digits) { test(static_cast(i), big); for (int exp = -1; exp >= std::numeric_limits::min_exponent; --exp) test(std::ldexp(static_cast(i), exp), big); } if (std::numeric_limits::max_exponent < std::numeric_limits::digits) { test(static_cast(i), big); for (int exp = -1; exp >= std::numeric_limits::min_exponent; --exp) test(std::ldexp(static_cast(i), exp), big); } #ifdef BOOST_HAS_FLOAT128 if (std::numeric_limits::max_exponent < std::numeric_limits<__float128>::digits) { test(static_cast<__float128>(i), big); for (int exp = -1; exp >= std::numeric_limits::min_exponent; --exp) test(ldexpq(static_cast<__float128>(i), exp), big); } #endif --i; } } int main() { using namespace boost::multiprecision; typedef number, et_off> float16_t; //typedef number, et_off> bfloat16_t; test(); //test(); return boost::report_errors(); }