4

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

问题是,如果发生这些计算,它们会以数字形式出现,这会打乱时间。我不能减少计算的绝对数量。但不知何故,他们需要变得更快……至少提高 5 倍。:-/

我目前正在考虑对这些计算进行预处理,因为不同值的输入范围以某种方式限制在大约 300-500 个排列,并且两个表条目之间的插值就足够了。但我也想知道是否对问题使用某些条件也可以加快此代码的速度:

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 的纵横比

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

有任何想法吗?

谢谢!

4

2 回答 2

6

如果你知道比例是 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;
于 2013-08-09T13:32:08.157 回答
1

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

也就是说,有计算平方根的数值方法,但我不确定它们在实践中是否会比 sqrt 调用更快,无论多么慢。

于 2013-08-09T13:29:20.300 回答