我使用的 Cortex MCU 不支持硬件中的浮点除法。 GCC 编译器通过基于软件的方式解决了这个问题,但警告说它可能非常慢。
现在我想知道如何才能完全避免它们。例如,我可以放大值因子 10000(整数乘法),然后除以另一个大因子(整数除法),并得到完全相同的结果。
但这两个运算实际上通常比单个浮点运算更快吗?例如,替换是否有意义:
int result = 100 * 0.95f
通过
int result = (100 * 9500) / 10000
要达到 95% 吗?
最佳答案
如果可以的话,最好完全摆脱除法。如果除数是编译时常量,这就相对容易了。通常,您安排事情以便任何除法运算都可以用位移代替。所以对于你的例子:
unsigned int x = 100;
unsigned int y = (x * (unsigned int)(0.95 * 1024)) >> 10; // y = x * 0.95
显然,您需要非常清楚 x
的范围,以避免中间结果溢出。
一如既往,请记住过早的优化是有害的 - 只有在您发现性能瓶颈时才使用这样的定点优化。
关于你能用整数运算代替浮点除法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25523421/