Skip to content

glm::float_distance algorithm run-time not acceptable #121

@dustin-biser

Description

@dustin-biser

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;
}

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

Relationships

None yet

Development

No branches or pull requests

Issue actions