// Copyright 2023 Matt Borland // Distributed under the Boost Software License, Version 1.0. // https://www.boost.org/LICENSE_1_0.txt #ifndef BOOST_DECIMAL_DETAIL_CMATH_ILOGB_HPP #define BOOST_DECIMAL_DETAIL_CMATH_ILOGB_HPP #include // NOLINT(llvm-include-order) #include #include #include #ifndef BOOST_DECIMAL_BUILD_MODULE #include #include #endif namespace boost { namespace decimal { BOOST_DECIMAL_EXPORT template constexpr auto ilogb(const T d) noexcept BOOST_DECIMAL_REQUIRES_RETURN(detail::is_decimal_floating_point_v, T, int) { const auto fpc = fpclassify(d); int result { }; if (fpc == FP_ZERO) { result = FP_ILOGB0; } #ifndef BOOST_DECIMAL_FAST_MATH else if (fpc == FP_INFINITE) { result = INT_MAX; } else if (fpc == FP_NAN) { result = FP_ILOGBNAN; } #endif else { const auto offset = detail::num_digits(d.full_significand()) - 1; result = static_cast(static_cast(d.unbiased_exponent()) + offset); } return result; } } // namespace decimal } // namespace boost #endif // BOOST_DECIMAL_DETAIL_CMATH_ILOGB_HPP