奎克的藏经阁 · 原书印刷页

编码 隐匿在计算机软硬件背后的语言 · 第 377 页

PDF 物理页索引 393 · 编码隐匿在计算机软硬件背后的语言

书名
编码 隐匿在计算机软硬件背后的语言
作者
未记录
印刷页
377
PDF 物理页
393(从 0 开始)
章节
编码隐匿在计算机软硬件背后的语言
UUID
38270854-596f-4a26-8183-db8c968c6020
来源类型
original_book
页面 SHA-256
41e1c5e65637a10ba0319e29d38d2e333c58b325669fc12c85b6e34147e2b1c7

双精度浮点格式的有效数有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