你能用整数运算代替浮点除法吗?

标签 c performance gcc embedded cortex-m

我使用的 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/

相关文章:

使用动态范围按名称调用

C 字符数组打印为字符串错误并接受空终止?

c - 如何通过PID唤醒进程? (在C中)

java - 提高 JDBC 查询的性能 - ArrayList 比较

java - 对于任务关键型工作负载,64 位 JVM 与 32 位一样好吗?

c++ - 编译器说每个构造函数和函数都被重新定义并且不会编译。我使用的#IFNDEF 错了吗? - C++

linux - 我可以根据头文件 (gcc) 自动查找我在链接时使用的 -l 参数吗?

c - DSP 处理器字大小

c# - 直接返回值或创建临时变量之间的性能差异

c - GCC : weird errors with -O0, 无 无