为什么atan2(y,x)的计算速度比arcsin或arccos快?

时间:2016-06-16 15:04:31

标签: performance trigonometry

我已经读过,当我知道Y和X时,计算atan2(y,x)以获得角度而不是使用asin和acos的单个值会更好。我试图深入研究math.h lib,但我没有找到任何公式。

有人可以解释为什么atan2会更好吗?

2 个答案:

答案 0 :(得分:1)

theta = atan2(y,x);

比以下更简单:

float in = 1.0/sqrt(x*x+y*y);
theta = acos(x*in);
if(y<0)
    theta = -acos(x*in);
else
    theta = acos(y*in);
你不觉得吗?它更简单,也许更快,具体取决于实现。

现在,如果x和y不是任意的,但是如果你可以假设x²+y²= 1且y&gt; = 0,那么

theta = acos(x);

更简单,也许比atan2更快。但同样,速度随实施而变化。 atan2可能会或可能不会使用acos和asin,或者使用更快的算法来实现。

答案 1 :(得分:1)

我猜你正在比较看起来像这样的两段代码:

angle = atan2(x, y);

angle = acos(x / sqrt(x * x + y * y));

(我假设是C代码)

第一部分直接计算你需要的东西,而第二部分以迂回的方式计算它 - 很自然地期望第一部分更快(除非 atan2实现包含一些第二个代码示例的变体)。

此外,atan是一个非常“原始”的功能 - 它“感觉”比“acos”或“asin”更通用。 x87 has a command for it,所以我希望acos的旧实现在内部使用atan2。另外,我对SSE知之甚少,但是期望SSE实现atan2是合理的,即使只是为了与x87的兼容性。