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

退出打印视图

更新时间: 2015 年 1 月
 
 

2.2.5 双精度扩展格式 (x86)

该浮点环境双精度扩展格式符合双精度扩展格式的 IEEE 定义。 它包含四个字段:63 位 小数 f;1 位显式前导有效数位 j;15 位偏置指数 e 以及 1 位符号 s 此格式不能作为语言类型用于 Oracle Solaris Studio Fortran 或 SPARC 的 C/C++。

在 x86 体系结构系列中,这些字段连续存储在十个相连地址的 8 位字节中。然而,由于 UNIX System 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 规定,这是至关重要的。

下图将这三个连续的 32 位字按一个 96 位字那样进行了编号,其中 0:62 位存储 63 位小数 f;第 63 位存储显式前导有效数位 j;64:78 位存储 15 位偏置指数 e;第 79 位存储符号位 s

图 2-4  双精度扩展格式 (x86)

image:x86 系统的双精度扩展格式位的表示法。

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

Table 2–8 显示了四个组成字段的计数值与该位模式表示的值之间的对应关系。u 意味着所指示的字段的值与确定特定位模式的值无关。

表 2-8  位模式表示的值 (x86)
双精度扩展位模式 (x86)
j = 0, 0 < e <32767
不支持
j = 1, 0 < e < 32767
(–1)s × 2e–16383 × 1.f(正规数)
j = 0, e = 0; f ≠ 0
f 中至少有一位不为零)
(–1)s × 216382 × 0.f(次正规数)
j = 1, e = 0
(–1)s × 216382 × 1.f(伪非正规数)
j = 0, e = 0, f = 0
(f 中的所有位均为零)
(–1)s × 0.0(有符号的零)
j = 1; s = 0; e = 32767; f = 0(f 中的所有位均为零)
+INF(正无穷大)
j = 1; s = 1; e = 32767; f = 0(f 中的所有位均为零)
–INF(负无穷大)
j = 1; s = u; e = 32767; f = .1uuuuu
QNaN(quiet NaN,静态 NaN)
j = 1; s = u; e = 32767; f = .0uuuuu ≠ 0
f 中至少一个 u 不为零)
SNaN(signaling NaN,信号 NaN)

请注意,双精度扩展格式的位模式没有显式前导有效数位。在双精度扩展格式中,将前导有效数位显式指定为单独的字段 j。但当 e ≠ 0 时,将不支持任何 j = 0 的位模式,这是因为将这种位模式用作浮点运算中的操作数将导致无效的运算异常。

将双精度扩展格式中的分立字段 jf 连接起来称为有效数字。当 e < 32767 和 j = 1 时,或当 e = 0 和 j = 0 时,有效数字是通过以下方法形成的:在前导有效数位 j 和小数的最高有效位之间插入二进制基数点。

在 x86 双精度扩展格式中,前导有效数位 j 是 0 并且偏置指数字段 e 也是 0 的位模式表示次正规数,而前导有效数位 j 是 1 并且偏置指数字段 e 是非零数的位模式表示正规数。由于前导有效数位是显式表示的,而不是从指数的值推导出来的,所以该格式还接受偏置指数是 0(与次正规数相似),而前导有效数位是 1 的位模式。每一个这样的位模式实际上都与对应的偏置指数字段是 1 的位模式表示相同的值,即正规数,因此位模式称为伪非正规数。在 IEEE 标准 754-1985 中,次正规数称为非正规数。伪非正规数仅是一个 x86 双精度扩展格式编码的人为概念,当显示为操作数时,您可以将其隐式转换为相应的正规数,不能将其生成为结果。

表 2-9  双精度扩展格式位模式及其值 (x86)
公用名称
位模式 (x86)
十进制值
+0
0000 00000000 00000000
0.0
–0
8000 00000000 00000000
–0.0
1
3fff 80000000 00000000
1.0
2
4000 80000000 00000000
2.0
最大正规数
7ffe ffffffff ffffffff
1.18973149535723176505e+4932
最小正正规数
0001 80000000 00000000
3.36210314311209350626e–4932
最大次正规数
0000 7fffffff ffffffff
3.36210314311209350608e–4932
最小正次正规数
0000 00000000 00000001
3.64519953188247460253e–4951
+∞
7fff 80000000 00000000
+∞
–∞
ffff 80000000 00000000
–∞
带有最大小数的静态 NaN
7fff ffffffff ffffffff
QNaN
带有最小小数的静态 NaN
7fff c0000000 00000000
QNaN
带有最大小数的信号 NaN
7fff bfffffff ffffffff
SNaN
带有最小小数的信号 NaN
7fff 80000000 00000001
SNaN

上表中给出了重要的双精度扩展存储格式位模式的示例。第二列中的位模式显示为一个 4 位十六进制数,它是地址最高的 32 位字的 16 位最低有效位的值(请记住,上述该地址最高的 32 位字的 16 位最高有效位是未用的,所以未显示其值),后面是两个 8 位十六进制数,其中左侧是地址居中的 32 位字的值,右侧是地址最低的 32 位字的值。最大正正规数是以 x86 双精度扩展格式表示的最大有限数。最小正次正规数是以双精度扩展格式表示的最小正数。最小正正规数通常称为下溢阈值。最大和最小正规数和次正规数的十进制值是近似的;对于所示的数字来说,它们是正确的。

NaN(Not a Number,非数)可以用任何满足 NaN 定义的位模式表示。上表中的 NaN 十六进制值显示出,小数字段的前导位(最高有效位)决定 NaN 是静态 NaN(前导小数位 = 1)还是信号 NaN(前导小数位= 0)。