Por que minha fórmula construída fornece resultados diferentes da mesma fórmula que a UDF no Excel?

1

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

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

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

Function 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

End function

Como você pode ver, eles são exatamente iguais. Como não há funções Acos ou Radians no VBA, ele até usa o método "worksheetFunction".

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

Por exemplo:

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

Resultados de DistXY () : 254.313156128

Método de fórmula longa : 254.313268914

Acompanhando o comentário do @raystafarian, alterar todos os tipos para o dobro melhorou a precisão. Mas ainda há uma diferença.

Function DistXY(Lat1 As double, Lng1 As double, Lat2 As double, Lng2 As double) As double ...

Novos resultados:

DistXY () : 254.313268913 5060 km

Método de fórmulas longas : 254.313268913 5250 km

    
por P. O. 10.06.2015 / 14:58

2 respostas

2

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

por 10.06.2015 / 15:37
1

Com base na resposta de 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

    
por 10.06.2015 / 15:50