[VB6, VBA]삼각함수의 역함수(ArcSin, ArcCos) 작성

앞서 기술한 것처럼, 비주얼베이직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=2 일때는 오류 발생
    ArcSin = Atn(x / Sqr(-x * x + 1))
  Else ‘ Abs(Fix(x)) = 1일 때 즉 -2 1 
    ArcSin = Sgn(x) * Atn(1) * 2
End Function

Function ArcCos(ByVal x As Double) As Double
    If Abs(Fix(x)) <> 1 Then 'If (-1 < x) And (x < 1) Then
        ArcCos = Atn(-x / Sqr(-x * x + 1)) + 2 * Atn(1)
    Else
        If x > 0 Then 'Fix(x)=1일 때
            ArcCos = 0: Exit Function
        ElseIf x < 0 Then 'Fix(x)=-1일 때
            ArcCos = Atn(1) * 4: Exit Function
        End If
    End If
End Function

FYI

ArcSin, ArcCos을 작성한 이유 : 태양기하학에서는 태양의 방위각과 고도를 계산하는 과정에서 삼각함수를 많이 사용한다. 1보다 작은 값들로 사칙연산을 하다보면, 부동소수가 정상 범위를 벗어나는 경우가 생긴다. 이런 오류를 사전에 방지하기 위해서 작성하였다.

태양의 고도를 계산하는 공식은 다음과 같다.

\sin h = \sin \delta \sin L + \cos \delta  \cos L \cos H

따라서,

h = \arcsin \left( \sin \delta \sin L + \cos \delta \cos L \cos H \right)

  • h (태양의 고도) : -90° ~ +90°
  • δ (태양의 적위) : -23.5° ~ +23.5°
  • L (위도) : -90° ~ +90° (남극 ~ 북극)
  • H (시각) : -180° ~ +180° (00시는 -180°, 06시는 -90°, 12시는 0°, 18시는 +90°, 24시는 +180°)

태양 방위각 \phi 은 다음과 같은 공식으로 구한다.

\cos \phi = \frac{\sin h \sin L - \sin \delta}{\cos h \cos L}

 \phi =\arccos \left( \frac{\sin h \sin L - \sin \delta}{\cos h \cos L} \right)
Print Friendly, PDF & Email

One Reply to “[VB6, VBA]삼각함수의 역함수(ArcSin, ArcCos) 작성”