4 #ifndef _FLOATCOMPARISON_H
5 #define _FLOATCOMPARISON_H
7 #include <SDL_stdinc.h>
55 return (x < T(0)) ? (-x) : x;
61 return (y > x) ? y : x;
83 return ((bits & ~top) > ebits);
91 return ((bits & ebits) != ebits);
102 return std::isfinite(x);
109 #pragma GCC diagnostic push
110 #pragma GCC diagnostic ignored "-Wfloat-equal"
121 inline bool is_nan(
float x) {
return (x != x); }
122 inline bool is_nan(
double x) {
return (x != x); }
124 #pragma GCC diagnostic pop
129 template <
typename T>
135 template <
typename T>
141 template <
typename T>
147 template <
typename T>
153 template <
typename T>
161 template <
typename T>
173 return (bfi.i - afi.i);
177 template <
typename T>
187 if ((!is_finite_bits<T>(afi.ui) && is_finite_bits<T>(bfi.ui)) || (is_finite_bits<T>(afi.ui) && !is_finite_bits<T>(bfi.ui)))
191 if (is_nan_bits<T>(afi.ui) || is_nan_bits<T>(bfi.ui))
198 int_type difference = (bfi.i - afi.i);
199 difference = (difference < int_type(0)) ? -difference : difference;
200 return (difference <= max_ulps);
205 template <
typename T>
223 static const uint_type ExponentBits = (~static_cast<uint_type>(0) << std::numeric_limits<double>::digits) & ~TopBit;
224 static const uint_type MantissaBits = ~TopBit & ~ExponentBits;
249 static const uint_type ExponentBits = (~
uint_type(0) << std::numeric_limits<float>::digits) & ~TopBit;
250 static const uint_type MantissaBits = ~TopBit & ~ExponentBits;
IEEEFloatTraits< T >::int_type float_ulp_difference(T a, T b)
Definition: FloatComparison.h:162
IEEEFloatTraits< T >::bool_type is_finite_bits(const typename IEEEFloatTraits< T >::uint_type &bits)
Definition: FloatComparison.h:87
bool is_zero_exact(float x)
Definition: FloatComparison.h:118
IEEEFloatTraits< T >::bool_type is_equal_ulps(T a, T b, typename IEEEFloatTraits< T >::int_type max_ulps=IEEEFloatTraits< T >::DefaultUlpTolerance)
Definition: FloatComparison.h:178
IEEEFloatTraits< T >::bool_type is_equal_general(T a, T b, T rel_tol, T abs_tol)
Definition: FloatComparison.h:142
IEEEFloatTraits< T >::bool_type is_nan_bits(const typename IEEEFloatTraits< T >::uint_type &bits)
Definition: FloatComparison.h:73
IEEEFloatTraits< T >::bool_type is_equal_absolute(T a, T b, T tol=IEEEFloatTraits< T >::DefaultAbsTolerance())
Definition: FloatComparison.h:136
IEEEFloatTraits< T >::float_type float_max(T x, T y)
Definition: FloatComparison.h:59
IEEEFloatTraits< T >::float_type float_abs(T x)
Definition: FloatComparison.h:53
IEEEFloatTraits< T >::bool_type is_equal_relative(T a, T b, T tol=IEEEFloatTraits< T >::DefaultRelTolerance())
Definition: FloatComparison.h:130
IEEEFloatTraits< T >::bool_type is_finite(T x)
Definition: FloatComparison.h:97
IEEEFloatTraits< T >::bool_type is_zero_general(T x, T tol=IEEEFloatTraits< T >::DefaultRelTolerance())
Definition: FloatComparison.h:154
bool is_equal_exact(float a, float b)
Definition: FloatComparison.h:112
bool is_nan(float x)
Definition: FloatComparison.h:121
bool bool_type
Definition: FloatComparison.h:211
uint64_t uint_type
Definition: FloatComparison.h:214
static double DefaultRelTolerance()
Definition: FloatComparison.h:229
int64_t int_type
Definition: FloatComparison.h:213
double float_type
Definition: FloatComparison.h:210
static double DefaultTolerance()
Definition: FloatComparison.h:230
static double SmallestNormalisedValue()
Definition: FloatComparison.h:231
static double DefaultAbsTolerance()
Definition: FloatComparison.h:228
static float DefaultAbsTolerance()
Definition: FloatComparison.h:254
static float DefaultTolerance()
Definition: FloatComparison.h:256
int32_t int_type
Definition: FloatComparison.h:239
float float_type
Definition: FloatComparison.h:236
bool bool_type
Definition: FloatComparison.h:237
static float DefaultRelTolerance()
Definition: FloatComparison.h:255
uint32_t uint_type
Definition: FloatComparison.h:240
static float SmallestNormalisedValue()
Definition: FloatComparison.h:257
Definition: FloatComparison.h:206
int_type i
Definition: FloatComparison.h:219
uint_type ui
Definition: FloatComparison.h:218
double f
Definition: FloatComparison.h:217
int_type i
Definition: FloatComparison.h:245
uint_type ui
Definition: FloatComparison.h:244
float f
Definition: FloatComparison.h:243