对于定点处理器来说,浮点数学运算的代价是非常巨大的(大多数嵌入式应用都是定点处理器)。相对于整数数学运算,浮点数学运算慢的要死。每个操作都会调用某个库来实现相应的函数,而这个库通常相当大。即使所使用的浮点数学非常简单,应用程序的大小也是非常惊人的。
(标准的输入输出函数(例如printf和iostream)通常包含浮点处理。即使代码中没有使用浮点,但如果使用了这些函数,那么代码还是会包含浮点算术库。)
除非有很好的理由,否则就应该像躲避瘟疫一样避开浮点数。如果不能避开,可以用伪装。
先介绍二级制换算,这是后面的基础。
除法运算是个成本相对较高的步骤,但是如果是除以常数,则有些方法可以解决这个问题,我们可以将除法用位运算来近似。
以Input/6为例。
Input/6如果将分子和分母都放大同样大的倍数,然后将分母换成离它最近的能用2的幂表示的数,则分母可以写成2的多少次方,然后就可以换成移位运算了。
表1:用2的幂为除数近似1/6
乘数 |
除数 |
等价移位 |
结果 |
误差% |
1 |
6 |
无 |
0.166 666 667 |
0 |
3 |
16 |
4 |
0.1875 |
12.5 |
5 |
32 |
5 |
0.156 25 |
6.2 |
11 |
64 |