我不明白守卫、圆形和粘性位是什么意思。我有一个例子:如果我们添加 3.25+30(3 位尾数),我们会得到 32,因为 grs=011。 我试图解决这个问题,但我所能做的就是: 30=1.111*2^4 3.25=0.001101*2^4 如果我把这些数字加起来,结果是 1.0000101*2^5,这意味着 g=0 r=1 s=1。现在的问题是我不明白为什么正确答案是32。
0、1、1 的保护位、舍入位和粘性位告诉您“剩余位”(我的意思是从我们要舍入的点下方开始的位)是 0.01xxx…,其中xxx… 未知,但至少包含一个 1 位。因此,“残差”部分大于 1/4 ULP(即 0.01 加正数)但小于 1/2 ULP(小于 0.100...)。
如果您四舍五入到最接近的值,则需要向下舍入,因为“剩余”部分小于 ½ ULP。
您可以查看“Rudy Velthuis”引用的上述notes_1。更具体地说,
30=1.111*2^4
意味着四舍五入到 0.001,因此 1.0000101*2^5
四舍五入到 1.000*2^5=32
(由于您没有指定如何获得正确答案 32,所以这里我采取“四舍五入到最接近的”)。
由于您的问题标题更笼统,这里我还描述了为什么使用 3 个额外位而不是 2 位或更少?
关于3位如何得到的描述可以从上面的notes_1中看到。您可以发现,保护位和圆形位类似于仅通过移位进行操作,而粘性位“粘住”而不会被移位。
如果将值 1 移至粘性位位置,则该粘性位 仍然 为 1(“粘滞”在 1),尽管进一步移位。
为什么不只使用一对(Round,Sticky)或一对(Guard,Sticky)? (这里的Round位和Guard位是用同样的操作来操作的(只是移位而不粘滞),所以把它们放在一起)
另一个 SO 问题的comment 中的 handout_1 显示了一个失败的有用示例,其中如果使用“舍入到最近”,则唯一的“1”(下面突出显示)无法决定舍入结果:
1.000 00 x 2^5- 0.000 11 x 2^5 回合为 1,粘性为 1
0.111 01 x 2^5 需要左移归一化,必须使用 Round bit
1.110
1 x 2^4 无法使用 Sticky 进行舍入,因为 无法判断是否 >/=/< 1/2 ULP
Eric Postpischil 的回答暗示了这一点。
来自 David A. Patterson 所著的《计算机组织与设计:硬件/软件接口 RISCV 第二版》一书中的“第 3.5 章浮点”:
假设我们在上例中将 $5.01 × 10^{−1} 添加到 2.34 × 10^2$。即使有守卫和圆形,我们也会将这里0.0050 添加到 2.34,总和为 2.3450。由于右侧有非零位,因此将设置粘性位。如果没有粘性位来记住是否有任何 1 被移走,我们会假设该数字等于 2.345000 ... 00 并舍入到最接近的偶数 2.34。使用粘性位记住该数字大于 2.345000 ... 00,我们四舍五入为 2.35。
0.0050
与对 (Guard,Round) 而不是
0.00501
与粘性位
1
连接将导致“四舍五入到最接近的偶数”的不同结果。