私が作成した数式が、Excel の UDF と同じ数式とは異なる結果を返すのはなぜですか?

私が作成した数式が、Excel の UDF と同じ数式とは異なる結果を返すのはなぜですか?

地球上の2つの座標点間の距離を計算する長い式は次のとおりです。

=ACOS(COS(RADIANS(90-LAT1)) *COS(RADIANS(90-LAT2)) +SIN(RADIANS(90-LAT1)) *SIN(RADIANS(90-LAT2)) *COS(RADIANS(Long1-Long2))) *6371

他の数式内で使用するのは少し面倒なので、そのためにユーザー定義関数を作成しました。

関数 DistXY(Lat1 As Single、Lng1 As Single、Lat2 As Single、Lng2 As Single) As Single

DistXY = WorksheetFunction.Acos(Cos(WorksheetFunction.Radians(90 - Lat1)) * Cos(WorksheetFunction.Radians(90 - Lat2)) + Sin(WorksheetFunction.Radians(90 - Lat1)) * Sin(WorksheetFunction.Radians(90 - Lat2)) * Cos(WorksheetFunction.Radians(Lng1 - Lng2))) * 6371

終了関数

ご覧のとおり、これらはまったく同じです。VBA には Acos または Radians 関数がないため、"worksheetFunction" メソッドも使用されます。

これらの式を同じ XY 座標のペアに適用すると、異なる結果が得られるのはなぜですか?

例えば:

ABC 45.4960674,-73.514446 から XYZ 43.5369,-71.8592 へ

XY距離()結果: 254.313156128

長い式法: 254.313268914

@raystafarian のコメントに従って、すべての型を double に変更すると精度が向上しました。しかし、まだ違いがあります。

関数 DistXY(Lat1 は double、Lng1 は double、Lat2 は double、Lng2 は double) は double として...

新しい結果:

XY距離(): 254.3132689135060キロ

長い式法: 254.3132689135250キロ

答え1

データ型を使用しています(そして返しています)。シングルこれにより、関数がデフォルトの異なるデータ型を取る場合、関数の評価が異なります。

答え2

に基づくレイスタファリアンの答え:

Public Function DistXY(Lat1 As Double, Lng1 As Double, Lat2 As Double, Lng2 As Double) As Double
   Dim i As Double, f As Double
   Dim wf As WorksheetFunction
   Set wf = Application.WorksheetFunction

   i = 90
   f = 6371

   DistXY = wf.Acos(Cos(wf.Radians(i - Lat1)) * Cos(wf.Radians(i - Lat2)) + Sin(wf.Radians(i - Lat1)) * Sin(wf.Radians(i - Lat2)) * Cos(wf.Radians(Lng1 - Lng2))) * f
End Function

ここに画像の説明を入力してください

関連情報