// 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_LOGB_HPP #define BOOST_DECIMAL_DETAIL_CMATH_LOGB_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 logb(const T num) noexcept BOOST_DECIMAL_REQUIRES(detail::is_decimal_floating_point_v, T) { const auto fpc {fpclassify(num)}; #ifndef BOOST_DECIMAL_FAST_MATH if (fpc == FP_ZERO) { return -std::numeric_limits::infinity(); } else if (fpc == FP_INFINITE) { return std::numeric_limits::infinity(); } else if (fpc == FP_NAN) { return num; } #else if (fpc == FP_ZERO) { return T{0}; } #endif const auto offset = detail::num_digits(num.full_significand()) - 1; const auto expval = static_cast(static_cast(num.unbiased_exponent()) + offset); return static_cast(expval); } } //namespace decimal } //namespace boost #endif //BOOST_DECIMAL_DETAIL_CMATH_LOGB_HPP