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

退出打印视图

更新时间: 2015 年 1 月
 
 

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)

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

图 2-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 位十进制数,以确保在经过两次转换后,能够获得转换前的数字。

Table 2–10 列出了这一问题的完整说明:

表 2-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