To make the problem short let's say I want to compute the expression a / (b - c)
on float
s.
To make sure the result is meaningful, I can check if b
and c
are in equal:
float EPS = std::numeric_limits<float>::epsilon();
if ((b - c) > EPS || (c - b) > EPS)
{
return a / (b - c);
}
but my tests show it is not enough to guarantee either meaningful results nor not failing to provide a result if it is possible.
Case 1:
a = 1.0f;
b = 0.00000003f;
c = 0.00000002f;
Result: The if condition is NOT met, but the expression would produce a correct result 100000008 (as for the floats' precision).
Case 2:
a = 1e33f;
b = 0.000003;
c = 0.000002;
Result: The if condition is met, but the expression produces not a meaningful result +1.#INF00
.
I found it much more reliable to check the result, not the arguments:
const float INF = numeric_limits<float>::infinity();
float x = a / (b - c);
if (-INF < x && x < INF)
{
return x;
}
But what for is the epsilon then and why is everyone saying epsilon is good to use?