도움말을 보면 다음과 같이 작성하라고 안내하고 있다.
[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

