首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >优化Pythagoras SQRT()

优化Pythagoras SQRT()
EN

Stack Overflow用户
提问于 2013-08-09 13:23:45
回答 2查看 1.6K关注 0票数 4

经过一些延迟测量测试后,我发现我需要优化一个pythagoras三角形计算,它是在一个非常慢的FPU的嵌入式CPU上完成的。

问题是,如果这些计算发生,它们是以数字形式出现的,这会扰乱时间。我不能减少计算的绝对数量。但不知怎么的他们得快点..。至少按5因素计算:-/

我目前正在考虑对这些计算进行预处理,因为不同值的输入范围在某种程度上仅限于300-500排列,两个表条目之间的插值就足够了。但是,我也在想,是否可以使用一些条件来解决这个问题,也可以加快代码的速度:

代码语言:javascript
复制
float h = 0.f, v=0.f;
/// ...
float const d = std::sqrt( (h*h) + (v*v) );

这个我还没用过:

  1. 结果d的精度被限制在不超过3个小数位的范围内。
  2. 三角形(h,v)的腿总是长径比为4:3或16:9。

我不知道是否有整数不动点计算可用,或者函数是否可以被替换成精度较低的函数,或者以某种方式使用高宽比。

有什么想法吗?

谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-08-09 13:32:08

如果你知道比例是16:9,你可以做一些代数:

代码语言:javascript
复制
h = 16*x
v = 9*x
x = h/16
sqrt((h*h) + (v*v)) = sqrt((16*16*x*x) + (9*9*x*x))
                    = sqrt((16*16+9*9)*x*x)
                    = sqrt(16*16+9*9)*x
                    = sqrt(16*16+9*9)*h/16
                    = sqrt(16*16+9*9)/16 * h

预计算sqrt(16*16+9*9)/16

代码语言:javascript
复制
static float const multiplier = std::sqrt(16*16+9*9)/16.0;

并使用

代码语言:javascript
复制
float const d = multiplier*h;
票数 6
EN

Stack Overflow用户

发布于 2013-08-09 13:29:20

我不知道你在这个嵌入式系统中有多少内存/ROM,但如果你有一些,计算前的方块和平方根可能是要走的路。这假设您的嵌入式CPU具有缓存和/或RAM/ROM访问比浮点计算更快的能力。

这就是说,有一些计算平方根的数值方法,但我不确定它们在实际中是否会比sqrt调用更快,不管速度有多慢。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18147680

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档