浮点数绝对是计算机系统里最神秘的一种数值。在不了解它之前,很难想象同样是32位数值,int只能表示最大2的31次方,而浮点的表示范围却是-126到正的127次方。
以及浮点还能表示无穷大,NaN等特殊值。
我们也被教育浮点数计算的一些计算规则,例如很大的浮点跟小的浮点计算的时候,要先算小的。
例如判断浮点跟0时,时常使用 if (fval <= 0.00001f) 这种表达式来判断数值是不是可以被当做0了。今天我们就来一起走近神奇的浮点数。
2.4 浮点
浮点数对形如 V = x ∗ 2 y V = x*2^y V=x∗2y 的有理数进行编码。
大约在1985年,IEEE标准754的推出,才有了浮点数标准。
由于浮点数的表示方法,必然产生舍入的问题,当一个数字无法精确用这种方式表示的时候,就需要向上或者向下进行舍入。
不难理解32位浮点表示范围比32整数范围大那么多,那么必然出现很多数值其实浮点数是表达不了的。
2.4.1 二进制小数
理解浮点数的第一步是理解二进制小数。
十进制小数可以表示为
d m d m − 1 ⋯ d 1 d 0 . d − 1 d − 2 ⋯ d − n d = ∑ i = − n m 1 0 i × d i d_md_{m-1} \cdots d_1d_0.d_{-1}d_{-2}\cdots d_{-n} \\ d = \sum_{i=-n}^{m}10^i \times d_i dmdm−1⋯d1d0.d−1d