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

Sin*_*gee 6 performance trigonometry

我读过,当我知道 Y 和 X 时,最好通过计算atan2(y,x)来获取角度,而不是使用带有 asin 和 acos 的单个值。我试图深入研究math.hlib 但没有找到任何公式。

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

gal*_*tte 1

theta = atan2(y,x);\n
Run Code Online (Sandbox Code Playgroud)\n\n

比以下更简单:

\n\n
float in = 1.0/sqrt(x*x+y*y);\ntheta = acos(x*in);\nif(y<0)\n    theta = -acos(x*in);\nelse\n    theta = acos(y*in);\n
Run Code Online (Sandbox Code Playgroud)\n\n

你不觉得吗?它更简单,而且可能更快,具体取决于实现。

\n\n

现在,如果 x 和 y 不是任意的,但如果您可以假设 x\xc2\xb2+y\xc2\xb2=1 且 y>=0,那么

\n\n
theta = acos(x);\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n