相关疑难解决方法(0)

"epsilon"真的能保证浮点计算中的任何东西吗?

为了简化问题,我想说我想a / (b - c)floats 上计算表达式.

为了确保结果是有意义的,我可以检查bc是相等的:

float EPS = std::numeric_limits<float>::epsilon();
if ((b - c) > EPS || (c - b) > EPS)
{
    return a / (b - c);
}
Run Code Online (Sandbox Code Playgroud)

但是我的测试表明,如果可能的话,不能保证有意义的结果,也不能不提供结果.

情况1:

a = 1.0f;
b = 0.00000003f;
c = 0.00000002f;
Run Code Online (Sandbox Code Playgroud)

结果:不满足if条件,但表达式将生成正确的结果100000008(与浮点数的精度相同).

案例2:

a = 1e33f;
b = 0.000003;
c = 0.000002;
Run Code Online (Sandbox Code Playgroud)

结果:满足if条件,但表达式不会产生有意义的结果+1.#INF00.

我发现检查结果更可靠,而不是参数:

const float INF = numeric_limits<float>::infinity();
float x = a / (b - c); …
Run Code Online (Sandbox Code Playgroud)

floating-point floating-accuracy epsilon

17
推荐指数
1
解决办法
9372
查看次数