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,看一个对应图就明白了。
可以看到单精度可表示的指数范围为 -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、规格化数
规格化的意思是采用科学计数法的规范表示的数。
如单精度的规格化数范围为:
其中x为0或1。
3、非规格化数
非规格化可以用于表示比规格化数还接近0的数。如单精度规格化数无法表示 1.01e-128,因为最小的指数为-126,非规格化可以将尾数规则放开。
4、无穷
INF表示无穷,出现无穷的常见情况有:
- 无穷与自身运算, 如负无穷+2依然是负无穷
- 被0除, 例如1/0得到正无穷
- 上溢, 即计算结果超出类型范围
5、非数值
即一些运算过程中出现的非数值情况。NaN还分为两类:
- QNAN,尾数部分最高位为1,一般表示未定义的算术运算结果,最常见的如除0运算;
- SNAN,尾数最高位为0;一般被用于标记未初始化的值,以此来捕获异常。