Oracle® Developer Studio 12.5:数值计算指南

退出打印视图

更新时间: 2016 年 6 月
 
 

2.2 IEEE 格式

本节介绍了如何将浮点数据存储在内存中。它汇总了各种 IEEE 存储格式的精度和范围。

2.2.1 存储格式

浮点格式是一种数据结构,用于指定包含浮点数的字段、这些字段的布局及其算术解释。浮点存储格式指定如何将浮点格式存储在内存中。IEEE 标准定义了这些格式,但具体选择哪种存储格式由实现工具决定。

汇编语言软件有时取决于所使用的存储格式,但更高级别的语言通常仅处理浮点数据类型的语言概念。 这些类型在不同的高级语言中具有不同的名称,并且与表 1中所示的 IEEE 格式相对应。

表 1  IEEE 格式和语言类型
IEEE 精度
C、C++
Fortran
单精度
float
REAL 或 REAL*4
双精度
双精度
DOUBLE PRECISION 或 REAL*8
双精度扩展
long double (x86)
四倍精度
long double (SPARC)
REAL*16

IEEE 754 明确规定了单精度浮点格式和双精度浮点格式,并为这两种基本格式分别定义了一组扩展格式。表 1中显示的 long double 和 REAL*16 类型适用于 IEEE 标准定义的一种双精度扩展格式。

以下几节详细介绍了 SPARC 和 x86 平台上用于 IEEE 浮点格式的每种存储格式。

2.2.2 单精度格式

IEEE 单精度格式由三个字段组成:23 位小数 f;8 位偏置指数 e;以及 1 位符号 s 这些字段连续存储在一个 32 位字中,如下图所示。0:22 位包含 23 位小数 f,其中第 0 位是小数的最低有效位,第 22 位是最高有效位;23:30 位包含 8 位偏置指数 e,第 23 位是偏置指数的最低有效位,第 30 位是最高有效位;最高的第 31 位包含符号位 s

图 1  单精度存储格式

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

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

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

注意,当 e < 255 时,为单精度格式位模式分配的值是使用以下方法构成的:将二进制基数点插入到紧邻小数最高有效位的左侧,将一个隐含位插入到紧邻二进制点的左侧,因而以二进制位置表示法来表示一个带分数(整数加小数,其中 0 ≤ 小数 < 1)。

如此构成的带分数称为单精度格式有效数字。之所以称为隐含位的原因是,在单精度格式位模式中没有显式指定其值,但偏置指数字段的值隐式指定了该值。

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

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

表 3中给出了重要的单精度存储格式位模式的示例。最大正正规数是以 IEEE 单精度格式表示的最大有限数。 最小正次正规数是以 IEEE 单精度格式表示的最小正数。最小正正规数通常称为下溢阈值。 (最大和最小正规数和次正规数的十进制值是近似的;对于所示的数字来说,它们是正确的。)

表 3  单精度存储格式位模式及其 IEEE 值
公用名称
位模式(十六进制)
十进制值
+0
00000000
0.0
–0
80000000
–0.0
1
3f800000
1.0
2
40000000
2.0
最大正规数
7f7fffff
3.40282347e+38
最小正正规数
00800000
1.17549435e–38
最大次正规数
007fffff
1.17549421e–38
最小正次正规数
00000001
1.40129846e–45
+∞
7f800000
无穷
–∞
ff800000
负无穷
非数字
7fc00000
NaN

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

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  双精度存储格式

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

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

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

表 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 位精度。

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

表 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 定义的位模式表示。在表 5中显示的 NaN 十六进制值只是可用于表示 NaN 的众多位模式之一。

2.2.4 四倍精度格式

浮点环境的四倍精度格式同样符合双精度扩展格式的 IEEE 定义。 此格式不在 x86 的 Oracle Developer Studio C/C++ 编译器中。四倍精度格式占用 32 位字并包含以下三个字段:112 位小数 f;15 位偏置指数 e;以及 1 位符号 s。这三个字段是连续存储的,如下图所示。

地址最高的 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  四倍精度格式

image:该图表示的是四倍精度格式。

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

表 6显示了三个组成字段的值与四倍精度格式位模式表示的值之间的对应关系。u 意味着“无关”,因为指示字段的值与确定特定位模式的值无关。

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

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

