Warum liefert meine erstellte Formel andere Ergebnisse als die gleiche Formel als UDF in Excel?

Warum liefert meine erstellte Formel andere Ergebnisse als die gleiche Formel als UDF in Excel?

Hier ist eine lange Formel zur Berechnung der Entfernung zwischen zwei Koordinatenpunkten auf der Erde

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

Da die Verwendung innerhalb anderer Formeln etwas umständlich ist, habe ich dafür eine benutzerdefinierte Funktion geschrieben.

Funktion DistXY(Lat1 als Single, Lng1 als Single, Lat2 als Single, Lng2 als Single) als Single

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

Funktion beenden

Wie Sie sehen, sind sie genau gleich. Da es in VBA keine Acos- oder Radians-Funktionen gibt, wird sogar die Methode „worksheetFunction“ verwendet.

Warum erhalte ich unterschiedliche Ergebnisse, wenn ich diese Formel auf dasselbe Paar XY-Koordinaten anwende?

Zum Beispiel:

Von ABC 45.4960674,-73.514446 nach XYZ 43.5369,-71.8592

DistXY()Ergebnisse: 254.313156128

Lange Formelmethode: 254.313268914

Ich folge dem Kommentar von @raystafarian und habe alle Typen auf „double“ geändert, um die Genauigkeit zu verbessern. Aber es gibt immer noch einen Unterschied.

Funktion DistXY(Lat1 als Double, Lng1 als Double, Lat2 als Double, Lng2 als Double) als Double …

Neue Ergebnisse:

DistXY(): 254.3132689135060km

Lange Formelmethode: 254.3132689135250km

Antwort1

Sie verwenden (und geben zurück) einen Datentyp voneinzelDies führt dazu, dass Funktionen anders ausgewertet werden, wenn sie einen anderen Standarddatentyp annehmen.

Antwort2

Bezogen aufRaystafariansAntwort:

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

Bildbeschreibung hier eingeben

verwandte Informationen