打印
[开发工具]

求平方运算提速

[复制链接]
2514|50
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
jf101|  楼主 | 2024-1-29 14:52 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

一些偏软件的工程师往往会写成这样:

a=pow(a, 2.0);

也许这样兼容性更好,可以处理的数据类型更多,但对于嵌入式来说,效率更为重要。

轩哥曾经排查过一个代码就是如此,这里的pow()函数执行速度慢不说,调用这个函数将会产生2K多的代码,直接导致Flash所剩无几。

对于定点运算,可以改为:

a=a*a;

在有内置硬件乘法器的单片机中(如STM32),乘法运算比求平方运算快得多,因为浮点数的求平方是通过调用子程序来实现的,而自带硬件乘法器的单片机中,乘法运算只需2个时钟周期就可以完成。即使是在没有内置硬件乘法器的单片机中,乘法运算的子程序也要比平方运算的子程序代码短,执行速度快。

如果是求3次方,如:

a=pow(a,3.0);

更改为:

a=a*a*a;

效率的提升会非常明显。

使用特权

评论回复
沙发
tpgf| | 2024-2-1 10:09 | 只看该作者
从单片机执行角度上是如何解释的呢

使用特权

评论回复
板凳
qcliu| | 2024-2-1 11:35 | 只看该作者
现在的单片机支持直接进行平方运算吗

使用特权

评论回复
地板
kxsi| | 2024-2-1 12:11 | 只看该作者
这个只是针对单片机来说需要提高效率 上位机并不需要这样做吧

使用特权

评论回复
5
wiba| | 2024-2-1 12:44 | 只看该作者
如果把立方运算拆成两个乘法运算 会提高效率吗

使用特权

评论回复
6
coshi| | 2024-2-1 20:50 | 只看该作者
pow函数体内部是什么代码 这个可以从哪里看到呢

使用特权

评论回复
7
drer| | 2024-2-1 21:22 | 只看该作者
对这两种不同方式的效率有没有进行实测啊

使用特权

评论回复
8
scu319hy| | 2024-2-2 12:36 | 只看该作者
这和是不是“偏软”没啥关系吧?纯粹是看开发者是否了解编译器及开发环境了。
从设计角度来说,pow是个通用函数,它要能处理各种复杂情况,比如:它要能求根,要能支持浮点数等等。这注定了它不会是多数情况下的性能最优解。
对于一般做平方/立方的场合,我还没见过哪个人用pow函数的...
因为这种场景太过特殊又太过常见。其中的优化空间非常大,比如:如果你的参数是常量,那编译器完全可以直接给出结果。再比如,如果计算上下文中有可以做约分的地方。那么,编译器很有可能也会自动做了这类数学优化。更有一些场景,通过手工量化,完全可以把参数变成2的整数次方,进而把乘法变成移位。甚至编译器还会用地址运算优化乘法...

使用特权

评论回复
9
wwppd| | 2024-2-2 21:05 | 只看该作者
利用位运算的性质来进行平方运算。

使用特权

评论回复
10
mollylawrence| | 2024-2-3 18:54 | 只看该作者
在编译代码时,可以开启编译器的优化选项,以提高代码的执行效率。

使用特权

评论回复
11
sheflynn| | 2024-2-3 20:58 | 只看该作者
可以使用一些快速计算平方的算法,如新平方算法(Newton's Squaring Algorithm)、牛顿迭代法(Newton's Method)等。这些算法通过迭代计算来逼近平方值,具有较高的计算效率。

使用特权

评论回复
12
backlugin| | 2024-2-3 22:22 | 只看该作者
在许多情况下,可以直接将平方运算a=pow(a, 2.0);改写为乘法运算a=a*a;。这样做的好处是,乘法运算通常比平方运算更快,因为浮点数的平方通常是通过调用子程序来实现的,而乘法运算可以通过硬件乘法器直接完成。

使用特权

评论回复
13
olivem55arlowe| | 2024-2-3 22:51 | 只看该作者
在追求运算速度的同时,还要注意功耗的管理,特别是在移动或者电池供电的应用中,低功耗设计是非常重要的。

使用特权

评论回复
14
gygp| | 2024-2-6 09:42 | 只看该作者
在单片机上,数据类型的选择对运算速度有很大影响。例如,使用char类型通常比int类型更快,因为char类型占用更少的内存和缓存空间。

使用特权

评论回复
15
mikewalpole| | 2024-2-6 10:12 | 只看该作者
在计算过程中,尽量减少重复计算,将结果保存下来以便后续运算使用,从而提高运算速度。

使用特权

评论回复
16
kmzuaz| | 2024-2-6 10:40 | 只看该作者
对于经常需要计算的平方值,可以考虑使用查表法。事先计算好一系列值的平方,并将结果存储在程序存储器中,需要时直接从表中查询,这样可以减少实时计算的开销。

使用特权

评论回复
17
benjaminka| | 2024-2-6 12:36 | 只看该作者
可以利用硬件乘法器来进行平方运算。硬件乘法器的运算速度比软件乘法要快得多。

使用特权

评论回复
18
ccook11| | 2024-2-6 13:03 | 只看该作者
如果单片机具有多个处理器核心或并行计算能力,可以利用这些资源并行计算平方运算。例如,可以将平方运算分解为两个部分,分别在两个处理器核心上进行计算,然后将结果合并。

使用特权

评论回复
19
burgessmaggie| | 2024-2-6 17:00 | 只看该作者
选择合适的算法可以显著提高运算速度。例如,对于平方运算,可以使用如下优化公式:x^2 = (x * (x + 1)) / 2 - x,这个公式可以减少乘法操作,从而降低功耗和提高速度。

使用特权

评论回复
20
usysm| | 2024-2-6 20:00 | 只看该作者
现代单片机通常内置硬件乘法器,可以执行更快的乘法操作。例如,STM32系列单片机就有内置的硬件乘法器,可以用于加速平方运算。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

231

主题

1538

帖子

2

粉丝