// Distributed under the Boost Software License Version 1.0 https://www.boost.org/LICENSE_1_0.txt // Copyright Gero Peterhoff #ifndef BOOST_MATH_CCMATH_BITS_HPP #define BOOST_MATH_CCMATH_BITS_HPP #include #include #include #if !defined(BOOST_NO_CXX20_HDR_BIT) #include #if (__cpp_lib_bit_cast >= 201806L) #define BOOST_MATH_BIT_CAST(T, x) std::bit_cast(x) #endif #elif defined(__has_include) #if __has_include() #include #if (__cpp_lib_bit_cast >= 201806L) #define BOOST_MATH_BIT_CAST(T, x) std::bit_cast(x) #endif #endif #elif defined(__has_builtin) #if __has_builtin(__builtin_bit_cast) #define BOOST_MATH_BIT_CAST(T, x) __builtin_bit_cast(T, x) #endif #endif namespace boost { namespace math { namespace ccmath { namespace detail { #pragma pack(push, 1) struct float128_bits { #if BOOST_MATH_ENDIAN_LITTLE_BYTE std::uint64_t mantissa_l: 64; std::uint64_t mantissa_h: 48; std::uint64_t exponent : 15; std::uint64_t sign : 1; #else // big endian std::uint64_t sign : 1; std::uint64_t exponent : 15; std::uint64_t mantissa_h: 48; std::uint64_t mantissa_l: 64; #endif }; struct float80_bits_128 { #if BOOST_MATH_ENDIAN_LITTLE_BYTE std::uint64_t mantissa : 64; std::uint64_t exponent : 15; std::uint64_t sign : 1; std::uint64_t padding : 48; #else // big endian std::uint64_t padding : 48; std::uint64_t sign : 1; std::uint64_t exponent : 15; std::uint64_t mantissa : 64; #endif }; struct float80_bits_96 { #if BOOST_MATH_ENDIAN_LITTLE_BYTE std::uint64_t mantissa : 64; std::uint32_t exponent : 15; std::uint32_t sign : 1; std::uint32_t padding : 16; #else // big endian std::uint32_t padding : 16; std::uint32_t sign : 1; std::uint32_t exponent : 15; std::uint64_t mantissa : 64; #endif }; struct float80_bits_80 { #if BOOST_MATH_ENDIAN_LITTLE_BYTE std::uint64_t mantissa : 64; std::uint16_t exponent : 15; std::uint16_t sign : 1; #else // big endian std::uint16_t sign : 1; std::uint16_t exponent : 15; std::uint64_t mantissa : 64; #endif }; struct float64_bits { #if BOOST_MATH_ENDIAN_LITTLE_BYTE std::uint64_t mantissa : 52; std::uint64_t exponent : 11; std::uint64_t sign : 1; #else // big endian std::uint64_t sign : 1; std::uint64_t exponent : 11; std::uint64_t mantissa : 52; #endif }; struct float32_bits { #if BOOST_MATH_ENDIAN_LITTLE_BYTE std::uint32_t mantissa : 23; std::uint32_t exponent : 8; std::uint32_t sign : 1; #else // big endian std::uint32_t sign : 1; std::uint32_t exponent : 8; std::uint32_t mantissa : 23; #endif }; struct float16_bits { #if BOOST_MATH_ENDIAN_LITTLE_BYTE std::uint16_t mantissa : 10; std::uint16_t exponent : 5; std::uint16_t sign : 1; #else // big endian std::uint16_t sign : 1; std::uint16_t exponent : 5; std::uint16_t mantissa : 10; #endif }; struct bfloat16_bits { #if BOOST_MATH_ENDIAN_LITTLE_BYTE std::uint16_t mantissa : 7; std::uint16_t exponent : 8; std::uint16_t sign : 1; #else // big endian std::uint16_t sign : 1; std::uint16_t exponent : 8; std::uint16_t mantissa : 7; #endif }; #pragma pack(pop) } // detail } // ccmath } // math } // boost #endif // BOOST_MATH_CCMATH_BITS_HPP