双精度浮点格式的有效数有53位(包括前面没有列出的那一位),大致相当于十进制的16位。与单精度浮点格式相比,这已经有了很大的改进了,但仍然不能避免两个不同的数存储为同一个结果的情况。例如,140,737,488,355,328.00和140,737,488,355,328.01在内存中存放时,会被当做同一个数来处理,它们的双精度浮点格式表示为:
42E0000000000000h
即:
1.0000000000000000000000000000000000000000000000000000₂×247
当然,为浮点数发明一种在内存中的存储方式,这只是在汇编程序使用浮点数所涉及的工作的一小部分。如果你决定闭门造车,完全独立地开发一台计算机,则必须要独立编写用于浮点数加、减、乘、除运算的函数集。幸运的是,有了前面关于整数四则运算的学习,这些关于浮点数的运算就可以分解成许多小的关于整数的加、减、乘、除运算,这样就能将问题大大简化。
例如,浮点数加法中最重要一点的就是如何对有效数相加,为了能使它们的有效位匹配,需要利用指数来确定对其如何移位。假设要进行下面的加法运算:
$$
( 1 . 1 1 0 1 \times 2 ^ { 5 } ) + ( 1 . 0 0 1 0 \times 2 ^ { 2 } )
$$
你需要把有效数部分的11101和10010相加,但并不是简单地直接相加。两个数的指数部分的不同决定了第二个数必须相对于第一个数右移。实际上我们要做的整数加法应该是11101000加10010。最后的运算结果是:
$$
1 . 1 1 1 1 0 1 0 \times 2 ^ { 5 }
$$
前面我们曾列出过太阳与地球的距离以及氢原子的半径,如果把这两个数相加会是怎样的结果呢?显而易见,因为它们两者的指数相差太大,因此较小的数对结果甚至没有影响。
两个浮点数的乘法意味着要把有效数当作整数相乘,并且把指数部分相加。为了使结果规范化,一般需要对指数调整一到两次。
浮点数运算另一层次的复杂性体现在处理一些较为繁杂的函数运算,例如平方根、
23 定点数和浮点数
377