¿Por qué mi fórmula construida da resultados diferentes a los de la misma fórmula que UDF en Excel?

¿Por qué mi fórmula construida da resultados diferentes a los de la misma fórmula que UDF en Excel?

Aquí hay una fórmula larga para calcular la distancia entre dos puntos de coordenadas en la Tierra.

=ACOS(COS(RADIANES(90-LAT1)) *COS(RADIANES(90-LAT2)) +SIN(RADIANES(90-LAT1)) *SIN(RADIANES(90-LAT2)) *COS(RADIANES(Largo1-Largo2 ))) *6371

Como es un poco complicado de usar dentro de otras fórmulas, escribí una función definida por el usuario para eso.

Función DistXY(Lat1 como única, Lng1 como única, Lat2 como única, Lng2 como única) como única

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.Radianes(Lng1 - Lng2))) * 6371

Función final

Como puedes ver, son exactamente iguales. Como no hay funciones Acos o Radians en VBA, incluso utiliza el método "worksheetFunction".

¿Por qué cuando aplico esta fórmula al mismo par de coordenadas XY obtengo resultados diferentes?

Por ejemplo:

De ABC 45.4960674,-73.514446 a XYZ 43.5369,-71.8592

DistXY()resultados: 254.313156128

Método de fórmula larga: 254.313268914

Siguiendo el comentario de @raystafarian, cambiar todos los tipos al doble mejoró la precisión. Pero todavía hay una diferencia.

Función DistXY(Lat1 Como doble, Lng1 Como doble, Lat2 Como doble, Lng2 Como doble) Como doble...

Nuevos resultados:

DistXY(): 254.3132689135060kilómetros

Método de fórmula larga: 254.3132689135250kilómetros

Respuesta1

Estás usando (y devolviendo) un tipo de datos desoltero. Esto hará que las funciones se evalúen de manera diferente si toman un tipo de datos diferente por defecto.

Respuesta2

Residencia enRaystafarirespuesta:

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

ingrese la descripción de la imagen aquí

información relacionada