앞서 기술한 것처럼, 비주얼베이직6.0과 VBA에는 삼각함수의 역함수인 ArcSin()과 ArcCos()이 없다. 대신 Atn()만 있다.
도움말을 보면 다음과 같이 작성하라고 안내하고 있다.
역 사인 (ArcSin(x)) =   Atn(x / sqr(-x * x + 1))
역 코사인 (ArcCos(x)) = Atn(-x / sqr(-x * x + 1)) + 2 * Atn(1)

이대로 하면 분모가 0이 되는 경우에 대한 대책뿐만 아니라, x가 -1<=x<=1 범위를 벗어날 경우에 대한 대책이 없다.
특히, 부동소수계산을 하다보면 정확하게 -1 또는 1이 되지 않고, -1.0000000** 또는 1.000000**가 되는 경우가 발생한다. 이에 대한 대책이 필요하다.
 
Function ArcSin(ByVal x As Double) As Double
If Abs(Fix(x)) <> 1 Then '-1<x<1일때는 계산, x<=-2, x>=2 일때는 오류 발생
ArcSin = Atn(x / Sqr(-x * x + 1))
Else ' Abs(Fix(x)) = 1일 때 즉 -2<x<=-1, 1<=x<2
ArcSin = Sgn(x) * Atn(1) * 2
End If
End Function

Function ArcCos(ByVal x As Double) As Double
If Abs(Fix(x)) <> 1 Then ''-1<x<1 일때는 계산, x<=-2, x>=2 일때는 오류 발생
ArcCos = Atn(-x / Sqr(-x * x + 1)) + 2 * Atn(1)
Else ' -2<x<=-1, 1<=x<2
If x > 0 Then 'Fix(x)=1일 때 즉 1<=x<2
ArcCos = 0
ElseIf x < 0 Then 'Fix(x)=-1일 때 즉 -2<x<=-1
ArcCos = Atn(1) * 4
End If
End If
End Function


크리에이티브 커먼즈 라이센스
Creative Commons License

Posted by 솔라뷰

2009/06/11 18:22 2009/06/11 18:22
,
Response
No Trackback , a comment
RSS :
http://www.solarview.net/rss/response/252

Trackback URL : http://www.solarview.net/trackback/252

« Previous : 1 : ... 47 : 48 : 49 : 50 : 51 : 52 : 53 : 54 : 55 : ... 259 : Next »