// Distributed under the Boost Software License Version 1.0 https://www.boost.org/LICENSE_1_0.txt // Copyright Gero Peterhoff #ifndef BOOST_MATH_CCMATH_SIGNBIT_HPP #define BOOST_MATH_CCMATH_SIGNBIT_HPP #include #include #include #include #include #include namespace boost::math::ccmath { namespace detail { template inline constexpr bool signbit_impl(const T arg) noexcept { if constexpr (boost::is_float128_v) { const auto bits = BOOST_MATH_BIT_CAST(float128_bits, arg); return bits.sign; } else if constexpr (boost::is_float80_v) { if constexpr (sizeof(T) == 16) { const auto bits = BOOST_MATH_BIT_CAST(float80_bits_128, arg); return bits.sign; } else if constexpr (sizeof(T) == 12) { const auto bits = BOOST_MATH_BIT_CAST(float80_bits_96, arg); return bits.sign; } else if constexpr (sizeof(T) == 10) { const auto bits = BOOST_MATH_BIT_CAST(float80_bits_80, arg); return bits.sign; } else { static_assert(boost::dependent_false_v, "signbit is not supported with this type or platform"); return false; } } else if constexpr (boost::is_float64_v) { const auto bits = BOOST_MATH_BIT_CAST(float64_bits, arg); return bits.sign; } else if constexpr (boost::is_float32_v) { const auto bits = BOOST_MATH_BIT_CAST(float32_bits, arg); return bits.sign; } else if constexpr (boost::is_float16_v) { const auto bits = BOOST_MATH_BIT_CAST(float16_bits, arg); return bits.sign; } else if constexpr (boost::is_bfloat16_v) { const auto bits = BOOST_MATH_BIT_CAST(bfloat16_bits, arg); return bits.sign; } else { static_assert(boost::dependent_false_v, "signbit is not supported with this type or platform"); return false; } } } // detail template constexpr bool signbit(const T x) noexcept { BOOST_IF_CONSTEXPR (std::is_arithmetic_v) { if (BOOST_MATH_IS_CONSTANT_EVALUATED(x)) { BOOST_IF_CONSTEXPR (std::is_integral_v) { return x < T(0); } else { return detail::signbit_impl(x); } } else { return std::signbit(x); } } else { static_assert(boost::dependent_false_v, "signbit is not supported with this type or platform"); return 0; } } } // boost::math::ccmath #endif // BOOST_MATH_CCMATH_SIGNBIT_HPP