앞서 기술한 것처럼, 비주얼베이직6.0과 VBA에는 삼각함수의 역함수인 ArcSin()과 ArcCos()이 없다. 대신 Atn()만 있다.
도움말을 보면 다음과 같이 작성하라고 안내하고 있다.
1 2 |
역 사인 (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**가 되는 경우가 발생한다. 이에 대한 대책이 필요하다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
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보다 작은 값들로 사칙연산을 하다보면, 부동소수가 정상 범위를 벗어나는 경우가 생긴다. 이런 오류를 사전에 방지하기 위해서 작성하였다.
태양의 고도를 계산하는 공식은 다음과 같다.
따라서,
- h (태양의 고도) : -90° ~ +90°
- δ (태양의 적위) : -23.5° ~ +23.5°
- L (위도) : -90° ~ +90° (남극 ~ 북극)
- H (시각) : -180° ~ +180° (00시는 -180°, 06시는 -90°, 12시는 0°, 18시는 +90°, 24시는 +180°)
태양 방위각 은 다음과 같은 공식으로 구한다.