保护、圆形、粘性位(浮点)

问题描述 投票:0回答:2

我不明白守卫、圆形和粘性位是什么意思。我有一个例子:如果我们添加 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。

floating-point rounding
2个回答
2
投票

0、1、1 的保护位、舍入位和粘性位告诉您“剩余位”(我的意思是从我们要舍入的点下方开始的位)是 0.01xxx…,其中xxx… 未知,但至少包含一个 1 位。因此,“残差”部分大于 1/4 ULP(即 0.01 加正数)但小于 1/2 ULP(小于 0.100...)。

如果您四舍五入到最接近的值,则需要向下舍入,因为“剩余”部分小于 ½ ULP。


0
投票

您可以查看“Rudy Velthuis”引用的上述notes_1。更具体地说,

30=1.111*2^4
意味着四舍五入到 0.001,因此
1.0000101*2^5
四舍五入到
1.000*2^5=32
(由于您没有指定如何获得正确答案 32,所以这里我采取“四舍五入到最接近的”)。


由于您的问题标题更笼统,这里我还描述了为什么使用 3 个额外位而不是 2 位或更少?

  1. 关于3位如何得到的描述可以从上面的notes_1中看到。您可以发现,保护位和圆形位类似于仅通过移位进行操作,而粘性位“粘住”而不会被移位。

    如果将值 1 移至粘性位位置,则该粘性位 仍然 为 1(“粘滞”在 1),尽管进一步移位。

  2. 为什么不只使用一对(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

  3. 为什么不使用一对(守卫,圆形)?

    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
     连接将导致“四舍五入到最接近的偶数”的不同结果。

© www.soinside.com 2019 - 2024. All rights reserved.