在前面已经说明了,科学记数法的形式是:N = ± 绝对值 × R^e。
把这种形式引入到计算机中,就成了 “浮点数”。
一个浮点数,有三个组成部分:S、E 和 M。
每个部分,都是定点数,而且,也都是整数。
浮点数的运算,实际上,都是整数之间的计算。
而且,也都是【无符号数】的计算。
----------------------
近来,看到不少的网文,充斥了原码(及补码)的乘除法,小数的乘除法等等。
一篇一篇的,都是满嘴的谎言!
其根源,好像都是来自于《计算机组成原理》课本。
实际上,计算机只有 1 0 两个代码,并没有小数点。
任何数字,存入到计算机中,都只有二进制数了。
小数点,则需要你自己处理。
也就是说,在计算机中,只有整数。
即使是负数,用到了补码,也是用正整数存放的。
(关于补码,可参考做而论道以前的博文。)
-----------------------
下面,拿两个简单的数字,介绍一下浮点数的加减运算。
N1 = -100.625、N2 = 100.5。
这两个数相加,之和,应该是:N1 + N2 = -0.125。
计算机用浮点数,应该怎么算呢? 且往下看。
先把这两个数字,以 32 位浮点数存入计算机。
这两个浮点数的二进制形式如下。
N1:1100 0010 1100 1001 0100 0000 0000 0000;
N2:0100 0010 1100 1001 0000 0000 0000 0000。
----------------------
许多人都说:浮点数的尾数(M),是 “纯小数”。
其实,这是误解。
如果 N1 = 100625,这是一个纯粹的整数,其尾数也是这样的。
此时的 N1,根本就没有小数部分,尾数怎么可能是小数?
实际上,任何浮点数的尾数(M),都是正整数。
数值 N 的 “整数部分和小数部分” 的信息,是存放在阶码(E)之中的。
即使 N 具有小数部分,也与尾数(M)毫无关系。
----------------------
浮点数加减的运算步骤如下。
1. 在尾数(M)的前面,补上隐含的值。
如果 E = 0,就补上 0;如果 E > 0,就补上 1。
此时,就凑齐了:数值 N 的绝对值。
N1 的绝对值:1 100 1001 0100 0000 0000 0000;
N2 的绝对值:1 100 1001 0000 0000 0000 0000。
2. 对阶。
将阶码较小的浮点数的绝对值右移。
每右移一位,阶码(E)就加一。
直至两个阶码相同。
对于 N1、N2,它们的阶码是相同的,这一步,就算结束了。
3. 计算。
即将两个浮点数的绝对值,相加减。
这一步,就是两个定点整数的运算了。
如果有负数或减法,就可以使用补码来做。
加减完成后,还应把结果再写成浮点数的绝对值的形式。
那么,经过计算,N1 + N2 的绝对值就是:
0000 0000 0100 0000 0000 0000。
N1 + N2 的符号位为 1,另外存放。
4. 对运算结果进行规格化。
即在运算结果的绝对值中,从左向右,查找为 1 的位。
将绝对值左移,每移动一位,阶码(E)减一,直至首位为一。
那么,把运算结果的绝对值左移了 9 位后,就成了这个样子:
100 0000 0000 0000 0000 0000 0。
将首位的 1 隐去,剩下的,就是 23 位的尾数(M):
00 0000 0000 0000 0000 0000 0。
此时的阶码(E),是在原来的基础上,减去了 9,即为:
100 0010 1 - 0000 1001 = 0111 1100。
至此,就得出了 N1 + N2 的浮点数运算结果:
1 0111 1100 00 0000 0000 0000 0000 0000 0。
(写成 16 进制,就是:BE 00 00 00。)
这个浮点数所代表的数值,就是:-0.125。
这正是 N1 + N2 的结果,运算结束。
----------------------
上面,介绍了一个浮点数加减运算的过程。
虽然没有涉及到 “非规约数、无穷大、非数字” 等等,但是,也够看的了。
由此例可知,浮点数的运算,每一步,都是用整数进行的。
数值 N 虽然具有小数部分,但是在运算过程中,并没有任何小数出现。
----------------------
浮点数的运算,都不涉及小数,定点数的运算,就更不涉及小数了。
只有在屏幕上显示结果的时候,才会用到【小数点】。
也只有在显示结果的时候,才会涉及到二进制数的【整数部分、小数部分】。
如果,讨论计算机内部的计算过程,根本就不必说什么【小数和小数点】。
现在,许多大学的教材,都是乱写一些根本就不存在的东西。
也不知道,这些教授想干什么!
本文完