表 7  四倍精度格式位模式
公用名称
位模式 (SPARC)
十进制值
+0
00000000 00000000 00000000 00000000
0.0
–0
80000000 00000000 00000000 00000000
–0.0
1
3fff0000 00000000 00000000 00000000
1.0
2
40000000 00000000 00000000 00000000
2.0
最大正规数
7ffeffff ffffffff ffffffff ffffffff
1.1897314953572317650857593266280070e+4932
最小正规数
00010000 00000000 00000000 00000000
3.3621031431120935062626778173217526e–4932
最大次正规数
0000ffff ffffffff far-off ffffffff
3.3621031431120935062626778173217520e–4932
最小正次正规数
00000000 00000000 00000000 00000001
6.4751751194380251109244389582276466e–4966
+∞
7fff0000 00000000 00000000 00000000
+∞
–∞
ffff0000 00000000 00000000 00000000
–∞
非数字
7fff8000 00000000 00000000 00000000
NaN

表 7中显示的 NaN 十六进制值只是可用于表示 NaN 的众多位模式之一。

2.2.5 双精度扩展格式 (x86)

该浮点环境双精度扩展格式符合双精度扩展格式的 IEEE 定义。 它包含四个字段:63 位 小数 f;1 位显式前导有效数位 j;15 位偏置指数 e 以及 1 位符号 s 此格式不能作为语言类型用于 Oracle Developer 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

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

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

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

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

表 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 双精度扩展格式编码的人为概念,当显示为操作数时,您可以将其隐式转换为相应的正规数,不能将其生成为结果。

表 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)。

2.2.6 十进制表示法的范围和精度

本节讨论给定存储格式的范围和精度概念。本节包含的范围和精度与 IEEE 单精度格式、双精度格式和四倍精度格式以及与 x86 体系结构上 IEEE 双精度扩展格式的实现相对应。为了具体起见,我们用 IEEE 单精度格式来定义范围和精度概念。

IEEE 标准指定使用 32 位来表示单精度格式的浮点数。由于 32 个零和一的组合是有限的,所以使用 32 位仅能表示有限个数字。

于是会出现这样一个很自然的问题:使用这种特定格式表示最大和最小正数的十进制表示法是什么?

下面我们将这一问题改述来引入范围的概念:在十进制概念中,使用 IEEE 单精度格式可以表示的数字的范围是什么?

考虑到 IEEE 单精度格式的准确定义,我们可以证明使用 IEEE 单精度格式可以表示的浮点数的范围(在限定在正的正规化数的基础上)如下所示:

1.175...× (10-38) 到 3.402... ×(10+38)

第二个问题涉及到用给定格式表示的数字的精度。 我们将通过一些图片和示例来解释这些概念。

二进制浮点计算的 IEEE 标准指定可以用单精度格式表示数字值集。请记住,我们将这种数字值集解释为二进制浮点数字集。IEEE 单精度格式的有效数字有 23 位,加上隐式前导位,可以得到 24 位(二进制)精度。

用户通过在数轴上标记数字(可以表示为 q 个用有效数字表示的十进制数字)可获得不同的数值集:

x = (x1.x2 x3...xq) × (10n)

下图演示的就是这种情况:

图 5  使用数字表示法和二进制表示法定义的数字集比较

image:使用数字表示法和二进制表示法定义的数字集比较

请注意,两个数字集是不同的。因此,要估算相对于 24 位有效二进制数字的有效十进制数字的数量,需要将该问题换一种形式表示。

根据在二进制表示法(计算机使用的内部格式)与十进制格式(用户通常使用的格式)之间转换浮点数的方法,重新组织该问题。事实上,您可能希望先从十进制转换为二进制,然后再转换为十进制,或者先从二进制转换为十进制,然后再转换为二进制。

需要记住的要点是,一般来说,由于数字集不同,转换是不精确的。在正确执行的情况下,将一个集中的数字转换为另一个集中的数字,会导致选择第二个集中两个相邻数字中的一个(确切来说,这是一个与舍入相关的问题)。

我们来考虑一些示例。假定要用以下 IEEE 单精度格式的十进制表示法表示数字:

x = x1.x2 x3... × 10n

由于只能使用 IEEE 单精度格式精确表示有限的实数,而这其中并没有包含所有上述形式的数字,所以一般来说,是无法精确表示这些数字的。例如,使

y = 838861.2,z = 1.3

并运行以下 Fortran 程序:

  REAL Y, Z
  Y = 838861.2
  Z = 1.3
 WRITE(*,40) Y
40  FORMAT("y: ",1PE18.11)
  WRITE(*,50) Z
