上文介绍了用浮点数进行加减运算的方法和步骤。
做而论道的结论就是:
浮点数的加减计算,都是用定点整数进行的。
无论数值 N 是否含有小数,在计算过程中,并没有小数的参与。
---------------------
本文,再介绍一下 “浮点数做乘除” 时的计算过程。
还是使用上文中的两个数值:
N1 = -100.625、N2 = 100.5。
这两个数相乘,乘积,应该是:N1 * N2 = -10112.8125。
这两个数字的 32 位浮点数的二进制形式如下。
N1:1100 0010 1100 1001 0100 0000 0000 0000;
N2:0100 0010 1100 1001 0000 0000 0000 0000。
---------------------
两个数相乘的运算规则,大家都知道:
两符号位相异或,作为乘积的符号位;
两个绝对值相乘,作为乘积的绝对值;
两个指数相加,作为乘积的指数。
下面,就按照这些规则,分别计算一下吧。
---------------------
乘积的符号位,显然是 1 了,它代表了负号(-)。
---------------------
求乘积的绝对值,要用到 N1、N2 的绝对值。
在上文中,已经求出这两个数的绝对值,分别是:
N1 的绝对值:1 100 1001 0100 0000 0000 0000;
N2 的绝对值:1 100 1001 0000 0000 0000 0000。
它们都是 24 位二进制数,均含有 23 位小数。
将这两个绝对值以【无符号数】相乘之后,乘积则为 48 位二进制数:
10011110 00000011 01000000 00000000 00000000 00000000。
注意:在这 48 位数中,是含有 46 位小数的,整数是最前两位。
为了符合单精度浮点数的规范,截取前 24 位。
(可能会造成误差? 不管那些了!)
再标注上小数点,这就是乘积的绝对值:
10.01 1110 0000 0011 0100 0000。
把小数点左移一位,这才符合单精度浮点数的写法:
1.001 1110 0000 0011 0100 0000。
把整数隐含起来吧。
那么,在小数点后面的 23 位二进制数,就是【乘积的尾数】。
001 1110 0000 0011 0100 0000。
注意:在此处,把小数点左移了一位。
那么,在计算出阶码后,应该加上 1,以保证数值不变。
---------------------
浮点数的阶码,都是指数(e)的移码,单精度浮点数的偏移量是 7F。
用两个移码相加来求乘积的移码,偏移量就重复了。
因此,在相加时,应该减去一个偏移量。
所以有:E = E1 + E2-7F = 85 + 85-7F = 8BH。
又因为在前面把小数点左移了一位,此处应加一。
故此,N1 × N2 的阶码,就是:8CH = 1000 1100B。
---------------------
算到此处,就把 N1 × N2 的三个组成部分,都求出来了。
把它们组合在一起,就是乘积的浮点数:
1 1000 1100 001 1110 0000 0011 0100 0000。
这个浮点数,正好就是:-10112.8125 的浮点数。
感兴趣的朋友可以逆推一下,就可以验证本文介绍的方法是正确的。
---------------------
由上面的介绍可知,用浮点数做乘除运算,也是用定点数来计算的。
运算过程中所用的,都是整数。
虽然,曾考虑到小数的位数,但是,并没有使用小数来计算。
另一个关键点是:在求绝对值时,是用【无符号数】相乘来求出的。
综上所述,本文的结论就是:
浮点数的乘除运算,符号位仅有一次异或而已。
其余的计算,都是无符号整数来计算的。
小数的算法? 都是不存在的!
那么,在《计算机组成原理》中介绍的 “原码(及补码)的乘除法”、“小数的乘除法”,还有什么意义呢?
不可思议啊!
本文完。