我正在学习浮点加法,但我很困惑。我正在使用的示例是这样的:
(假设 8 位机器,指数超 3)
x = 6.75 = 01011011
y = -10 = 11100100
非规范化并使用相同的指数给出:
x = 1.1011 x 2^2 = 0.1101 x 2^3
y = -1.0100 x 2^3
加/减尾数给出:
01101 + -10100 = -00111
我不太明白 01101 + -10100 = -00111。有人可以向我解释一下吗?
我正在学习浮点加法,但我很困惑。我正在使用的示例是这样的:
(假设 8 位机器,指数超 3)
x = 6.75 = 01011011
y = -10 = 11100100
非规范化并使用相同的指数给出:
x = 1.1011 x 2^2 = 0.1101 x 2^3
y = -1.0100 x 2^3
加/减尾数给出:
01101 + -10100 = -00111
我不太明白 01101 + -10100 = -00111。有人可以向我解释一下吗?
首先,缩放 1.1011•2 2应该给出 0.11011•2 3,而不是 0.1101•2 3。提前丢弃比特是错误的。
然而,考虑到它的方式,我们想要计算 01101 + -10100。将较大的数字放在较小的数字之上,并记住,因为较大的数字是负数,所以结果必须是负数:
1 0 1 0 0
0 1 1 0 1
_________
现在减去小学的方式。在右边,我们从 0 中减去 1。这需要从左边的数字借位,所以我们从 10 中减去 1(0 加上借来的值)并标记借位:
1 0 1 0'0
0 1 1 0 1
_________
1
现在我们从 -1 中减去 0(0 减去借位)。这需要再次借用,所以我们从 1 中减去 0(0 减去 1 的借用加上 10 的新借用):
1 0 1'0'0
0 1 1 0 1
_________
1 1
然后是 0 中的 1(1 减去借来的 1)。我们再次借用,所以我们从 10 中减去 1:
1 0'1'0'0
0 1 1 0 1
_________
1 1 1
然后从 -1 得到 1(0 减去借来的 1)。我们再次借,所以我们从 1 中减去 1(0 减去借来的 1 加上新借来的 10):
1'0'1'0'0
0 1 1 0 1
_________
0 1 1 1
然后 0 从 0(1 减去借来的 1)。最后,没有新的借用,我们有:
1'0'1'0'0
0 1 1 0 1
_________
0 0 1 1 1
我们记得这是负数,所以结果是 -00111。
解释它的最简单方法是将它们转换为十进制。
+01101 (base 2) = +13 (base 10)
-10100 (base 2) = -20 (base 10)
-20 + 13 = -7
-7 (base 10) = -00111 (base 2)
首先,当我被困在非十进制基础上做简单的数学运算时,我发现将其转换回十进制以查看发生了什么有时会很有用。
所以,首先,添加数字给了我们
6.75 - 10.0 = -3.25
或者在二进制中,不要太担心指数,因为它们是相同的幂
01101 - 10100 = -00111
手动执行此操作的最佳方法是查找结果
10100
-01101
使用正常的加法规则,然后反转结果。简要地:
从最左边借 1 以执行减法:
02100
-01101
_____
00111
并且由于最右下列的 1,我们需要再次借用,类似于十进制执行。
现在,让我们仔细检查一下这个结果到底是什么:
-0.0111_2 * 2 ^ 3
实际上是-3.5!之所以如此,是因为将 1.1011 x 2^2 视为 0.1101 x 2^3 而不是其实际值 0.11011 x 2^3 会导致精度下降。