3.2.双精度格式
IEEE 双精度格式由三个字段组成:52 位小数 f ; 11 位偏置指数 e ;以及 1 位符号s。这些字段连续存储在两个 32 位字中(如下图所示)。在 SPARC 体系结构中,较高地址的 32 位字包含小数的 32 位最低有效位,而在 x86体系结构中,则较低地址的 32-位字包含小数的 32 位最低有效位。
如果用 f[31:0] 表示小数的 32 位最低有效位,则在这 32 位最低有效位中,第 0 位是整个小数的最低有效位,而第 31 位则是最高有效位。在另一个 32 位字中, 0:19 位包含 20 位小数的最高有效位 f[51:32],其中第 0 位是这20 位最高有效位中的最低有效位,而第 19 位是整个小数的最高有效位; 20:30 位包含11 位偏置指数 e,其中第 20 位是偏置指数的最低有效位,而第 30 位是最高有效位;最高的第 31 位包含符号位 s。
上图将这两个连续的 32 位字按一个 64 位字那样进行了编号,其中
Ø
0:51 位包含 52 位小数 f,其中第 0 位是小数的最低有效位,第 51 位是最高有效位。
IEEE 标准要求浮点数必须是规范的。这意味着尾数的小数点左侧必须为 1,因此我们在保存尾数的时候,可以省略小数点前面这个 1,从而腾出一个二进制位来保存更多的尾数。这样我们实际上用 52 位长的尾数域表达了 53 位的尾数。
Ø
52:62 位包含 11 位偏置指数 e,第 52 位是偏置指数的最低有效位,第 62 位是最高有效位。
11 位的指数为可以表达 0 到 2047 之间的2048个指数值。但是,指数可以为正数,也可以为负数。为了处理负指数的情况,实际的指数值按要求需要加上一个偏差(Bias)值作为保存在指数域中的值,单精度数的偏差值为1023;偏差的引入使得对于单精度数,实际可以表达的指数值的范围就变成 -1023到1024之间(包含两端)。在本文中,最小指数和最大指数分别用 emin
和 emax
来表达。稍后将介绍实际的指数值 -1023(保存为全0)以及 +1024(保存为全 1)保留用作特殊值的处理。
Ø
最高的第 63 位包含符号位s。s为0表示数值为正数,而s为1则表示负数。
3.3.双精度扩展格式 (SPARC) SPARC 浮点环境的四倍精度格式符合双精度扩展格式的 IEEE 定义。四倍精度格式占用 32 位字并包含以下三个字段:112 位小数 f、15 位偏置指数 e 和 1 位符号 s。这三个字段连续存储,如图2-3 所示。
地址最高的 32 位字包含小数的 32 位最低有效位,用 f[31:0] 表示。紧邻的两个 32 位字分别包含 f[63:32] 和 f[95:64]。下面的 0:15 位包含小数的 16 位最高有效位 f[111:96],其中第 0 位是这 16 位的最低有效位,而第 15 位是整个小数的最高有效位。16:30 位包含 15 位偏置指数 e,其中第 16 位是该偏置指数的最低有效位,而第 30 位是最高有效位;第 31 位包含符号位 s。
下图将这四个连续的 32 位字按一个 128 位字那样进行了编号,其中 0:111 位存储小数 f ; 112:126 位存储 15 位偏置指数 e ;而第 127 位存储符号位 s。
3.4.双精度扩展格式 (x86) 该浮点环境双精度扩展格式符合双精度扩展格式的 IEEE 定义。它包含四个字段:63 位小数 f、1 位显式前导有效数位 j、15 位偏置指数 e 以及 1 位符号 s。
在 x86 体系结构系列中,这些字段连续存储在十个相连地址的 8 位字节中。由于 UNIXSystem V Application Binary Interface Intel 386 Processor Supplement (Intel ABI) 要求双精度扩展参数,从而占用堆栈中三个相连地址的 32 位字,其中地址最高字的 16 位最高有效位未用,如下图所示。
地址最低的 32 位字包含小数的 32 位最低有效位 f[31:0],其中第 0 位是整个小数的最低有效位,而第 31 位则是 32 位最低有效位的最高有效位。地址居中的 32 位字中,0:30 位包含小数的 31 位最高有效位 f[62:32] (其中第 0 位是这 31 位最高有效位的最低有效位,而第 30 位是整个小数的最高有效位);地址居中 32 位字的第 31 位包含显式前导有效数位 j。
地址最高的 32 位字中,0:14 位包含 15 位偏置指数 e,其中第 0 位是该偏置指数的最低有效位,而第 14 位是最高有效位;第 15 位包含符号位 s。虽然地址最高的 32 位字的最高 16 位未被 x86 体系结构系列使用,但如上所述,它们对于符合 Intel ABI 规定是至关重要的。
4.
将实数转换成浮点数
4.1
浮点数的规范化
同样的数值可以有多种浮点数表达方式,比如上面例子中的 123.45 可以表达为 12.345 × 101,0.12345 × 103 或者 1.2345 × 102。因为这种多样性,有必要对其加以规范化以达到统一表达的目标。规范的(Normalized)浮点数表达方式具有如下形式:
±d.dd...d × βe , (0 ≤ d i < β)
其中 d.dd...d
即尾数,β 为基数,e
为指数。尾数中数字的个数称为精度,在本文中用 p
来表示。每个数字 d
介于 0 和基数之间,包括 0。小数点左侧的数字不为 0。
基于规范表达的浮点数对应的具体值可由下面的表达式计算而得:
±(d 0 + d 1β-1 + ... + d p-1β-(p-1))βe , (0 ≤ d i < β) 对于十进制的浮点数,即基数 β 等于 10 的浮点数而言,上面的表达式非常容易理解,也很直白。计算机内部的数值表达是基于二进制的。从上面的表达式,我们可以知道,二进制数同样可以有小数点,也同样具有类似于十进制的表达方式。只是此时 β 等于 2,而每个数字 d
只能在 0 和 1 之间取值。比如二进制数 1001.101 相当于 1 × 2 3 + 0 × 22 + 0 × 21 + 1 × 20 + 1 × 2-1 + 0 × 2-2 + 1 × 2-3,对应于十进制的 9.625。其规范浮点数表达为 1.001101 × 23。
4.2
根据精度表示浮点数
以上面的9.625为例,其规范浮点数表达为 1.001101 × 23,
因此按单精度格式表示为:
1 10000010 00110100000000000000000 同理按双精度格式表示为:
1 10000000010 0011010000000000000000000000000000000000000000000000 5.
|