我的(已删除)评论的方向是错误的。
现在,虽然每个实现都可能受到对规范和错误的错误解释的影响(并且历史上存在很多浮点实现错误,而不仅仅是一次英特尔),但我们可以或可以尝试检查一种实现。 (我的电脑)
从一个操作数 1.0 开始
0x3F800000
001111111000...
0 01111111 000...
1.0000000 no shift
然后选择一个必须按顺序移动尾数的操作数
执行加法和减法。
0x3BFFFFFF
00111011111111
0 01110111 11111
这将向右移动 8,因此查看第二个操作数
0x3BFFFFFF
1.000000000000000...00 0000...
+ 0.000000011111111...11 1111...
==============================
1.000000011111111...11
1.000000000000000...00 0000...
- 0.000000011111111...11 1111...
==============================
1.111111100000000...00
0x3BFFFF00
1.000000000000000...00 0000...
+ 0.000000011111111...11 0000...
==============================
1.000000011111111...11
1.000000000000000...00 0000...
- 0.000000011111111...11 0000...
==============================
1.111111100000000...10
0x3BFFFF80
1.000000000000000...00 0000...
+ 0.000000011111111...11 1000...
==============================
1.000000011111111...11
1.000000000000000...00 0000...
- 0.000000011111111...11 1000...
==============================
1.111111100000000...01
0x3BFFFFC0
1.000000000000000...00 0000...
+ 0.000000011111111...11 1100...
==============================
1.000000011111111...11
1.000000000000000...00 0000...
- 0.000000011111111...11 1100...
==============================
1.111111100000000...00
0x3BFFFF01
1.000000000000000...00 00000000
+ 0.000000011111111...11 00000001
=================================
1.000000011111111...11
1.000000000000000...00 00000000
- 0.000000011111111...11 00000000
=================================
1.111111100000000...00 00000001
对于加法(不四舍五入)基数,未移位的数字需要填充(零)。所以尾数大小结束后两位
0+0 = 0 carry 0
0+1 = 1 carry 0
您不能在尾数(粘性位)之后的第一位进位。因此,除了第一个位之外,没有理由增加额外的逻辑,但您需要第一个位进行舍入。舍入只需要一点点。
减法虽然您可以将其视为借用或...
0x3BFFFF80
1.000000000000000...00 0000...
- 0.000000011111111...11 1000...
==============================
1.111111100000000...01
真的很合逻辑
1
1.000000000000000...00 00000000
+ 1.111111100000000...00 01111111
====================================
10.111111100000000...00 10000000
hardware gives
1.111111100000000...01
我仍在纠结,因为我选择了舍入为零和向下舍入,所以它不应该向上舍入和/或那个位是如何到达那里的。
无论如何,我走错了路,减法,这些位确实很重要,因为
进位现在可以是非零进入尾数边缘后的第一位
第一个操作数的零扩展仍然需要用零填充,但是
如果您有一堆减法,则添加一个的进位位
您可以将进位一直推到尾数的边缘。
好的,我要么受到四舍五入的影响,要么我的边界错误(错误地表示了我的第二个操作数)
0x3BFFFF80
1.000000000000000...00 0000...
- 0.000000011111111...11 1000...
==============================
1.111111100000000...01
0x3BFFFFC0
1.000000000000000...00 0000...
- 0.000000011111111...11 1100...
==============================
1.111111100000000...00
1
1.000000000000000...00 00000000
+ ?.111111100000000...00 00111111
=================================
1111111
1.000000000000000...00 00000000
+ ?.111111100000000...00 00111111
=================================
1.111111100000000...00 01000000
hardware gives
1.111111100000000...00
由于减法期间的借用,演示中是否存在错误
结束尾数,这会影响舍入位和结果的 lsbit(在归一化之前的尾数范围内)。
所以答案是肯定的,必须考虑这些位。基本上看到并投票给 Eric 的答案。
如果您可以将高级语言直接转换为二进制中的特定浮点值,您应该能够在其他未严重损坏的实现上演示这一点,包括软件优化器。
但是当你在加法方面考虑它时,你不能得到任何执行
在那里,所以您不能在标准化之前直接更改分数中的位,
但当然,较小数字的分数直接影响/定义舍入。减法是这里的关键,因为它会影响舍入和进位到预归一化分数。
并且作为答案 cmets,是的,在逻辑上可以有捷径,不必有那么大的加法器,并且还基于该答案,显着或分数而不是尾数,对不起......从那以后一直使用旧术语回到不是旧术语的时候。