50  FORMAT("z: ",1PE18.11)

该程序的输出应与以下内容类似:

y: 8.38861187500E+05
z: 1.29999995232E+00

赋予 y 的值 8.388612 × 105 与输出的值之差是 0.000000125,它比 y 小七个数量级。用 IEEE 单精度格式表示 y 的精确度约为 6 到 7 位有效数字,也就是说,如果要表示为 IEEE 单精度格式,y 大约有六位有效数字。

同理,赋予 z 的值 1.3 与输出的值之差是 0.00000004768,它比 z 小八个数量级。用 IEEE 单精度格式表示 z 的精确度约为 7 到 8 位有效数字,也就是说,如果要表示为 IEEE 单精度格式,z 大约有七位有效数字

假定将十进制浮点数 a 转换为其 IEEE 单精度格式二进制表示法 b,然后将 b 再转换为十进制数 c;那么,aa - c 之间相差多少数量级呢?

我们将这一问题改述如下:

用 IEEE 单精度格式表示法表示的 a有效十进制数字数是多少,或当我们用 IEEE 单精度格式表示 x 时,有多少十进制数可以被当作是精确的?

有效十进制数字数总是介于 6 和 9 之间,也就是说,最少 6 个,但不超过 9 个数字是精确的(除去例外情况,例如,当转换是精确的情况,当有无限多的数字可以是精确的情况)。

反过来,如果将用 IEEE 单精度格式表示的二进制数转换为十进制数时,然后再转换为二进制,一般来说,您需要使用至少 9 位十进制数,以确保在经过两次转换后,能够获得转换前的数字。

表 10中进行了全面介绍:

表 10  存储格式的范围和精度
格式
有效数字(二进制)
最小正正规数
最大正数
有效数字(十进制)
单精度
24
1.175... 10-38
3.402... 10+38
6-9
双精度
53
2.225... 10-308
1.797... 10+308
15-17
四倍精度
113
3.362... 10-4932
1.189... 10+4932
33-36
双精度扩展 (x86)
64
3.362... 10-4932
1.189... 10+4932
18-21

2.2.7 Oracle Solaris 环境中的基数转换

基数转换指将在一个基数中表示的数字转换为在另一个基数中表示的数字。 C 中的 printfscanf 以及 Fortran 中的 readwriteprint 等 I/O 例程都涉及到用基数 2 和基数 10 表示的数字间的转换:

  • 当读取用传统十进制表示法表示的数字并将其用内部二进制格式存储时,就会执行从基数 10 到基数 2 的转换。

  • 将内部二进制值作为十进制 ASCII 字符串打印时,系统会执行从基数 2 到基数 10 的转换。

在 Oracle Solaris 环境中,供所有语言使用的基数转换基础例程包含在标准 C 库 libc 中。这些例程使用表驱动算法,这种算法可以在输入格式和输出格式之间实现正确舍入的转换(服从对所涉及的十进制数字字符串长度的适当限制)。除了其精确度外,表驱动算法还减少了正确舍入基数转换出现最差情况的次数。

1985 IEEE 标准要求对数量级从 10–44 到 10+44 的一般数字要正确舍入,而对更大的指数则允许微小差别的舍入。请参见 IEEE 标准 754 的 5.6 节。libc 表驱动算法可以对整个范围的单精度、双精度和双精度扩展格式进行正确的舍入,如修改后的 754-2008 要求的那样。

在 C 中,根据 IEEE 754,总是可以对十进制字符串与二进制浮点值之间的转换进行正确舍入:转换后的结果是结果的格式可以表示的数字,在当前舍入模式指定的方向下,它与原值最接近。当舍入模式是舍入到最接近值并且原值位于两个可用结果格式表示的数字的正中间时,则转换后结果的最低有效位数字是偶数。这些规则适用于编译器执行的源代码中的常数转换,也适用于程序使用标准库例程执行的数据转换。

在 Fortran 中,可以根据与 C 缺省设置相同的规则,对十进制字符串和二进制浮点值进行正确的舍入。对于 I/O 转换,可以使用程序中的 ROUNDING= 说明符或利用 –iorounding 标志编译,覆盖舍入到最接近模式中的“舍入到偶数”规则。有关详细信息,请参见Oracle Developer Studio 12.5:Fortran 用户指南f95(1) 手册页。

有关基数转换的参考信息,请参见参考资料 ,尤其是 Coonen 的论文和 Sterbenz 的书。