Floating point 如何为支持低于正常数字的实现(IEEE754)定义下溢?

Floating point 如何为支持低于正常数字的实现(IEEE754)定义下溢?,floating-point,ieee-754,underflow,Floating Point,Ieee 754,Underflow,最近我对IEEE754标准的下溢定义感到困惑。我们知道,如果一个实现不支持次正常数,那么可以表示的最小数是MinNorm=1.0*2^-126。对于任何操作,如果其结果小于MinNorm,将被视为底流。但是,如果一个实现支持次正常数,那么可以表示的最小数是MinSubnorm=1.0*2^-149。现在的问题是:如果一个操作的结果小于MinNorm,那么它是否是下溢的?比MinSubnorm小一点怎么样 现在我正在研究一个FPU的实现,它支持低于正常值的数字。我们假设取整前的结果严格介于-Min

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

现在我正在研究一个FPU的实现,它支持低于正常值的数字。我们假设取整前的结果严格介于-MinNorm和+MinNorm之间,取整后的结果也将小于MinNorm(可使用次正常数表示)。我认为这是什么?下溢还是非下溢?如果我需要设置下溢的状态位

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

  • 当执行小于最小幅值非零值的操作时,会发生下溢。在IEEE 754中,单精度指的是幅值(即绝对值)小于1.0 x 2-149的值

  • 当浮点运算的真实结果在量级上小于(即接近零)目标数据类型中可表示为正常浮点数的最小值时,可能会发生算术下溢

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

    IEEE754 2008标准(§7.5)规定,当结果为空时,应发出下溢异常信号

  • 非零,以及
  • 严格地介于-MinNorm和+MinNorm之间:它让实现决定这是在舍入之前还是之后,因此您可以在MinNorm下面的值上舍入,并且不发出异常信号
  • 所以在这种情况下,维基百科是正确的


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

    w.r.t.IEEE 754,维基百科参考更为正确。粗略地说,小于最小正常值的结果会产生下溢。不过,细节相当微妙:分界点不一定完全是米诺姆式的。谷歌搜索“四舍五入前下溢”和“四舍五入后下溢”以获取更多信息。关于底流标志和底流信号,也有一些微妙之处。在参考文献1中,“小于…”的操作没有多大意义。手术有多大<代码>。谢谢!但现在我正在研究一个FPU的实现,它支持低于正常值的数字。那么,当我设置状态和标志位时,如果它得到的结果小于MinNorm,我应该怎么做呢?把它当作底流?或者当它小于MinSubnorm时?你可能会想要一份IEEE 754的副本(如果你还没有)并遵循它。下溢规则见第7.5节。您需要决定是要在“舍入后”还是“舍入前”检测下溢。在这两种情况下,底流检测的截止值略有不同。“四舍五入前”是最简单的描述(但不一定要实现):如果真实结果为非零且严格小于MinNorm,则应发出下溢异常信号。(但不一定要设置标志;同样,有关详细信息,请参见标准。)。我是根据@Simon Byrne的答案和IEEE754文件得到的。非常感谢。谢谢,但是如果我的实现支持次正常数,并且我们假设取整前的结果严格介于-MinNorm和+MinNorm之间,取整后的结果将小于MinNorm(可使用次正常数表示)。我认为这是什么?下溢还是非下溢?谢谢。是的,我知道。但是,从实现的角度来看,当结果是逐渐下溢时,我是否需要设置下溢的状态位?