Comparing two floating point number by something like a_float == b_float
is looking for trouble since a_float / 3.0 * 3.0
might not be equal to a_float
due to round off error.
What one normally does is something like fabs(a_float - b_float) < tol
.
How does one calculate tol
?
Ideally tolerance should be just larger than the value of one or two of the least significant figures. So if the single precision floating point number is use tol = 10E-6
should be about right. However this does not work well for the general case where a_float
might be very small or might be very large.
How does one calculate tol
correctly for all general cases? I am interested in C or C++ cases specifically.
This blogpost contains an example, fairly foolproof implementation, and detailed theory behind it http://randomascii.wordpress.com/2012/02/25/comparing-floating-point-numbers-2012-edition/ it is also one of a series, so you can always read more. In short: use ULP for most numbers, use epsilon for numbers near zero, but there are still caveats. If you want to be sure about your floating point math i recommend reading whole series.