【问题标题】:flush-to-zero behavior in floating-point arithmetic浮点运算中的清零行为
【发布时间】:2011-01-06 05:08:33
【问题描述】:

据我所知,尽管 IEEE 754 没有提及更快地处理denormalized numbers 的清零模式,但某些架构提供了这种模式(例如http://docs.sun.com/source/806-3568/ncg_lib.html)。

在本技术文档的特定情况下,非规范化数字的标准处理是默认设置,并且必须明确激活清零。在默认模式下,非规范化的数字也是在软件中处理的,速度较慢。

我致力于嵌入式 C 的静态分析器,它试图预测运行时可能发生的值的正确(如果有时不精确)范围。它旨在正确,因为它旨在用于排除在运行时出错的可能性(例如对于关键的嵌入式代码)。这需要在分析过程中捕获所有可能的行为,因此需要在浮点计算期间捕获所有可能的值。

在这种情况下,我的问题是双重的:

  1. 在嵌入式架构中,是否有仅提供清零的架构?他们也许不必将自己宣传为“IEEE 754”,但可以提供足够接近的 IEEE 754 风格的浮点运算。

  2. 对于同时提供这两者的架构,在嵌入式环境中,系统不太可能会激活清零,以使反应时间更可预测(这些嵌入式系统的常见约束)?

在我用于浮点值的区间算术中处理清零很简单,如果我知道我必须这样做,我的问题是我是否必须这样做。

【问题讨论】:

  • 好问题,说得好。我不是嵌入式系统方面的专家,但我怀疑没有明确的答案。这完全取决于您特定的最终用户环境。

标签: c embedded floating-point ieee-754


【解决方案1】:

两个问题都是。有平台只支持清零,还有很多平台默认清零。

您还应该知道,许多嵌入式和 dsp 平台使用“非正规为零”模式,这是浮点语义中的另一个问题。


编辑进一步解释 FTZ 与 DAZ:

在 FTZ 中,当操作在通常的算术下会产生非正规结果时,会改为返回零。请注意,某些实现始终刷新为正零,而其他实现可能刷新为正零或负零。最好不要依赖任何一种行为。

在 DAZ 中,当运算的输入是非正规输入时,将用零代替它。同样,对于将替换哪个零,没有一般保证。

支持这些模式的一些实现允许独立设置它们(有些只支持这两种模式中的一种),因此您可能需要能够独立地建模任何一种模式,也可以同时建模。

另请注意,某些实现将这两种模式组合成“清零”。例如,ARM VFP“清零”模式是 FTZ 和 DAZ。

【讨论】:

  • 今天我实现了区间算术,它立即涵盖了 FTZ、DAZ(刷新到 +0 或同符号零)和 IEEE 754 次正规的所有可能性。我们的回归测试都没有显示出与之前的仅 IEEE 754 算法相比有任何差异。所以可能没有必要用这个选项来打扰用户,新模式应该让每个人都开心。这是一件非常好的事情。再次感谢!
  • 执行浮点数学运算的实用性是什么,以便表示小于最小标准化值的任何尾数位都会被四舍五入?我认为这可能比处理非规范化值便宜,因为所有浮点数都具有相同的表示形式。只有“最终清理”阶段需要改变。
  • @supercat:我不是硬件设计师,但我不认为该方案实际上会在实践中节省很多复杂性(而且它会导致更多的损失精度高于冲洗)。
  • @StephenCanon:刷新为零的问题并不在于精确度,而是在 x+(y-x) 不比 x 更接近 y 时出现的逻辑问题。将数字四舍五入以便表示它们的差异可以避免此类问题。
  • @supercat:绝对正确,但我认为在硬件中实现实际上并不比渐进下溢便宜得多,渐进下溢具有相同的属性和更高的精度。然而,正如我所指出的,我不是硬件设计师。
【解决方案2】:

ARM Cortex 内核有一个清零选项,很难看出你可以忽略它。再说一次,不要从论坛中获取商业建议。与您的客户交谈。

【讨论】:

  • 现有用户很棒,他们使用健全的平台,了解浮点问题,并且他们竭尽全力通过编译器停用 fmadd 的静默生成,以使舍入错误更可预测.这是我感兴趣的潜在用户。感谢您的反馈。
猜你喜欢
  • 2017-08-13
  • 2015-11-02
  • 2016-08-23
  • 2018-06-23
  • 2018-11-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多