2023-07-13 00:06:56 +02:00
|
|
|
#ifndef MATHLIB_FBITS_H
|
|
|
|
#define MATHLIB_FBITS_H
|
|
|
|
//=============================================================================//
|
|
|
|
//
|
|
|
|
// Purpose: look for NANs, infinities, and underflows.
|
|
|
|
//
|
|
|
|
//=============================================================================//
|
2022-01-09 16:14:17 +01:00
|
|
|
|
2023-07-13 00:06:56 +02:00
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
// This follows the ANSI/IEEE 754-1985 standard
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
inline unsigned long& FloatBits(float& f)
|
|
|
|
{
|
|
|
|
return *reinterpret_cast<unsigned long*>(&f);
|
|
|
|
}
|
2022-01-09 16:14:17 +01:00
|
|
|
|
2023-07-13 00:06:56 +02:00
|
|
|
inline unsigned long const& FloatBits(float const& f)
|
|
|
|
{
|
|
|
|
return *reinterpret_cast<unsigned long const*>(&f);
|
|
|
|
}
|
|
|
|
|
|
|
|
inline float BitsToFloat(unsigned long i)
|
|
|
|
{
|
|
|
|
return *reinterpret_cast<float*>(&i);
|
|
|
|
}
|
|
|
|
|
|
|
|
inline bool IsFinite(float f)
|
|
|
|
{
|
|
|
|
return ((FloatBits(f) & 0x7F800000) != 0x7F800000);
|
|
|
|
}
|
|
|
|
|
|
|
|
inline unsigned long FloatAbsBits(float f)
|
|
|
|
{
|
|
|
|
return FloatBits(f) & 0x7FFFFFFF;
|
|
|
|
}
|
|
|
|
|
|
|
|
inline float FloatMakePositive(float f)
|
|
|
|
{
|
|
|
|
return fabsf(f); // was since 2002: BitsToFloat( FloatBits(f) & 0x7FFFFFFF ); fixed in 2010
|
|
|
|
}
|
|
|
|
|
|
|
|
inline float FloatNegate(float f)
|
|
|
|
{
|
|
|
|
return -f; //BitsToFloat( FloatBits(f) ^ 0x80000000 );
|
|
|
|
}
|
|
|
|
|
|
|
|
#define FLOAT32_NAN_BITS (unsigned int)0x7FC00000 // NaN!
|
2022-01-09 16:14:17 +01:00
|
|
|
#define FLOAT32_NAN BitsToFloat( FLOAT32_NAN_BITS )
|
2022-07-06 21:11:32 +02:00
|
|
|
|
|
|
|
#define VEC_T_NAN FLOAT32_NAN
|
2023-07-13 00:06:56 +02:00
|
|
|
|
|
|
|
#endif // MATHLIB_FBITS_H
|