2013-05-17 2 views
1

여기에서 죽어 가고 있습니다. 그래서 나는 복잡한 수 (-4.9991 + 15.2631i)를가집니다. MATLAB에서 나는 matlab 각도 함수의 C 등가

angle(-4.9991 + 15.2631i) = 1.8873 

내가이 다른입니다 이유는 기본적으로

atan(15.2631/-4.9991) = -1.2543 

같이 계산 된 각도를 생각한다면? 복소수의 각도를 계산하는 c 함수를 작성해야합니다. 나는 이렇게 이렇게했다 :

#define angle(x) (atan((GSL_IMAG(x)/GSL_REAL(x)))) 

그러나 그 방법은 1.8843 응답, 1.8873 대답을 준다. 내가 도대체 ​​뭘 잘못하고있는 겁니까?

+0

'man atan2' - 단순히'atan'보다 더 유용합니다. –

답변

6
-1.2543 + Pi(radians) = 1.8873 (with rounding) 

다른 사람에 의해 지적, 사용 atan2()

+0

오, 젠장. 음, 모든 것을 해결했습니다. #define angle (x) ((atan (GSL_IMAG (x)/GSL_REAL (x)))) + M_PI) –

+4

아니요 ... 가능한 모든 경우의 절반에서만 true입니다. 위의 조언을 취하고 atan2를 사용하십시오. –

3

atan2를 사용하여 문제를 해결하지만, 실제 질문에 대답하지 않은 :

왜이 다르다? 당신이 z = atan(y/x)을 쓸 때

당신은, 탄젠트 함수는 기간 PI = 3.141592로,주기적인 것을 실종 ... 그래서 당신은 숫자 z 등이 tan(z) = y/x을 기대하지만, 무한 등 번호는 tan(z + pi) = tan(z) 때문에이있다. 물론, 당신은이 무한한 가치들 중 하나를 얻습니다 : 당신이 항상 필요로하는 것이 아닌 0에 가장 가깝습니다.

특히 Im/Re 지수를 계산할 때 -Im/-Re와 차이를 알 수 없다는 점에 유의하십시오. 즉, 두 구성 요소의 빼기 부호는 몫을 변경하지 않지만 반대 방향으로 복소수 (2 차원 벡터에 대해서도 동일). 그것은 atan2angle입니다. 그들은 각 구성 요소의 부호를 별도로 확인한 다음 +/- pi를 atan의 결과에 추가해야하는지 결정합니다.