2

最近我对IEEE754标准下溢的定义感到困惑。我们知道,如果一个实现不支持次正规数,那么可以表示的最小数是 MinNorm = 1.0 * 2^-126。对于任何操作,如果其结果小于 MinNorm,将被视为下溢。但是如果一个实现支持次正规数,那么可以表示的最小数是 MinSubnorm = 1.0 * 2^-149。现在的问题是:如果运算的结果小于 MinNorm,它是否是下溢?小于 MinSubnorm 怎么样?

现在我正在实现一个支持次正常数的 FPU。我们假设舍入前的结果严格在 -MinNorm 和 +MinNorm 之间,并且在舍入后也会小于 MinNorm(可以用次正规数表示)。我会认为它是什么?下溢还是非下溢?如果我需要设置下溢的状态位?

我在网上找到了一些信息,但意见分歧如下:

  1. http://www.cs.umd.edu/class/sum2003/cmsc311/Notes/Data/underflow.html 当您执行的操作小于最小非零数时,就会发生下溢。在 IEEE 754 单精度中,这意味着一个值(即绝对值)小于 1.0 x 2-149。

  2. http://en.wikipedia.org/wiki/Arithmetic_underflow 当浮点运算的真实结果在幅度上小于可表示为正常浮点数的最小值时(即接近零),可能会发生算术下溢。目标数据类型

4

2 回答 2

1

IEEE754 2008 标准(第 7.5 节)定义了下溢异常应在结果为

  1. 非零,并且
  2. 严格在 -MinNorm 和 +MinNorm 之间:它由实现来决定这是在舍入之前还是之后,因此您可以将值刚好低于 minNorm 进行四舍五入并且不会发出异常信号。

所以在这种情况下,维基百科是正确的。

更新:默认规则是您设置状态位,除非结果是准确的。例如,如果通过加法或减法获得次正规结果,则不需要进行舍入,因此您不会设置下溢状态位。另一方面,如果您有一个数字1.0001并将其乘以2^-149,则结果无法准确表示,并将四舍五入为2^-149,因此您将设置下溢和不精确状态位。

于 2014-12-12T12:12:28.127 回答
0

IEEE 754 支持逐渐下溢。它从一个数字小于最小的正常浮点数开始,如您的第二个引号所述,并以总下溢为零结束,如您的第一个引号所述。

于 2014-12-12T09:23:20.373 回答