gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 14:03:40 26 4
gpt4 key购买 nike

为了简化问题,假设我想计算表达式 a / (b - c)float s。
为了确保结果有意义,我可以检查 bc相等:

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 好用呢?

最佳答案

“在处理浮点数时必须使用 epsilon”是对浮点计算有肤浅理解的程序员的下意识 react ,用于一般比较(不仅是零)。

这通常没有帮助,因为它没有告诉您如何最小化舍入误差的传播,也没有告诉您如何避免取消或吸收问题,甚至当您的问题确实与两个浮点数的比较有关时,它没有告诉您 epsilon 的什么值适合您正在做的事情

如果您还没有阅读 What Every Computer Scientist Should Know About Floating-Point Arithmetic ,这是一个很好的起点。此外,如果您对示例中除法结果的精度感兴趣,则必须估计先前舍入误差使 b-c 产生的不精确程度,因为确实如果 b-c 很小,那么小的绝对误差对应于大结果绝对错误。如果您只关心除法不应该溢出,那么您的测试(对结果)是正确的。没有理由使用浮点数测试空除数,您只需测试结果是否溢出,这会捕获除数为空和除数太小以致结果无法表示的两种情况任何精度。

关于舍入误差的传播,有 specialized analyzers 可以帮你估计,因为手工做是一件很繁琐的事情。

关于floating-point - "epsilon"真的能保证浮点计算中的任何东西吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2729637/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com