【问题标题】:Select ULP value in float comparison在浮点比较中选择 ULP 值
【发布时间】:2019-05-15 17:05:03
【问题描述】:

我已经阅读了网络上的多个资源,并且我知道在比较浮点数时没有单一值或通用参数。我已经阅读了from here 的几个回复,并从 Google 测试中找到了用于比较浮点数的代码。我想更好地理解 ULP 的含义及其价值。从我阅读的源代码中读取cmets:

单次浮点运算的最大误差为 0.5 个单位 最后一个地方。在 Intel CPU 上,所有浮点计算都是 以 80 位精度完成,而 double 具有 64 位。因此,4 日常使用应该够用了。

目前还不清楚为什么“因此 4 就足够了”。谁能解释为什么?据我了解,考虑到浮点数的有效位数(6 /7) 或双 (15/16)。对吗?

【问题讨论】:

  • 更多阅读(如果您有兴趣 - 不是我的博客):randomascii.wordpress.com/2013/02/07/… 整个系列内容非常丰富。
  • 要清楚,这不是“我们的数字之间的差异”,而是 relative “我们的数字之间的差异” - 相对于操作数/结果的大小。它可能会变得复杂。

标签: c++ floating-point


【解决方案1】:

这是错误的。非常错误。考虑到每个操作都会累积一些错误——½ 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 错误的方向会有所不同,因此有些会抵消。该行为可以建模为随机游走,平均误差可能与执行的操作数的平方根成正比。

【讨论】:

  • 您确定要排除数十亿吗?许多工程和科学应用解决了几千个方程组。
  • @PatriciaShanahan:我只是对什么是“普通”持保守态度,将其限制在人类交互使用的应用程序中,以表明 4 太低,即使对于保守的含义。跨度>
猜你喜欢
  • 2018-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多