经过一些延迟测量测试后,我发现我需要优化一个pythagoras三角形计算,它是在一个非常慢的FPU的嵌入式CPU上完成的。
问题是,如果这些计算发生,它们是以数字形式出现的,这会扰乱时间。我不能减少计算的绝对数量。但不知怎么的他们得快点..。至少按5因素计算:-/
我目前正在考虑对这些计算进行预处理,因为不同值的输入范围在某种程度上仅限于300-500排列,两个表条目之间的插值就足够了。但是,我也在想,是否可以使用一些条件来解决这个问题,也可以加快代码的速度:
float h = 0.f, v=0.f;
/// ...
float const d = std::sqrt( (h*h) + (v*v) );这个我还没用过:
我不知道是否有整数不动点计算可用,或者函数是否可以被替换成精度较低的函数,或者以某种方式使用高宽比。
有什么想法吗?
谢谢!
发布于 2013-08-09 13:32:08
如果你知道比例是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-09 13:29:20
我不知道你在这个嵌入式系统中有多少内存/ROM,但如果你有一些,计算前的方块和平方根可能是要走的路。这假设您的嵌入式CPU具有缓存和/或RAM/ROM访问比浮点计算更快的能力。
这就是说,有一些计算平方根的数值方法,但我不确定它们在实际中是否会比sqrt调用更快,不管速度有多慢。
https://stackoverflow.com/questions/18147680
复制相似问题