为了使问题简短,假设我想计算sa / (b - c)
上的表达式float
。
为了确保结果有意义,我可以检查是否b
相等c
:
float EPS = std::numeric_limits<float>::epsilon();
if ((b - c) > EPS || (c - b) > EPS)
{
return a / (b - c);
}
但我的测试表明,如果可能的话,仅仅保证有意义的结果或不提供结果是不够的。
情况1:
a = 1.0f;
b = 0.00000003f;
c = 0.00000002f;
结果:不满足 if 条件,但表达式会产生正确的结果 100000008(至于浮点数的精度)。
案例二:
a = 1e33f;
b = 0.000003;
c = 0.000002;
结果:满足 if 条件,但表达式产生的结果没有意义+1.#INF00
。
我发现检查结果而不是参数更可靠:
const float INF = numeric_limits<float>::infinity();
float x = a / (b - c);
if (-INF < x && x < INF)
{
return x;
}
但是 epsilon 是为了什么,为什么每个人都说 epsilon 好用呢?