構築した数式が、ExcelのUDFと同じ数式と異なる結果を与えるのはなぜですか?


1

地球上の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としてシングル、Lng1としてシングル、Lat2としてシングル、Lng2としてシングル)シングルとして

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 ou Radians関数がないため、「worksheetFunction」メソッドも使用します。

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

例えば:

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

DistXY()の結果:254.313156128

ロングフォーミュラ法:254.313268914

@raystafarianのコメントと合わせて、すべてのタイプをdoubleに変更すると、精度が向上しました。しかし、まだ違いがあります。

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

新しい結果:

DistXY():254.313268913 5060 km

ロングフォーミュラ法:254.313268913 5250 km


1
これは、計算のさまざまな段階で丸め誤差が発生し、ExcelとVBAがそれらをわずかに異なる方法で処理しているためだと思います。
eirikdaude

回答:



1

Raystafarianの回答に基づく:

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

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


ワークシート関数を数回書くことを避けるためのDim / setはいい感じです。
-PO

@ P.Obertelli私の側の純粋な怠laz!
ゲイリーの学生

最大怠惰のために- superuser.com/a/708388/116196
Raystafarian

@raystafarian WOW !! ...................ありがとうございました!!
ゲイリーの学生

2
@Raystafarian といくつかの癖がありますEvaluateけれども...、
eirikdaude
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.