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

6

我读过一些关于计算角度的文章,当我知道Y和X的值时,使用atan2(y,x)计算角度比使用asin和acos单个值更好。我尝试研究了math.h库,但没有找到任何公式。

有人能解释一下为什么atan2更好吗?


很明显,atan2更好的原因是显而易见的:您无需先计算商,您不会遇到一个变量为零或接近零的问题,您也不必调整输出以进入正确的半圆。 - user1084944
顺便说一句,当你提出问题时,通常最好附上代码。这样人们就不必猜测,可以提供更好的答案。此外,为你的代码添加语言标签也是很好的习惯。这将让那些精通该语言的专家更容易地找到你的问题。你可以[编辑]你的问题来包含代码。 - anatolyg
2个回答

2

我猜您正在比较两段代码,它们看起来大致如下:

angle = atan2(x, y);

并且

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

第一部分直接计算所需内容,而第二部分则采用了迂回的方式进行计算 - 人们自然会期望第一个方法更快(除非 atan2 的实现包含第二份示例代码的某种变体)。

此外,atan 是一个相当"原始"的函数 - 它比 "acos" 或 "asin" 更加通用。x87有一个命令用于它,因此我预计旧版本的acos将在内部使用atan2。此外,我对SSE的了解还不够多,但可以合理地预计,即使只是为了与x87兼容,SSE也会实现atan2


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≥0,则

theta = acos(x);

这个方法可能比atan2更简单,也许更快。但是速度会因实现方式而异。atan2可能使用acos和asin或更快的算法来实现。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接