Oracle® Solaris Studio 12.4:数值计算指南

退出打印视图

更新时间: 2015 年 1 月
 
 

2.2.3 双精度格式

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;52:62 位存储 11 位偏置指数 e;而第 63 位存储符号位 s

图 2-2  双精度存储格式

image:双精度存储格式位的表示法。

这三个字段中的位模式的值将决定整个位模式所表示的值。

Table 2–4 显示一侧的三个组成字段中位的值与另一侧双精度格式位模式表示值的对应关系;u 意味着所指示的字段的值与确定特定双精度格式位模式的值无关。

表 2-4  IEEE 双精度格式位模式表示的值
双精度格式位模式
0 < e < 2047
(–1)s × 2e–1023 × 1.f(正规数)
e = 0; f ≠ 0
f 中至少有一位不为零)
(–1)s × 21022 × 0.f(次正规数)
e = 0; f = 0
f 中的所有位均为零)
(–1)s × 0.0(有符号的零)
s = 0; e = 2047; f = 0(f 中的所有位均为零)
+INF(正无穷大)
s = 1; e = 2047; f = 0(f 中的所有位均为零)
–INF(负无穷大)
s = u; e = 2047; f ≠ 0
f 中至少有一位不为零)
NaN(Not-a-Number,非数值)

请注意,当 e < 2047 时,赋予双精度格式位模式的值是使用以下方法构成:将二进制基数点插入到紧邻小数最高有效位的左侧,将一个隐含位插入到紧邻二进制点的左侧。如此构成的数字称为有效数字。之所以称为隐含位的原因是,在双精度格式位模式中没有显式指定其值,但偏置指数字段的值隐式指定了该值。

对于双精度格式,正规数和次正规数的差别在于正规数有效数字的前导位(二进制点左侧的位)为 1,而次正规数有效数字的前导位为 0。 在 IEEE 标准 754 中,双精度格式次正规数称为双精度格式非正规数。

在双精度格式正规数中 52 位小数加上隐含前导有效数位共提供了 53 位精度。

Table 2–5 中给出了重要的双精度存储格式位模式的示例。 第二列中的位模式显示为两个 8 位十六进制数。对于 SPARC 体系结构,左侧是较低地址的 32 位字的值,右侧是较高地址的 32 位字的值,而对于 x86 体系结构,左侧是较高地址的字,右侧是较低地址的字。最大正正规数是以 IEEE 双精度格式表示的最大有限数。最小正次正规数是以 IEEE 双精度格式表示的最小正数。最小正正规数通常称为下溢阈值。(最大和最小正规数和次正规数的十进制值是近似的;对于所示的数字来说,它们是正确的。)

表 2-5  双精度存储格式位模式及其 IEEE 值
公用名称
位模式(十六进制)
十进制值
+ 0
00000000 00000000
0.0
– 0
80000000 00000000
–0.0
1
3ff00000 00000000
1.0
2
40000000 00000000
2.0
最大正规数
7fefffff ffffffff
1.7976931348623157e+308
最小正正规数
00100000 00000000
2.2250738585072014e–308
最大次正规数
000fffff ffffffff
2.2250738585072009e–308
最小正次正规数
00000000 00000001
4.9406564584124654e–324
+∞
7ff00000 00000000
无穷
–∞
fff00000 00000000
负无穷
非数字
7ff80000 00000000
NaN

NaN(Not a Number,非数)可以用任何满足 NaN 定义的位模式表示。在Table 2–5 中显示的 NaN 十六进制值只是可用于表示 NaN 的众多位模式之一。