, , . , , iee754 4 floats 8 doubles 2 (int32_t 4 int64_t 8 ).
, ( UB), memcpy .
, , , , UB , , double → int32_t. , , float min/max , .
, INT_MIN/INT_MAX ( ) , , .
Inf/NaN UB .
static const uint32_t FloatbitsMaxFitInt64 = 0x5effffff;
static const uint32_t FloatbitsMinNofitInt64 = 0x5f000000;
static const uint32_t FloatbitsMinFitInt64 = 0xdf000000;
static const uint32_t FloatbitsMaxNotfitInt64 = 0xdf000001;
static const uint32_t FloatbitsMaxFitInt32 = 0x4effffff;
static const uint32_t FloatbitsMinNofitInt32 = 0x4f000000;
static const uint32_t FloatbitsMinFitInt32 = 0xcf000000;
static const uint32_t FloatbitsMaxNotfitInt32 = 0xcf000001;
static const uint64_t DoubleBitsMaxFitInt64 = 0x43dfffffffffffff;
static const uint64_t DoubleBitsMinNofitInt64 = 0x43e0000000000000;
static const uint64_t DoubleBitsMinFitInt64 = 0xc3e0000000000000;
static const uint64_t DoubleBitsMaxNotfitInt64 = 0xc3e0000000000001;
static const uint64_t DoubleBitsMaxTruncFitInt32 = 0x41dfffffffffffff;
static const uint64_t DoubleBitsMinTruncNofitInt32 = 0x41e0000000000000;
static const uint64_t DoubleBitsMinTruncFitInt32 = 0xc1e00000001fffff;
static const uint64_t DoubleBitsMaxTruncNofitInt32 = 0xc1e0000000200000;
static const uint64_t DoubleBitsMaxRoundFitInt32 = 0x41dfffffffdfffff;
static const uint64_t DoubleBitsMinRoundNofitInt32 = 0x41dfffffffe00000;
static const uint64_t DoubleBitsMinRoundFitInt32 = 0xc1e0000000100000;
static const uint64_t DoubleBitsMaxRoundNofitInt32 = 0xc1e0000000100001;
, :
if( f >= B2F(FloatbitsMinFitInt32) && f <= B2F(FloatbitsMaxFitInt32))
// cast is valid.
B2F - :
float B2F(uint32_t bits)
{
static_assert(sizeof(float) == sizeof(uint32_t), "Weird arch");
float f;
memcpy(&f, &bits, sizeof(float));
return f;
}
, nans/inf ( ), non-iee754 (, ffast-math on gcc /fp: fast on msvc)