优化毕达哥拉斯SQRT()

Hhu*_*hut 3 c++ math sqrt

经过一些延迟测量测试后,我发现我需要优化在具有相当慢的FPU的嵌入式CPU上完成的毕达哥拉斯三角形计算.

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

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

float h = 0.f, v=0.f;
/// ...
float const d = std::sqrt( (h*h) + (v*v) );
Run Code Online (Sandbox Code Playgroud)

我尚未使用过:

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

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

有任何想法吗?

谢谢!

Vau*_*ato 5

如果你知道比例是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
Run Code Online (Sandbox Code Playgroud)

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

static float const multiplier = std::sqrt(16*16+9*9)/16.0;
Run Code Online (Sandbox Code Playgroud)

并使用

float const d = multiplier*h;
Run Code Online (Sandbox Code Playgroud)