加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 优化毕达哥拉斯SQRT()

发布时间:2020-12-16 09:46:49 所属栏目:百科 来源:网络整理
导读:经过一些延迟测量测试后,我发现我需要优化在具有相当慢的FPU的嵌入式CPU上完成的毕达哥拉斯三角形计算. 问题是,如果这些计算发生,它们会有数字,这会弄乱时间.我无法减少绝对计算次数.但不知何故,他们需要加快……至少因素5: – / 我目前正在考虑预处理这些
经过一些延迟测量测试后,我发现我需要优化在具有相当慢的FPU的嵌入式CPU上完成的毕达哥拉斯三角形计算.

问题是,如果这些计算发生,它们会有数字,这会弄乱时间.我无法减少绝对计算次数.但不知何故,他们需要加快……至少因素5: – /

我目前正在考虑预处理这些计算,因为不同值的输入范围以某种方式限制在大约300-500个排列,并且两个表条目之间的插值应该足够.但我也想知道如果使用一些条件来解决问题,也可以加快这段代码的速度:

float h = 0.f,v=0.f;
/// ...
float const d = std::sqrt( (h*h) + (v*v) );

我尚未使用过:

>结果d的准确性非常有限,不超过3个小数位
>三角形的腿(h,v)总是长宽比为4:3或16:9

我不知道是否有一些整数定点计算可用于平方根,或者该函数是否可以替换为精度较低或以某种方式使用纵横比的函数.

有任何想法吗?

谢谢!

解决方法

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

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:

static float const multiplier = std::sqrt(16*16+9*9)/16.0;

并使用

float const d = multiplier*h;

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读