2014-03-31 75 views
1

函數atan2接受2個變量xy,因此它可以返回範圍爲2pi的範圍的角度而不是pi。但爲什麼從來沒有tan2這是atan2完全相反,並返回2個值xy基於給定的角度?有沒有更簡單的方法來獲得我失蹤的角度的方向矢量?爲什麼從來沒有tan2?

+0

'sin'和'cos'怎麼樣? –

+0

這就是我的想法 - 有沒有我在這裏失蹤的東西? – Codor

+0

有這樣的功能,它可以做到。看到我的答案。 – Ali

回答

3

深層原因可能是因爲FORTRAN函數返回一個值。

確實,y= sin(x),x= cos(x)是你所需要的。 (另外,y= r * sin(x)x= r * cos(x)允許您提供一個向量長度)。

這種缺乏對用戶和實現一個挫折,因爲它是相當頻繁在同一時間需要兩個值,而這將允許優化掉一些常見的計算。

+0

非常好的一點!問題不是C相關的,但這可能是歷史原因。除此之外,我總是發現函數名'atan2'有點尷尬。 – Codor

+0

值得注意的是,編譯器善於將'x = cos(t); y = sin(t);'優化爲包含它的體系結構中的單個SINCOS指令。 – Sneftel

+0

@Sneftel:Ooops,我的壞(受x和y逆轉的影響)。我正在解決這個問題。我同意SINCOS。 –

2

功能

t => { cos(t), sin(t) } 

將是這樣的功能;但它不會是atan2的「反向」功能。

2

存在tan2 dosent存在,因爲沒有單一的x和y值滿足tan(theta),因爲tan是相鄰相鄰的比率。

讓我們說,tan2確實存在 然後tan2(60°)將返回

opp=sqrt (3) & adj=1 

由於譚(60°)= OPP/ADJ =的sqrt(3)

但它也可能返回

opp=3   & adj=sqrt (3) 

而且這也等於sqrt(3);

由於曬黑是隻返回一個值的比值,即 opposide與相鄰

的比值,也大多數編程語言。如果你既需要sin(x)一個函數只能返回一個值

+0

自然慣例是返回x和y,使它們的2範數是1(例如cos/sin)。 – Sneftel

0

cos(x)爲同一x,你想高效地計算它,有一個GNU擴展中的glibc:

void sincos(double x, double *sin, double *cos); 

看到sincos()math.h

再向前邁進一步,如果海灣合作委員會承認,你既需要sin(x)cos(x)但在簡單的方式計算出它們,即用2函數調用,它會生成代碼,只要求sincos()。我覺得這很整齊。

相關問題