浮点运算中的flush-to-zero行为

时间:2010-01-18 02:14:08

标签: c embedded floating-point ieee-754

虽然,据我记得,IEEE 754没有提及刷新到零模式来更快地处理denormalized numbers,但有些架构提供了这种模式(例如http://docs.sun.com/source/806-3568/ncg_lib.html)。

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

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

在这方面,我的问题有两个:

  1. 在嵌入式架构中,架构是否只提供从零到零?他们可能没有权利将自己宣传为“IEEE 754”,但可以提供足够接近IEEE 754风格的浮点运算。

  2. 对于在嵌入式环境中提供两者的体系结构,可能被系统激活的为零,以便使反应时间更可预测(这些嵌入式系统的常见约束)?

  3. 在我用于浮点值的区间运算中处理flush-to-zero非常简单,如果我知道我必须这样做,我的问题就是我是否必须这样做。

2 个答案:

答案 0 :(得分:8)

对这两个问题都是肯定的。有些平台只支持flush-to-zero,并且有许多平台默认为flush-to-zero。

您还应该意识到许多嵌入式和dsp平台使用“Denormals Are Zero”模式,这是浮点语义中的另一个问题。


修改 FTZ与DAZ的进一步说明:

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

在DAZ中,当操作的输入是非常规时,在其位置替换零。同样,没有关于哪个零将被替换的一般保证。

某些支持这些模式的实现允许它们独立设置(有些只支持两者中的一个),因此您可能需要独立模拟任一模式以及一起模式。

另请注意,某些实现将这两种模式组合为“Flush to Zero”。例如,ARM VFP“刷新到零”模式是FTZ和DAZ。

答案 1 :(得分:2)

ARM Cortex内核有一个齐平为零的选项,很难看出你如何忽略它。再说一遍,不要从论坛上获取商业建议。与您的客户交谈。