gpt4 book ai didi

c++ - 在浮点比较中选择 ULP 值

转载 作者:行者123 更新时间:2023-11-30 02:15:25 25 4
gpt4 key购买 nike

我阅读了网络上的一些资源,我了解到在比较 float 时没有单一值或通用参数。我读过 from here几个回复,我从谷歌测试中找到了比较 float 的代码。我想更好地理解 ULP 的含义及其值(value)。阅读我阅读的源代码中的注释:

The maximum error of a single floating-point operation is 0.5 units in the last place. On Intel CPU's, all floating-point calculations are done with 80-bit precision, while double has 64 bits. Therefore, 4 should be enough for ordinary use.

不太清楚为什么“因此 4 应该就足够了”。谁能解释为什么?根据我的理解,我们是说我们可以容忍 4*10^-6 或 4*10^-15 作为我们的数字之间的差异,以说明它们是否相同,同时考虑到 float 的有效位数(6/7) 或双 (15/16)。是否正确?

最佳答案

这是错误的。大错特错。考虑到每个操作都会累积一些误差——½ ULP 是最大值(在舍入到最近的模式下),所以 ¼ 可能是一个平均值。所以 17 次操作足以从平均效果中累积超过 4 ULP 的错误。1今天的计算机每秒执行数十亿次操作。一个程序在它的输入和一些后来的比较之间会做多少次操作?这取决于程序,但对于“普通”使用,它可能是零、数十、数千或数百万。 (假设我们排除了数十亿,因为人类使用起来会变慢,所以我们可以称其为专用软件,而不是普通软件。)

但这还不是全部。假设我们在 1 附近加上几个数字,然后减去恰好在总和附近的一个数字。也许添加的总误差大约为 2 ULP。但是当我们减去时,结果可能在 2−10 左右而不是 1 左右。所以 2−10 的 ULP 比 1 的 ULP 小 1024 倍。那相对于 1 为 2 ULP 的误差相对于减法结果为 2048 ULP。哎呀! 4 ULP 不会切断它。它需要是其他一些数字的 4 ULP,而不是结果的 ULP。

事实上,表征错误通常是困难的,并且是整个研究领域的主题,numerical analysis . 4 不是答案。

脚注

1 错误的方向会有所不同,因此有些会相互抵消。该行为可能被建模为随机游走,平均误差可能与执行的操作数的平方根成正比。

关于c++ - 在浮点比较中选择 ULP 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56154395/

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