“四舍五入前”(而不是“四舍五入后”)的微小的基本原理是什么?

What is the rationale for tininess "before rounding" (instead of "after rounding")?

提问人:pmor 提问时间:6/6/2023 更新时间:6/7/2023 访问量:98

问:

如果出现以下情况,则 [1] 使用“四舍五入前小”逻辑:FPRoundBaseFPCR.AH != '1'

// Underflow occurs if exponent is too small before rounding, and result is inexact or
// the Underflow exception is trapped. This applies before rounding if FPCR.AH != '1'.
boolean trapped_UF = fpcr.UFE == '1' && (!InStreamingMode() || IsFullA64Enabled());
if !altfp && biased_exp == 0 && (error != 0.0 || trapped_UF) then
    if fpexc then FPProcessException(FPExc_Underflow, fpcr);

https://en.wikipedia.org/wiki/IEEE_754-2008_revision(后加 empasis):

754r的附录U建议,只有四舍五入后的微小和不准确,因为精度损失是下溢信号的原因。

在以下情况下:“四舍五入前”(而不是“四舍五入后”)的微小的基本原理是什么?FPCR.AH != '1'

[1] A 型架构的 Arm 架构参考手册(J.a 期),第 J1-12437 页shared/functions/float/fpround/FPRoundBase

浮点 IEEE-754

评论


答:

2赞 chux - Reinstate Monica 6/6/2023 #1

“四舍五入前”微小的理由是什么

因为在 IEEE 754 指定有关微小的细节之前,一些实现就是这样做的。


在最小的正正正常值和下一个最小的正正常值(次正态值)之间有一个“灰色区域”。

Grey zone near DBL_MIN

如果计算在四舍五入之前落在该区域,则在“四舍五入之前/之后的微小度”方面的功能存在差异,因为它与下溢和信号有关。

那么,为什么 IEEE 754-2008 允许“舍入前”和“舍入后”的微小下呢?

模糊记忆/推测:

  • 这是一个非常狭窄的极端情况,在早期的IEEE 754中没有考虑IIRC。

  • FPU硬件和软件制造商的作者没有以相同的方式统一检测下溢,有些在四舍五入之前,有些在四舍五入之后。

  • 今天的 IEEE 754 允许两者(因此是实现细节),但只支持四舍五入后的微小,以推动未来的统一性。

  • 作为 的选项,这允许与以前的工作兼容或朝着 IEEE 建议的方向发展。FPCR.AH


IMO,评估四舍五入后的微小程度,从而减少异常处理。它还可以防止出现最小正正常值的四舍五入答案,但仍然下溢的情况。

我可以看到在四舍五入之前评估微小更容易在硬件/软件中实现和测试。

评论

0赞 pmor 6/7/2023
回复:“一些实现在 IEEE 754 之前就做到了”,这确实是有道理的(比如“截断到零”,参见 C99 基本原理,6.3.1.5 实数浮点类型)。回复:“这也防止了这种情况......”:我想过,我同意。那么,为什么 754r 的附录 U 建议“四舍五入后”进行微小?
0赞 chux - Reinstate Monica 6/7/2023
@pmor <为什么 754r 的附录 U 建议“四舍五入后”进行小> --> <防止四舍五入答案为最小正正常值,但仍然下溢的情况>是第一个原因。另一个可能是溢出的对称性。溢出异常是在舍入之前还是之后确定的?我必须复习一下。
1赞 pmor 6/7/2023
回复:“第一个原因”:好的。 回复:“溢出”:7.4 溢出:“......超出了四舍五入浮点结果的幅度......”
0赞 chux - Reinstate Monica 6/7/2023
@pmor嗯,鉴于,它听起来确实比四舍五入后下溢异常射击比以前更对称。
1赞 vinc17 6/7/2023
@pmor 但实际上,根据 2006 年在 stds-754 列表中发生的讨论,“一些实现在 IEEE 754 之前就做到了”并不是原因(这实际上是相反的,英特尔通常被视为参考实现)。看看我的答案
2赞 vinc17 6/7/2023 #2

原因是“在四舍五入之前”检测微小更易于实现。另一个原因是“四舍五入后”(即替代微小检测)更难理解。2006 年,David Hough 在 stds-754 列表中说:“四舍五入后小的定义取决于假设的四舍五入到假设的中间格式,这让所有试图实现下溢的人都感到困惑。他还说:“四舍五入前的细小使下溢与四舍五入模式无关。(但请注意,溢出取决于舍入模式,这似乎不是问题。

原因不是因为某些实现在 IEEE 754 指定该细节之前就这样做了。相反,“四舍五入后”在一段时间内被提议为标准,在这个问题上,Dan Zuras在2006年的stds-754列表中说:“四舍五入后下溢被选为N部分的原因是因为英特尔这样做了,它已经成为一个事实上的标准。(N部分可能与维基百科上提到的附件U相对应。请注意,“舍入后”还有其他原因,例如与溢出的对称性(始终在舍入之后)和避免一些罕见的无用下溢异常。