提问人:pmor 提问时间:6/6/2023 更新时间:6/7/2023 访问量:98
“四舍五入前”(而不是“四舍五入后”)的微小的基本原理是什么?
What is the rationale for tininess "before rounding" (instead of "after rounding")?
问:
如果出现以下情况,则 [1] 使用“四舍五入前小”逻辑:FPRoundBase
FPCR.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 指定有关微小的细节之前,一些实现就是这样做的。
在最小的正正正常值和下一个最小的正正常值(次正态值)之间有一个“灰色区域”。
如果计算在四舍五入之前落在该区域,则在“四舍五入之前/之后的微小度”方面的功能存在差异,因为它与下溢和信号有关。
那么,为什么 IEEE 754-2008 允许“舍入前”和“舍入后”的微小下溢呢?
模糊记忆/推测:
这是一个非常狭窄的极端情况,在早期的IEEE 754中没有考虑IIRC。
FPU硬件和软件制造商的作者没有以相同的方式统一检测下溢,有些在四舍五入之前,有些在四舍五入之后。
今天的 IEEE 754 允许两者(因此是实现细节),但只支持四舍五入后的微小,以推动未来的统一性。
作为 的选项,这允许与以前的工作兼容或朝着 IEEE 建议的方向发展。
FPCR.AH
IMO,评估四舍五入后的微小程度,从而减少异常处理。它还可以防止出现最小正正常值的四舍五入答案,但仍然下溢的情况。
我可以看到在四舍五入之前评估微小更容易在硬件/软件中实现和测试。
评论
原因是“在四舍五入之前”检测微小更易于实现。另一个原因是“四舍五入后”(即替代微小检测)更难理解。2006 年,David Hough 在 stds-754 列表中说:“四舍五入后小的定义取决于假设的四舍五入到假设的中间格式,这让所有试图实现下溢的人都感到困惑。他还说:“四舍五入前的细小使下溢与四舍五入模式无关。(但请注意,溢出取决于舍入模式,这似乎不是问题。
原因不是因为某些实现在 IEEE 754 指定该细节之前就这样做了。相反,“四舍五入后”在一段时间内被提议为标准,在这个问题上,Dan Zuras在2006年的stds-754列表中说:“四舍五入后下溢被选为N部分的原因是因为英特尔这样做了,它已经成为一个事实上的标准。(N部分可能与维基百科上提到的附件U相对应。请注意,“舍入后”还有其他原因,例如与溢出的对称性(始终在舍入之后)和避免一些罕见的无用下溢异常。
评论