앞서 기술한 것처럼, 비주얼베이직6.0과 VBA에는 삼각함수의 역함수인 ArcSin()과 ArcCos()이 없다. 대신 Atn()만 있다.
도움말을 보면 다음과 같이 작성하라고 안내하고 있다.
[code]역 사인 (ArcSin(x)) =   Atn(x / sqr(-x * x + 1))
역 코사인 (ArcCos(x)) = Atn(-x / sqr(-x * x + 1)) + 2 * Atn(1)[/code]
이대로 하면 분모가 0이 되는 경우에 대한 대책뿐만 아니라, x가 -1<=x<=1 범위를 벗어날 경우에 대한 대책이 없다.
특히, 부동소수계산을 하다보면 정확하게 -1 또는 1이 되지 않고, -1.0000000** 또는 1.000000**가 되는 경우가 발생한다. 이에 대한 대책이 필요하다.
 
[code lang-vb]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[/code]

Posted by solarview

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 : ... 84 : 85 : 86 : 87 : 88 : 89 : 90 : 91 : 92 : ... 296 : Next »