浮点数表示
实数的二进制表示
浮点数在计算机中的存储遵循IEEE标准,但在这里为了方便理解IEEE标准,这里首先阐明一般实数在计算机中是如何存储的。
在这里实数分为两个部分存储:整数部分 和 小数部分,两个部分在逻辑上用 ·
隔开。
比如对于以下浮点数的二进制表示:
$$d_m d_{m-1} \cdots d_1 d_0 \cdot d_{-1} d_{-2} \cdots d_{-n}$$
其中每一位对应的数值如下表所示:
$d_m$ | $d_{m-1}$ | $\cdots$ | $d_1$ | $d_0$ | $d_{-1}$ | $d_{-2}$ | $\cdots$ | $d_{-n}$ |
---|---|---|---|---|---|---|---|---|
$2^m$ | $2^{m-1}$ | $\cdots$ | $2$ | $1$ | $1/2$ | $1/4$ | $\cdots$ | $1/2^{n}$ |
上述二进制表示对应的数值为
$$b = \sum_{i=-n}^{m} {2^{i} \times b_{i}}$$
其中$b_i = 0$ 或 $b_i = 1$,表示第i为是0还是1。
举例说明如何使用上述表示法计算实数:
- $101.11_{2}$ 对应的数值为 $1 \times 2^2 + 0 \times 2^1 + 1 \times 2^0 + 1 \times 2^{-1} + 1 \times 2^{-2} = 5.75$
- $1011.1_{2}$ 对应的数值为 $8 + 0 + 2 + 1 + \frac{1}{2} = 11.5$
IEEE Floating-Point
上述浮点数存储方式的缺点在于如果要表示比较大的数,就需要比较多的二进制位数,比如对于$5 \times 2^{100}$ 就需要103位。IEEE表示就解决了这个问题,在IEEE表示中,浮点数 $V$ 被表示为 $V = (-1)^{s} \times M \times 2^{E}$,其中 $s, M, E$ 的含义如下:
- $s$ 为符号位
- $M$ 为乘法因子
- $E$ 为浮点数的指数部分
IEEE 754标准是定义浮点数表示和算术的国际标准,它定义了多种不同精度的浮点数格式,但最常见的是单精度 single precesion(32位)和双精度 double precesion(64位),浮点数分为 s, exp, frac
三个部分存储:
- $1$ 位的 $s$ 与上述计算公式中的符号位 $s$ 相同,位于浮点数二进制表示的最高位,标志了浮点数的正负,如果 $s = 1$ 的话 $V$ 是负数,如果 $s = 0$ 的话 $V$ 为正数
- $k$ 位的 $exp = e_{k-1} \cdots e_1 e_0$ 用于计算指数部分 $E$,使用原码表示,其中 $E = exp - Bias$,其中 $Bias = 2^{k-1} - 1$
- 对于单精度浮点数,$k = 8$,$Bias = 2^{8-1} - 1 = 127$,$1 \le exp \le 254$,$-126 \le M \le 127$
- 对于双精度浮点数,$k = 11$,$Bias = 2^{11-1} - 1 = 1023$, $1 \le exp \le 1022$,$-1022 \le M \le 1023$
- $n$ 位的 $frac = 0 \cdot f_{n-1} \cdots f_1 f_0$ 用于计算因子 $M$,其中 $M = 1 + frac$,$frac$ 表示的小数计算方式见实数的二进制表示
- 对于单精度浮点数,$n = 23$,$M$ 的最大值为 $2 - 2^{-23}$,$M$ 最小值为 $1$
- 对于双精度浮点数,$n = 52$,$M$ 的最大值为 $2 - 2^{-52}$,$M$ 最小值为 $1$
注意IEEE浮点数表示分为 Normalized Values(正常值) 和 Denormalized Values(非正常值)以及特殊值,上述的计算方式只适用于 Normalized Values, Normalized Values 的 exp 不能为全0或全1,所以上文中 exp 的范围要排除 0 和 最大值的情况。
下图是浮点数各种类型的图示(以单精度浮点数为例):