41 static_assert( std::is_floating_point_v<realT>,
"isNan requires a floating-point type" );
43 if constexpr( std::numeric_limits<realT>::is_iec559 &&
sizeof( realT ) ==
sizeof( std::uint32_t ) )
45 constexpr std::uint32_t exponentMask = 0x7f800000U;
46 constexpr std::uint32_t mantissaMask = 0x007fffffU;
47 const std::uint32_t bits = std::bit_cast<std::uint32_t>( value );
48 return ( bits & exponentMask ) == exponentMask && ( bits & mantissaMask ) != 0;
50 else if constexpr( std::numeric_limits<realT>::is_iec559 &&
sizeof( realT ) ==
sizeof( std::uint64_t ) )
52 constexpr std::uint64_t exponentMask = 0x7ff0000000000000ULL;
53 constexpr std::uint64_t mantissaMask = 0x000fffffffffffffULL;
54 const std::uint64_t bits = std::bit_cast<std::uint64_t>( value );
55 return ( bits & exponentMask ) == exponentMask && ( bits & mantissaMask ) != 0;
60 return isNan( normalized );
73 static_assert( std::is_floating_point_v<realT>,
"isFinite requires a floating-point type" );
75 if constexpr( std::numeric_limits<realT>::is_iec559 &&
sizeof( realT ) ==
sizeof( std::uint32_t ) )
77 constexpr std::uint32_t exponentMask = 0x7f800000U;
78 return ( std::bit_cast<std::uint32_t>( value ) & exponentMask ) != exponentMask;
80 else if constexpr( std::numeric_limits<realT>::is_iec559 &&
sizeof( realT ) ==
sizeof( std::uint64_t ) )
82 constexpr std::uint64_t exponentMask = 0x7ff0000000000000ULL;
83 return ( std::bit_cast<std::uint64_t>( value ) & exponentMask ) != exponentMask;