Por que minha fórmula construída está fornecendo resultados diferentes da mesma fórmula da UDF no Excel?

Por que minha fórmula construída está fornecendo resultados diferentes da mesma fórmula da UDF no Excel?

Aqui está uma longa fórmula para calcular a distância entre dois pontos de coordenadas na Terra

=ACOS(COS(RADIANOS(90-LAT1)) *COS(RADIANOS(90-LAT2)) +SIN(RADIANOS(90-LAT1)) *SIN(RADIANOS(90-LAT2)) *COS(RADIANOS(Longo1-Longo2) ))) *6371

Como é um pouco complicado usar dentro de outras fórmulas, escrevi uma função definida pelo usuário para isso.

Função DistXY (Lat1 como único, Lng1 como único, Lat2 como único, Lng2 como único) como único

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

Função final

Como você pode ver, eles são exatamente iguais. Como não existem funções Acos ou Radianos no VBA, ele ainda utiliza o método "worksheetFunction".

Por que é que quando aplico essa fórmula ao mesmo par de coordenadas XY, obtenho resultados diferentes?

Por exemplo:

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

DistXY()resultados: 254.313156128

Método de fórmula longa: 254.313268914

Seguindo o comentário de @raystafarian , alterar todos os tipos para dobrar melhorou a precisão. Mas ainda há uma diferença.

Função DistXY(Lat1 como duplo, Lng1 como duplo, Lat2 como duplo, Lng2 como duplo) Como duplo ...

Novos resultados:

DistXY(): 254.3132689135060quilômetros

Método de fórmula longa: 254.3132689135250quilômetros

Responder1

Você está usando (e retornando) um tipo de dados desolteiro. Isso fará com que as funções sejam avaliadas de maneira diferente se adotarem um tipo de dados diferente como padrão.

Responder2

Baseado emde Raystafarianresponder:

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

insira a descrição da imagem aqui

informação relacionada