更新了正确舍入为偶数的方法。
基本算法:
存储 23-exponent+1'th 位(小数点后)。接下来,将(23 指数)最低有效位清零。然后使用存储的位和新的 LSB 进行舍入。如果存储的位位为 1,则将非截断部分的 LSB 加 1,并在必要时进行归一化。如果存储位为 0,则什么也不做。
**
对于符合 IEEE-754 标准的结果:
**
在将 (23-exponent) 最低有效位清零之前,或将 (22-exponent) 最低有效位放在一起。调用该结果或舍入位。
存储的 (23-exponent + 1) 位(小数点后)将被称为保护位。
然后将(23-指数)最低有效位清零。
如果保护位为零,则什么也不做。
如果保护位为1,粘性位为0,如果LSB为1,则LSB加一。
如果保护位为 1,粘性位为 1,则在 LSB 上加一。
以下是一些使用基本算法的示例:
x = 62.3
sign exponent mantissa
x = 0 5 (1).11110010011001100110011
第一步:存储指数+1位(小数点后)
指数+1 = 第 6 位
保存位 = 0
第 2 步:将 23 指数最低有效位清零
23-exponent = 18,所以我们将 18 个 LSB 归零
sign exponent mantissa
x = 0 5 (1).11110000000000000000000
第 3 步:使用下一位进行舍入
由于存储的位为0,我们什么都不做,浮点数已经四舍五入到62。
另一个例子:
x = 21.9
sign exponent mantissa
x = 0 4 (1).01011110011001100110011
第一步:存储指数+1位(小数点后)
指数+1 = 第 5 位
保存位 = 1
第 2 步:将 23 指数最低有效位清零
23-exponent = 19,所以我们将 19 个 LSB 归零
sign exponent mantissa
x = 0 4 (1).01010000000000000000000
第 3 步:使用下一位进行舍入
由于存储的位是 1,我们将截断部分的 LSB 加 1,得到 22,也就是正确的数字:
我们从:
sign exponent mantissa
x = 0 4 (1).01010000000000000000000
在此位置添加一个:
+ 1
我们得到 22:
sign exponent mantissa
x = 0 4 (1).01100000000000000000000