计算百分比的浮点乘法的快速替代方案

int*_*tar 5 performance heuristics arduino integer-division integer-arithmetic

我正在 Arduino 上编写一些代码,该代码需要快速运行并对整数百分比进行粗略近似。

例如,给定一个数字,我想找到它的 90%、70% 或 30% 等。最明显的方法是乘以浮点,例如。x * 0.9;或 x * 0.3;但因为我需要速度,所以我想避免浮点计算。如果我只是除以 2 的幂,我会进行按位移位,但是是否有类似的技术可以使用整数来近似 90%、80% 等?

Mys*_*ial 5

您可以使用具有二次方分母的分数来近似这些百分比。

这是一个简单的例子2^16

90% = 90 / 100 ~ 58982 / 65536
70% = 70 / 100 ~ 45875 / 65536
30% = 30 / 100 ~ 19661 / 65536

 x% =  x / 100 ~ x * 655 / 65536
Run Code Online (Sandbox Code Playgroud)

除法(现在是二的幂)可以通过轮班来完成。

当然,可能需要一些预先计算才能生成这些分数。

  • 如果您希望它更好地舍入,您还可以尝试“(y * x * 655 + 32768) / 65536”。 (2认同)