小学数学和我们用浮点做的唯一区别是我们有二进制补码(以 2 为底与以 10 为底并没有真正的相关性,只是让生活更轻松)。所以,如果你读完了小学,你就会知道这一切是如何运作的。
在小学的十进制中,您对齐小数点,然后进行数学运算。对于浮点,我们移动较小的数字并丢弃它的尾数(抱歉分数)位以将其与较大的数字对齐。
在小学里,如果做减法,你会在解决身份后从较大的数字中减去较小的数字
a - (-b) = a + b
-a + b = b - a
等等,这样你要么有
n - m
或
n + m
然后你做数学。根据获得 a-b 或 a+b 所需的操作来应用该符号。
二进制补码的美妙之处在于否定或否定被反转并添加一个,这很好地融入了逻辑。
a - b = a + (-b) = a + (~b) + 1
因此您无需重新排列操作数,但您可能不得不否定第二个操作数。
此外,您不必记住结果的符号,结果告诉您它的
签名。
所以对齐点
把它放在表格里
a + b
a + (-b)
其中 a 可以是正数或负数,但 b 的符号和操作可能需要
否定 b。
做加法。
如果结果为负,则将结果取反为正
标准化
IEEE 只涉及让 1.fraction 为正数的愿望,其他浮点格式允许负的 Whole.fraction 并且不求反,简单地说
规范化。剩下的只是小学数学(加上补码)
一些例子
2 + 4
二进制数是
+10
+100
转换为规范化的形式是
+1.0 * 2^1
+1.00 * 2^2
需要相同的指数(对齐点)
+0.10 * 2^2
+1.00 * 2^2
两者都是积极的,所以没有改变只是做加法
这是基本形式,我在前面放了比需要更多的符号扩展
使结果的符号更容易看到。
0
000010
+000100
=======
填写
000000
000010
+000100
========
000110
结果为正(结果的 msbit 为零)所以归一化
+1.10 * 2^2
4+5
100
101
+1.00 2^2
+1.01 2^2
相同的指数
都是正面的
0
000100
+000101
=======
001000
000100
+000101
=======
001001
结果为正,所以归一化
+1.001 * 2^3
4 - 2
100
10
+1.00 * 2^2
+1.0 * 2^1
需要相同的指数
+1.00 * 2^2
+0.10 * 2^2
减去 a - b = a + (-b)
1 <--- add one
00100
+11101 <--- invert
=======
填写
11011
00100
+11101
=======
00010
结果为正,所以归一化
+1.0 * 2^1
2 - 4
10
100
+1.0 * 2^1
+1.00 * 2^2
做相同的指数
+0.10 * 2^2
+1.00 * 2^2
算一算
a - b = a + (-b)
1
000010
+111011
========
填写
000111
000010
+111011
========
111110
结果为负,所以取反 (0 - n)
000011 <--- add one
000000
+000001 <--- invert
=========
000010
标准化
-1.0 * 2^1