### Robust epsilons in Floating Point

*Michael Herf*

April 5, 2000

back
I see people doing epsilon tests all the time by adding a constant:

#define EPSILON 0.000001
#define CLOSE(x, y) (fabs(x - y) < EPSILON)

or something along those lines. Well, if you think about floating point for awhile,
you'll realize that this isn't a good solution. Why? Because floating point isn't
exact. The difference above could easily evaluate to zero; basically, you can't
pick one epsilon for the whole range of floating point numbers.
But there's a very simple solution. Do the work on the integer side!

Here's the solution just for the single-precision case.

#define EPSILON 2
#define CLOSE(x, y) (abs((unsigned&)x - (unsigned&)y) < EPSILON)

Similarly, you can do a bias:

#define EPSILON 2
#define BIAS(x) ((float&)((unsigned&)x + EPSILON))

And, for your reference, on MSVC, don't implement your own fabs or abs EVER. They're
intrinsics, they compile to one assembly instruction without a branch,
and so that's a bad idea.