2016-06-16 46 views
3

我讀過,當我知道Y和X時,最好計算atan2(y,x)以獲得角度,而不是在asin和acos中使用單個值。我試圖挖掘math.h庫,但我沒有找到任何公式。爲什麼atan2(y,x)比arcsin或arccos計算更快?

有人可以解釋爲什麼atan2更好?

+0

那麼,爲什麼'atan2'更好*顯然是有原因的:你不需要首先計算一個商,你沒有任何問題,一個變量爲零或幾乎是這樣,你沒有調整輸出以獲得正確的半圓形。 – Hurkyl

+0

順便提一下,當你提出問題時,通常會發布代碼。這樣人們不必猜測,並會提供更好的答案。另外,爲代碼的語言添加標籤也是很好的選擇。這將使該語言的專家更容易找到你的問題。你可以[編輯]你的問題來包含代碼。 – anatolyg

回答

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 2 + y 2 = 1個,Y> = 0,則

theta = acos(x); 

更簡單,也許比ATAN2快。但是,速度隨實現的不同而不同。 atan2可能或可能不會使用acos和asin來實現,或者使用更快的算法。

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兼容。

相關問題