forked from icaven/glm
-
Notifications
You must be signed in to change notification settings - Fork 2.3k
Closed
Description
Feature enhancement request is in reference to the super slow algorithm to compute distances between floats:
https://github.com/g-truc/glm/blob/0.9.5/glm/gtc/ulp.inl
line 280
GLM_FUNC_QUALIFIER uint float_distance(T const & x, T const & y)
The current algorithm is unacceptable for use in any real-time application due to the incremental stepping to subsequent floats and plethora of function calls.
Please refer to the constant time algorithm proposed by Bruce Dawson
http://www.cygnus-software.com/papers/comparingfloats/comparingfloats.htm
// Usable AlmostEqual function
bool AlmostEqual2sComplement(float A, float B, int maxUlps)
{
// Make sure maxUlps is non-negative and small enough that the
// default NAN won't compare as equal to anything.
assert(maxUlps > 0 && maxUlps < 4 * 1024 * 1024);
int aInt = *(int*)&A;
// Make aInt lexicographically ordered as a twos-complement int
if (aInt < 0)
aInt = 0x80000000 - aInt;
// Make bInt lexicographically ordered as a twos-complement int
int bInt = *(int*)&B;
if (bInt < 0)
bInt = 0x80000000 - bInt;
int intDiff = abs(aInt - bInt);
if (intDiff <= maxUlps)
return true;
return false;
}