Life

Thursday, May 7, 2020

IEEE 754浮点数标准

 IEEE 754浮点数标准

IEEE 754(IEEE Standard for Binary Floating-Point Arithmetic,ANSI/IEEE Std 754-1985) 是 IEEE(Institute of Electrical and Electronics Engineers,电子电气工程师协会)于1985年制订的二进制浮点运算标准,该标准限定指数的底为 2。目前,几乎所有的计算机都支持 IEEE 754 标准,它大大地改善了科学应用程序的可移植性。

IEEE 754标准准确地定义了单精度和双精度浮点格式,并为这两种基本格式分别定义了扩展格式,如下所示:

  • 单精度浮点格式(32 位)。
  • 双精度浮点格式(64 位)。
  • 扩展单精度浮点格式(≥43 位,不常用)。
  • 扩展双精度浮点格式(≥79 位,一般情况下,Intel x86 结构的计算机采用的是 80 位,而 SPARC 结构的计算机采用的是 128 位)。
其中,只有 32 位单精度浮点数是本标准强烈要求支持的,其他都是可选部分。以下匀针对单精度浮点格式进行解释,其它格式以此类推

IEEE 754标准表示法

754标准从逻辑上用三元组{S,E,M}来表示一个数V,即V=(-1)S×M×2E.

  • 符号位 s(Sign)决定数是正数(s=0)还是负数(s=1),而对于数值 0 的符号位解释则作为特殊情况处理。
  • 有效数字位 M(Significand)是二进制小数,它的取值范围为 1~2,或者为 0~1。它也被称为尾数位(Mantissa)。
  • 指数位 E(Exponent)是 2 的幂(可能是负数),它的作用是对浮点数加权。

IEEE 754 标准表示的浮点数的数据位被划分为三个段,从而对以上这些值进行编码。其中,一个单独的符号位 s 直接编码符号 s;k 位的指数段 exp=ek-1…e1e0,编码指数 E;n 位的小数段 frac=fn-1…f1f0,编码有效数字 M,但是被编码的值也依赖于指数域的值是否等于 0。

以单精度浮点数为例,单精度浮点格式共 32 位,其中,s、exp 和 frac 段分别为 1 位、k=8 位和 n=23 位,如图 所示。

根据exp的值,IEEE 754编码的值的格式可以分为如下几种不同的情况。

1.格式化值

       当指数段 exp 的位模式既不全为 0(即数值 0),也不全为 1(即单精度数值为 255,以单精度数为例, 8 位的指数为可以表达 0~255 的 255 个指数值。排除全0与全1的情况,8位指数可以表达1~254之间的任一指数值。但是,指数可以为正数,也可以为负数。为了处理负指数的情况,实际的指数值按要求需要加上一个偏置(Bias)值作为保存在指数段中的值。因此,这种情况下的指数段被解释为以偏置形式表示的有符号整数。即指数的值为:E=e-Bias。754标准规定单精度中偏置值Bias为127,由此可得知指数的取值范围为:1-127~254-127,即-126~127)的时候,就属于这种情况。
       对小数段 frac,可解释为描述小数值 f,其中 0≤f<1,其二进制表示为 0.fn-1…f1f0,也就是二进制小数点在最高有效位的左边。有效数字定义为 M=1+f。有时候,这种方式也叫作隐含的以 1 开头的表示法,因为我们可以把 M 看成一个二进制表达式为 1.fn-1fn-2…f的数字。既然我们总是能够调整指数 E,使得有效数字 M 的范围为 1≤M<2(假设没有溢出),那么这种表示方法是一种轻松获得一个额外精度位的技巧。同时,由于第一位总是等于 1,因此我们就不需要显式地表示它。拿单精度数为例,按照上面所介绍的,实际上可以用 23 位长的有效数字来表达 24 位的有效数字。(仔细思考,在十进制科学计数法中,有效数字M的范围为1≤M<10,我们无法确定有效数字的第一位到底是1~9之间的哪一个,而在二进制中,规范的有效数字的第一位必然是1,若是0,那便是不规范格式,可通过调整指数E保证第一位为1)。因此有效数字M在存储时将去掉小数点左侧的1,并在右侧用0补齐。
以实数-9.625为例,运用上述规则,将其表达为754标准的浮点数格式:
(1)首先,需要将 -9.625 用二进制浮点数表达出来,然后变换为相应的浮点数格式。使用整数位除2取余,小数位乘2取整的方法, -9.625 的二进制为 1001.101,用规范的浮点数表达应为 1.001101×2^3。
(2)因为 -9.625 是负数,所以符号段为 1。而这里的指数为 3,所以指数段为 3+127=130=128+2,即二进制的 10000010。有效数字省略掉小数点左侧的 1 之后为 001101,然后在右侧用零补齐。因此所得的最终结果为:

2.特殊值

IEEE 754标准指定了以下特殊值:

  • 有符号零:符号位指定零是+0(正零)还是-0(负零)。
  • 两个无穷大:+∞和-∞。
  • 两种NaN(非数字):静默NaN(qNaN)和信令NaN(sNaN)。
有符号零,无穷(+∞和-∞)的有效数字M=0,不在规范化数所规定的1≤M<2的范围之中。
当指数段 exp 全为 0 ,符号位S为0时,即是+0(正零);
当指数段 exp 全为 0 ,符号位S为1时,即是-0(负零);
当指数段 exp 全为 1 ,符号位S为0时, 为+∞;
当指数段 exp 全为 1 ,符号位S为1时, 为-∞。

无穷用于表达计算中产生的上溢问题。比如两个极大的数相乘时,尽管两个操作数本身可以保存为浮点数,但其结果可能大到无法保存为浮点数,必须进行舍入操作。根据IEEE标准,此时不能将结果舍入为可以保存的最大浮点数(因为这个数可能与实际的结果相差太远而毫无意义),而应将其舍入为无穷。对于结果为负数的情况也是如此,只不过此时会舍入为负无穷,也就是说符号域为1的无穷。
NaN是指当指数段 exp 全为 1 时,小数段为非零时的结果值。静默NaN和信令NaN通过有效数字的最高有效位进行区分,而有效载荷则承载在其余位中。

在例如0/0之类的表达式会产生导致计算终止的不可恢复错误,但是,一些示例表明在这样的情况下继续进行计算是有意义的。这时候就可以通过引入特殊值 NaN,使例如0/0之类的表达式产生NaN而不是停止计算来避免此类问题。下表列出可能导致NaN的表达式:

此外,还有一部分非格式化值, 当指数段 exp 全为 0时,所表示的数就是非规格化形式,如图所示。

在这种情况下,而有效数字的值 M=f,也就是说它是小数段的值,不包含隐含的开头的 1。

显然,有符号零属于特殊的非格式化值。

另外,非格式化值表示那些非常接近于 0.0 的数。他们被称之为异常数


以上主要归纳出IEEE 754标准的格式规范与转换方法,以及该标准下的特殊数值。了解此部分知识主要是为了理解与解决实际生产活动中出现的小数相加相减的结果超出预期的情况,例如0.6+0.3+0.1=0.99999999999999990.1+0.3+0.6=1(可在浏览器控制台中尝试)。

对此部分有深入了解兴趣的可参考:

         IEEE 754浮点数标准详解

       维基百科

      



版权声明
本博客所有的原创文章,作者皆保留版权。转载必须包含本声明,保持本文完整,并以超链接形式注明作者Leslie Tien和本文原始地址:
https://leslietien.blogspot.com/2020/05/ieee-754.html

No comments:

Post a Comment