1 引子
1 2 3 4 |
// ... // float a = 0.2, b=0.4; if(a + b == 0.6) // ... |
这个 if 表达式被判定为 false, 程序没有按照预订执行下去。0.2 + 0.4 = 0.6,这还会有错吗?同事表示其小学数学还是很过关的。 是的,在人类的认知里,这毫无疑问是正确的,但是在计算机的认知里,就不一定了。这需要我们了解浮点数这种数据类型。
2 浮点数
2.1 用二进制表示小数
首先我们来想一下如何来表示一个十进制整数 d:
$$ d_m d_{m-1} ... d_1 d_0 d_{-1} d_{-2} ... d_{-1}, d\in [0,9] $$
这个表示方法描述的数值 d 的定义如下:
$$ d = \sum_{i=-1}^m{10^i \times d_i} $$
同样,引申到小数,小数点左边的数字是 10 的非负幂,得到整数部分;小数点右面的数字是 10 的负幂,得到小数部分。
例如: \(12.34_{10}\) 所表示的字为: \( 1 \times 10^{1} + 2 \times 10^{0} + 3 \times 10^{-1}
+ 4 \times 10^{-2} =12 \frac{34}{100} \)
类似地我们考虑一个二进制数 b 的表示:
$$ b_{m} b_{m-1} ... b_{1} b_{0} b_{-1} ... b_{-n} ,b\in[0,1] $$
它的定义如下:
$$ b = \sum_{i=-n}^{m}2^i \times d_i $$
如 \(10.11_2\) 表示数字: \(1 \times 2^1 + 1 \times 2^{0} + 1 \times 2^{-1} + 1 \times 2^{-2} = 2 \frac{3}{4} \)