浮点数与定点数
- 1. 浮点数的不精确性
- 2. 定点数的表示
- 3. 浮点数的表示
- 参考
1. 浮点数的不精确性
32 比特只能表示 2 的 32 次方个不同的数,差不多是 40 亿个。如果表示的数超过能表示总的个数,那么就会有两个不同的数的二进制表示是一样的。计算机就会不知道这个数是什么。
40 亿个数是无法表示实数集合。需要一种高效的方式将 40 亿个数映射到实数集合。
2. 定点数的表示
我们用 4 比特来表示 0 ~ 9 的整数,那么 32 个比特就可以表示 8 个这样的整数。我们再把最右边的 2 个 0 ~ 9 的整数,当成小数部分;把左边 6 个0 ~ 9 的整数,当成整数部分。这样我们就可以用 32 个比特,表示 0 ~ 999999.99 这样 1 亿个实数了。
这种编码方式叫作 BCD编码(Binary-Coded Decimal)。
其有两个缺点:
- 这样的表示方式有点“浪费”;
- 没办法同时表示很大的数字和很小的数字。
3. 浮点数的表示
现实中,我们会用科学计数法来表示较大的或较小的数。在计算机里,也有一样的方法。浮点数的科学计数法的表示有一个 IEEE 的标准,它定义了两个基本的格式。
一个是用 32 比特表示单精度的浮点数,也就是我们常常说的 float 或者 float32 类型。另外一个是用 64 比特表示双精度的浮点数,也就是我们平时说的 double 或者 float64 类型。
单精度的 32 个比特可以分成三部分。
第一部分是一个符号位,用来表示是正数还是负数。一般用 s 来表示。在浮点数里,我们不像正数分符号数还是无符号数,所有的浮点数都是有符号的。
接下来是一个 8 个比特组成的指数位。一般用 e 来表示。8 个比特能够表示的整数空间,就是 0~255。我们在这里用 1~254 映射到 -126~127 这 254 个有正有负的数上。因为我们的浮点数,不仅仅想要表示很大的数,还希望能够表示很小的数,所以指数位也会有负数。0 (8 个比特全部为 0)和 255(8 个比特全部为 1) 表示非规格数。
最后是一个 23 个比特组成的有效数位。用 f 来表示。
结合科学计数法,浮点数就可以表示成如下:
(
−
1
)
s
×
1.
f
×
2
e
(-1)^s \times 1.f \times 2^e
(−1)s×1.f×2e
表示 0 和一些特殊的数,我们就要用上在 e 里面留下的 0 和 255 这两个表示,这两个表示其实是两个标记位。在 e 为 0 且 f 为 0 的时候,我们就把这个浮点数认为是 0。
在这样的浮点数表示下,不考虑符号的话,浮点数能表示的最小的数和最大的数,差不多是
1.17
×
1
0
−
38
1.17 \times 10^{-38}
1.17×10−38 和
3.40
×
1
0
38
3.40 \times 10^{38}
3.40×1038。比前面的 BCD 编码能够表示的范围大多了。
参考
极客时间《深入浅出计算机组成原理》:http://gk.link/a/11UMi