IEEE 754 理解记录

IEEE 754 是最广泛使用的 二进制浮点数算术标准。

组成

浮点法表示一个数分为三个部分:符号位 + 指数 + 尾数;通常我们是用二进制的科学计数法表示出来,如 5(101) 记成 1.01 * 2^2。我们可以称 01 为尾数,2为指数。

  • 符号位 sign

    符号位只占一位,0表示正数,1表示负数

  • 指数 exponent

    通常又称为阶码,后续描述中为了与科学计数法的指数进行区分,我们都称e位二进制的指数部分为“阶码”。

    阶码有 e 位,这里并不是直接用的科学计数法表示出来的指数;而是做了偏移处理,实际存储的指数要偏移 2^(e-1)-1。

    为什么要偏移呢?因为0次方是存在的,但阶码的0却要用于表示特殊的数(零或非规格数),因此需要找其他的数代替0。

    以单精度的举例,阶码有8位,就要偏移 127,看一个对应图就明白了。

    image-20211020213514726

    可以看到单精度可表示的指数范围为 -126 ~ 127。

  • 尾数 fraction

    即表示为科学计数法后的小数部分,如上面的5,尾数部分则是 01。因为二进制中第一个有效数字必定是1,因此可以节约1bit。

IEEE 754规定了四种表示浮点数值的方式:单精确度(32位)、双精确度(64位)、延伸单精确度(43比特以上,很少使用)与延伸双精确度(79比特以上,通常以80位实现)。其中单精度指数域有 8 个bit,尾数有 23 个bit;双精度指数域为 11 bit,尾数为 52 bit。

意义

符号位 阶码 尾数 意义
0/1 0 0 ±零
0/1 0 非0 非规格化数
0/1 1 ~ 2^e-2 任意 规格化数
0/1 2^e - 1(全1) 0 ±无穷
0/1 2^e - 1(全1) 非零 非数值 NaN

1、零

浮点数的0还区分正负,不过一般似乎没有什么区别。只是在除法时有点区别:

double x = 0.0;
double y = -0.0;
1/x == INF; 1/y == -INF;

2、规格化数

规格化的意思是采用科学计数法的规范表示的数。

如单精度的规格化数范围为:

[±(1.xx···xx × 2^{-126} , 1.xx···xx × 2^{127}) ]

其中x为0或1。

3、非规格化数

非规格化可以用于表示比规格化数还接近0的数。如单精度规格化数无法表示 1.01e-128,因为最小的指数为-126,非规格化可以将尾数规则放开。

4、无穷

INF表示无穷,出现无穷的常见情况有:

  • 无穷与自身运算, 如负无穷+2依然是负无穷
  • 被0除, 例如1/0得到正无穷
  • 上溢, 即计算结果超出类型范围

5、非数值

即一些运算过程中出现的非数值情况。NaN还分为两类:

  • QNAN,尾数部分最高位为1,一般表示未定义的算术运算结果,最常见的如除0运算;
  • SNAN,尾数最高位为0;一般被用于标记未初始化的值,以此来捕获异常。
原文地址:https://www.cnblogs.com/cpcpp/p/15431021.html