User Tools

Site Tools


Floating-point number comparison

Floating-point numbers are almost always stored inaccurately in computers' memory. This is because of the IEEE-754 standard that is used to store the number.

For example, that means 0.2 + 0.1 is not equal to 0.3; rather it is equal to 0.30000000000000004. Since computers are exact in comparison by default, you can see how you can run into issues with this.

Impulse, therefore, offers two methods of float comparison by default. The default option is a combination of both the absolute and relative methods of epsilon comparison. 1) The second option is simply the computer's default “==” operator. It is not recommended, but it is marginally faster.

Which method the engine uses can be changed in the source code in the IPCommon.h file.

The absolute method

The absolute method takes the absolute value of x - y, then checks if they are less than or equal to the FLT_EPSILON preprocessor definition. 2)

The absolute method will work, but it does not work on large values.

The relative method

The relative method takes the absolute method, but multiplies the epsilon by x or y, depending on which is larger.

The drawback to this method is that it does not work on small values.

The combined method

Considering the strengths and drawbacks of the two methods above, you can combine the two to overcome these limitations.

The combined method takes the relative method, but multiplies the epsilon by the largest absolute number out of a set of 1, x, or y. Very similar to the relative method.

This method gives us good results, but it is not without its drawbacks since it uses the same epsilon for the relative and the absolute tolerance.

For further reading, please check out Christer Erison's research on this topic.

FLT_EPSILON is defined as 1.192092896e-07F
floating_point_comparison.txt · Last modified: 2022/04/29 23:54 by max