浮点数:归一化之前的舍入,反之亦然?

Floating point: round before normalize or vice-versa?

我正在用 C 编写一个浮点加法器,并使用 Berkeley SoftFloat 和 TestFloat 命令对其进行测试。一些测试用例失败了,这让我产生了这个矛盾:

所以看来有必要在四舍五入后再次归一化。

这在实践中是如何做到的?实现是否只检查这种情况并将有效数右移一次(并增加指数)以进行补偿?

这是我遇到的几个边缘案例之一,我发现自己必须查看现有的实现才能弄清楚该怎么做。但是编写这些实现的人是如何知道该做什么的呢?是否有一些关于如何实现浮点运算的规范参考? IEEE 754 描述了编码并指定了所需的操作,但没有涉及如何实际实现这些操作(除非我缺少一些实现指南)。

So it seems necessary to normalize again after rounding.

在四舍五入“改变有效数字位数”的情况下,旧数字的形式为:1.11111....1112*2博览会。通过“向上”舍入,新数字的形式为 10.00000....0002*2expo。重新归一化是微不足道的:1.000000....0002*2expo + 1.

如果 expo 处于最大值,则可能溢出到无穷大。


How is this done in practice?

在硬件中,另一行单元格。

在软件中,只需多几行代码:移位、递增和测试最大值。