NaN(非数)可以用任何满足NaN定义的位模式表示。表2-9中的NaN十六进制值显 示出,小数字段的前导位(最高有效位)决定NN是静态(前导小数位=1)的还是信 号(前导小数位=0)的。 2.2.6 十进制表示法的范围和精度 杰莉减论给定储格式的靠思造度念·本节包含的范慢型德度氨理精度格式利 EEE 具休起见,我们用正E正单精度格式来定义范围和精度概念, EEE标准指定使用32位来表示单精度格式的浮点数。由于32个零和一的组合是有限 的,所以使用32位仅能表示有限个数字。 于是会出现这样一个很自然的问题: 使用这种特定格式表示最大和最小正数的十进制表示法是什么? 下面我们将这一问题改述来引入范围的概念: 在十进制概念中,使用EEE单精度格式可以表示的数字的范围是什么? 考虑到EEE单精度格式的准确定义,我们可以证明使用EEE单精度格式可以表示的浮 点数的范围(在限定在正的正规化数的基础上)如下所示: 1.175.×(10-38)到3.402..×(10+3 第二个问题涉及到用给定格式表示的数字的精度(不要与准确度或有效数字数混淆)。我 们将通过一些图片和示例来解释这些概念。 二进制浮点计算的EEE标准指定可以用单精度格式表示数字值集。请记住,我们将这种 数字值集解释为二进制浮点数字集。EE正单精度格式的有效数字有23位,加上隐式前 导位,可以得到24位(二进制)精度。 我们可以通过用以下方式标记数字来获得另一个数字值集: x=(gx2xxg)(10m) (可以表示为g个用有效数字表示的十进制数字),如数轴所示。 图2-5演示的就是这种情况: 2-12《数值计算指南》·2005年1月
2-12 《数值计算指南》 • 2005 年 1 月 NaN(非数)可以用任何满足 NaN 定义的位模式表示。表 2-9 中的 NaN 十六进制值显 示出,小数字段的前导位(最高有效位)决定 NaN 是静态(前导小数位 = 1)的还是信 号 (前导小数位 = 0)的。 2.2.6 十进制表示法的范围和精度 本节讨论给定存储格式的范围和精度概念。本节包含的范围和精度与 IEEE 单精度格式和 双精度格式以及与 SPARC 和 x86 体系结构上 IEEE 双精度扩展格式的实现相对应。为了 具体起见,我们用 IEEE 单精度格式来定义范围和精度概念。 IEEE 标准指定使用 32 位来表示单精度格式的浮点数。由于 32 个零和一的组合是有限 的,所以使用 32 位仅能表示有限个数字。 于是会出现这样一个很自然的问题: 使用这种特定格式表示最大和最小正数的十进制表示法是什么? 下面我们将这一问题改述来引入范围的概念: 在十进制概念中,使用 IEEE 单精度格式可以表示的数字的范围是什么? 考虑到 IEEE 单精度格式的准确定义,我们可以证明使用 IEEE 单精度格式可以表示的浮 点数的范围 (在限定在正的正规化数的基础上)如下所示: 1.175... × (10-38) 到 3.402... × (10+38) 第二个问题涉及到用给定格式表示的数字的精度(不要与准确度或有效数字数混淆)。我 们将通过一些图片和示例来解释这些概念。 二进制浮点计算的 IEEE 标准指定可以用单精度格式表示数字值集。请记住,我们将这种 数字值集解释为二进制浮点数字集。 IEEE 单精度格式的有效数字有 23 位,加上隐式前 导位,可以得到 24 位 (二进制)精度。 我们可以通过用以下方式标记数字来获得另一个数字值集: x = (x1.x2 x3...x q) (10n) (可以表示为 q 个用有效数字表示的十进制数字),如数轴所示。 图 2-5 演示的就是这种情况:
十进制表示法 01 23456789 20 二进制表示法 1212 2-5 使用十进制表示法和二进制表示法定义的数字集比较 请注意,两个数字集是不同的。因此,要估算相对于24位有效二进制数字的有效十进制 数字的数量,需要将该问题换一种形式表示。 根据在二进制表示法(计算机使用的内部格式)与十进制格式(用户通常使用的格式) 之间转换浮点数的方法,重新表示该问题。事实上,您可能希望先从十进制转换为二进 制,然后再转换为十进制,或者先从二进制转换为十进制,然后再转换为二进制。 需要记住的要点是,一般来说,由于数字集不同,转换是不精确的。在正确执行的情况 个售中 的数字转换为 个焦中的 会导致选择第 个集中两个相邻数字中 的一个(确切来说,这是一个与舍入相关的问题) 我们来考虑一些示例。假定要用以下EEE单精度格式的十进制表示法表示数字: x=x1.x2x3…10m 由于只能使用EEE单精度格式精确表示有限的实数,而这其中并没有包含所有上述形式 的数字,所以一般来说,是无法精确表示这些数字的。例如,使 y=838861.2、z=1.3 并运行以下Fortran程序: REAL Y,Z Y=838861.2 Z=1.3 WRITE(*,40)Y 6 F0RMAT("y:",1PE18.11) WRITE(*,50)Z 50 F0RMmT("z:",1PE18.11) 1EEE算法2-13
IEEE 算法 2-13 图 2-5 使用十进制表示法和二进制表示法定义的数字集比较 请注意,两个数字集是不同的。因此,要估算相对于 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) 0 0 1 100 101 20 2 3 4 5 6 7 8 9 10 20 0 0 1 20 21 23 22 24 1/2 2 4 8 16 2-1 十进制表示法: 二进制表示法:
该程序的输出应与以下内容类似: y: 8.38861187500E+05 z: 1.29999995232E+00 赋予y的值8.388612x105与输出的值之差是0.000000125,它比y小七个数量级。用EE E单精度格式表示y的精确度约为6到7位有效数字,也就是说,如果要表示为EEE单 精度格式,y大约有六位有效数字。 单精度格式表 现在,我们用公式闸述一下这个问题: 假定将十进制浮点数转换为其EEE单精度格式二进制表示法b,然后将b再转换为十 进制数c:那么,a与a-c之间相差多少数量级呢? 我们将这一问题改述如下: 用EEE单精度格式表示法表示的a的有效十进制数字数是多少,或当我们用EEE单精 度格式表示x时,有多少十进制数可以被当作是精确的? 有效十进制数字数点是介王6和9之间,也就是说,最少6个但不超过9个数字提 (除去例外情况,例如, 当转换是精确的情况,当有无限多的数字可以是精确的情 况)。 反过来,如果将用EEE单精度格式表示的二进制数转换为十进制数时,然后再转换为 进制,一般来说,您需要使用至少9位十进制数,以确保在经过两次转换后,能够获得 转换前的数字。 表2-10列出了这一问题的完整说明: 0210 存储格式的范围和精度 格式有效数字(二进制)量小正正视数 最大正数 有效数字(十进制) 单精度 3 1.175.103 3.402.10+38 6-9 双精度 53 2.225.1030 1.797.10*30s 15-17 双精度扩展113 3.362.10-932 1.189.10+-4932 33-36 (SPARC) 忍锈度扩展6 3.362.10-4932 1.189.10-4932 18-21 2-14《数值计算指南》·2005年1月
2-14 《数值计算指南》 • 2005 年 1 月 该程序的输出应与以下内容类似: 赋予 y 的值 8.388612x105 与输出的值之差是 0.000000125,它比 y 小七个数量级。用 IEE E 单精度格式表示 y 的精确度约为 6 到 7 位有效数字,也就是说,如果要表示为 IEEE 单 精度格式, y 大约有六位有效数字。 同理,赋予 z 的值 1.3 与输出的值之差是 0.00000004768,它比 z 小八个数量级。用 IEE E 单精度格式表示 z 的精确度约为 7 到 8 位有效数字,也就是说,如果要表示为 IEEE 单 精度格式, z 大约有七位有效数字。 现在,我们用公式阐述一下这个问题: 假定将十进制浮点数 a 转换为其 IEEE 单精度格式二进制表示法 b,然后将 b 再转换为十 进制数 c ;那么, a 与 a - c 之间相差多少数量级呢? 我们将这一问题改述如下: 用 IEEE 单精度格式表示法表示的 a 的有效十进制数字数是多少,或当我们用 IEEE 单精 度格式表示 x 时,有多少十进制数可以被当作是精确的? 有效十进制数字数总是介于 6 和 9 之间,也就是说,最少 6 个,但不超过 9 个数字是精 确的 (除去例外情况,例如,当转换是精确的情况,当有无限多的数字可以是精确的情 况)。 反过来,如果将用 IEEE 单精度格式表示的二进制数转换为十进制数时,然后再转换为二 进制,一般来说,您需要使用至少 9 位十进制数,以确保在经过两次转换后,能够获得 转换前的数字。 表 2-10 列出了这一问题的完整说明: y: 8.38861187500E+05 z: 1.29999995232E+00 表 2-10 存储格式的范围和精度 格式 有效数字 (二进制) 最小正正规数 最大正数 有效数字 (十进制) 单精度 24 1.175... 10-38 3.402... 10+38 6-9 双精度 53 2.225... 10-308 1.797... 10+308 15-17 双精度扩展 (SPARC) 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 Solaris环境中的基数转换 基数转换指将在一个基数中表示的数字转换为在另一个基数中表示的数字。C中 及 基数0表示的数学间的转换 write和print等I/O例程都涉及到用基数2和 ·当读取用传统十进制表示法表示的数字并将其用内部二进制格式存储时,就会执行从 基数10到基数2的转换。 ·当将内部二进制值作为十进制ASCI字符串打印时,则会执行从基数2到基数10的 转换。 在Solaris环境中,供所有语言使用的基数转换基础例程包含在标准C库1ibc中。这些 例程使用表驱动算法,这种算法可以在输入格式和输出格式之间实现正确舍入的转换(服 从对所涉及的十进制数字字符串长度的适当限制)。除了其精确性外,表驱动算法还减少 了正确舍入基数转换出现最差情况的次数。 EEE标准要求对数量级从104到10+44的一般数字要正确舍入, 面对更大的指数则分 4的5.6节。)1ibc表驱动算法可以对单精 度、双精度和双精度扩展格式进行正确的舍入。 在C中,根据E754,总是可以对十讲字符串与二讲制浮点值之间的转换讲行正确 舍入:转换后的结果是结果的格式可以表示的数字,在当前舍入模式指定的方向下,它与 原值最接近,当舍入模式是舍入到最接近值并且原值 于两个可用结果格式表 的正中间时,则转换后结果的最低有突 这些规则适用于编译器执行的源代 码中的常数转换,也适用于程序使用标准库例程执行的数据转换。 在Fortran中,可以根据与C默认设置相同的规则,对十进制字符串和二进制浮点值进 行正确的舍入。对于I/O转换,可以使用程序中的ROUNDING=说明符或利用 iorounding标记编译,覆盖舍入到最接近模式中的“舍入到偶数”规则。有关详细 信息,请参见(Fortran用户指南》和f95(1)手册页。 有关基数转换的参考信息,请参见附录F。Coonen的论述和Sterbenz的书都是非常好 的参考资料。 2.3 下溢 简而言之,下溢发生在以下情况下:算法运算的结果非常小,必须允许存在大于常规情况 的舍入误差,才能以其预期的目标格式存储它。 1EEE算法2-15
IEEE 算法 2-15 2.2.7 Solaris 环境中的基数转换 基数转换指将在一个基数中表示的数字转换为在另一个基数中表示的数字。C 中 printf 和 scanf 以及 Fortran 中的 read、 write 和 print 等 I/O 例程都涉及到用基数 2 和 基数 10 表示的数字间的转换: ■ 当读取用传统十进制表示法表示的数字并将其用内部二进制格式存储时,就会执行从 基数 10 到基数 2 的转换。 ■ 当将内部二进制值作为十进制 ASCII 字符串打印时,则会执行从基数 2 到基数 10 的 转换。 在 Solaris 环境中,供所有语言使用的基数转换基础例程包含在标准 C 库 libc 中。这些 例程使用表驱动算法,这种算法可以在输入格式和输出格式之间实现正确舍入的转换(服 从对所涉及的十进制数字字符串长度的适当限制)。除了其精确性外,表驱动算法还减少 了正确舍入基数转换出现最差情况的次数。 IEEE 标准要求对数量级从 10-44 到 10+44 的一般数字要正确舍入,而对更大的指数则允 许微小差别的舍入。(请参见 IEEE 标准 754 的 5.6 节。) libc 表驱动算法可以对单精 度、双精度和双精度扩展格式进行正确的舍入。 在 C 中,根据 IEEE 754,总是可以对十进制字符串与二进制浮点值之间的转换进行正确 舍入:转换后的结果是结果的格式可以表示的数字,在当前舍入模式指定的方向下,它与 原值最接近。当舍入模式是舍入到最接近值并且原值位于两个可用结果格式表示的数字 的正中间时,则转换后结果的最低有效位数字是偶数。这些规则适用于编译器执行的源代 码中的常数转换,也适用于程序使用标准库例程执行的数据转换。 在 Fortran 中,可以根据与 C 默认设置相同的规则,对十进制字符串和二进制浮点值进 行正确的舍入。对于 I/O 转换,可以使用程序中的 ROUNDING= 说明符或利用 -iorounding 标记编译,覆盖舍入到最接近模式中的 “舍入到偶数”规则。有关详细 信息,请参见 《Fortran 用户指南》和 f95(1) 手册页。 有关基数转换的参考信息,请参见附录 F。 Coonen 的论述和 Sterbenz 的书都是非常好 的参考资料。 2.3 下溢 简而言之,下溢发生在以下情况下:算法运算的结果非常小,必须允许存在大于常规情况 的舍入误差,才能以其预期的目标格式存储它
2.3.1 下溢阈值 表2-11显示了单精度、双精度和双精度扩展格式的下溢阀值。 表2-11 下溢值 目标精度 下滋调值 单精度 最小正规数 117549435e-38 最大次正规数 1.17549421e-38 双精度 最小正规数 2.2250738585072014e-308 最大次正规数 2.2250738585072009e-308 双精度扩展(SPARC) 最小正规数 3.3621031431120935062626778173217526e4932 最大次正规数 3.3621031431120935062626778173217520e4932 双精度扩展(x86) 最小正规数 3.36210314311209350626e-4932 最大次正规数 3.36210314311209350590e-4932 正次正规数是介于零和最小正规数之间的数。从最小正规数减去两个(正)与之接近的 微小数可以生成次正规数。另外,用最小正正规数除以二也可以生成次正规数。 要处理这种下溢结果,还有其他几种方法可供使用。一种过去常用的方法是,将这些结 果刷新为零。这种方法称为SoO,在引入EEE标准之前,这是大多数大型机的默认 设置。 一方面是获取一种强有力的数学解决方案的愿望,另一方面是创建一种可以有效实施的 标准,在权衡这两方面的过程中,起草EEE标准754的数学家和计算机设计人员考虑过 多种方法。 2.3.2 EEE算法如何处理下溢? EEE标准754选择渐进下溢作为处理下溢结果的首选方法。这种方法可以归结为定义两 种存储值的表示方法:正规数和次正规数。 您应该还记得正规浮点数的正EE格式: -1)°x(2e-bias)x1.t 其中s是符号位,e是偏置指数,f是小数。要完整指定数字,仅需要存储s、e和f由 于对于正规数,将有效数字的隐式前导位定义为1,所以需要存储它。 2-16《数值计算指南》·2005年1月
2-16 《数值计算指南》 • 2005 年 1 月 2.3.1 下溢阈值 表 2-11 显示了单精度、双精度和双精度扩展格式的下溢阈值。 正次正规数是介于零和最小正规数之间的数。从最小正规数减去两个 (正)与之接近的 微小数可以生成次正规数。另外,用最小正正规数除以二也可以生成次正规数。 虽然次正规数本身的精度位数少于正规数,但利用次正规数可以提高微小数字的浮点计 算精度。在数学计算中,当生成的正确结果的数量级低于最小正正规数时,就会生成次正 规数 (而不是返回零),这称为渐进下溢。 要处理这种下溢结果,还有其他几种方法可供使用。一种过去常用的方法是,将这些结 果刷新为零。这种方法称为 Store 0,在引入 IEEE 标准之前,这是大多数大型机的默认 设置。 一方面是获取一种强有力的数学解决方案的愿望,另一方面是创建一种可以有效实施的 标准,在权衡这两方面的过程中,起草 IEEE 标准 754 的数学家和计算机设计人员考虑过 多种方法。 2.3.2 IEEE 算法如何处理下溢? IEEE 标准 754 选择渐进下溢作为处理下溢结果的首选方法。这种方法可以归结为定义两 种存储值的表示方法:正规数和次正规数。 您应该还记得正规浮点数的 IEEE 格式: 其中 s 是符号位,e 是偏置指数,f 是小数。要完整指定数字,仅需要存储 s、e 和 f。由 于对于正规数,将有效数字的隐式前导位定义为 1,所以需要存储它。 表 2-11 下溢阈值 目标精度 下溢阈值 单精度 最小正规数 最大次正规数 1.17549435e-38 1.17549421e-38 双精度 最小正规数 最大次正规数 2.2250738585072014e-308 2.2250738585072009e-308 双精度扩展 (SPARC) 最小正规数 最大次正规数 3.3621031431120935062626778173217526e-4932 3.3621031431120935062626778173217520e-4932 双精度扩展 (x86) 最小正规数 最大次正规数 3.36210314311209350626e-4932 3.36210314311209350590e-4932 (–1)s 2( ) e bias – × ( ) × 1.f