De fato, quando Sinnott publicou a fórmula haversine, a precisão computacional era limitada. Atualmente, o JavaScript (e a maioria dos computadores e linguagens modernos) usa números de ponto flutuante IEEE 754 de 64 bits, que fornecem 15 números significativos de precisão. Com esta precisão, a fórmula simples da lei esférica de cossenos (
cos c = cos a cos b + sin a sin b cos C
) fornece resultados bem condicionados até distâncias tão pequenas quanto cerca de 1 metro. Em vista disso, provavelmente vale a pena, na maioria das situações, usar a lei mais simples dos cossenos ou a fórmula elipsóide mais precisa da Vincenty, em vez da navalha! (tendo em mente as notas abaixo sobre as limitações de precisão do modelo esférico).
Fonte: http://www.movable-type.co.uk/scripts/latlong.html
Qual é a razão pela qual a lei dos cossenos é mais preferível?
Nota: O texto citado foi atualizado por seu autor, conforme mencionado abaixo .
fonte
Respostas:
O problema é indicado pela palavra "bem condicionado". É uma questão de aritmética computacional, não matemática.
Aqui estão os fatos básicos a serem considerados:
Um radiano na Terra mede quase 10 ^ 7 metros.
A função cosseno para argumentos x próximos a 0 é aproximadamente igual a 1 - x ^ 2/2.
O ponto flutuante de precisão dupla possui cerca de 15 dígitos decimais de precisão.
Os pontos (2) e (3) implicam que, quando x está em torno de um metro ou 10 ^ -7 radianos (ponto 1), quase toda a precisão é perdida: 1 - (10 ^ -7) ^ 2 = 1 - 10 ^ - 14 é um cálculo no qual os 14 primeiros dos 15 dígitos significativos são cancelados, deixando apenas um dígito para representar o resultado. Girar isso (que é o que o cosseno inverso, "acos", faz) significa que calcular acos para ângulos que correspondem a distâncias de comprimento de metro não pode ser feito com precisão significativa. (Em certos casos ruins, a perda de precisão fornece um valor em que nem o acos é definido, portanto o código será quebrado e não dará resposta, uma resposta sem sentido ou travará a máquina.) Considerações semelhantes sugerem que você deve evitar o uso do cosseno inverso se estiverem envolvidas distâncias inferiores a algumas centenas de metros, dependendo da precisão que você deseja perder.
O papel desempenhado pelos acos na fórmula ingênua da lei dos cossenos é converter um ângulo em uma distância. Esse papel é desempenhado por atan2 na fórmula do haversine. A tangente de um pequeno ângulo x é aproximadamente igual a x . Consequentemente, a tangente inversa de um número, sendo aproximadamente esse número, é calculada essencialmente sem perda de precisão. É por isso que a fórmula haversine, embora matematicamente equivalente à lei da lei dos cossenos, é muito superior para pequenas distâncias (da ordem de 1 metro ou menos).
Aqui está uma comparação das duas fórmulas usando 100 pares de pontos aleatórios no globo (usando os cálculos de precisão dupla do Mathematica).
Você pode ver que, para distâncias inferiores a 0,5 metros, as duas fórmulas divergem. Acima de 0,5 metros, eles tendem a concordar. Para mostrar o quanto eles concordam, o próximo gráfico mostra as proporções da lei dos cossenos: resultados de barreiras para outros 100 pares de pontos aleatórios, com latitudes e longitudes diferentes aleatoriamente em até 5 metros.
Isso mostra que a fórmula da lei dos cossenos é boa com 3 a 4 casas decimais quando a distância excede 5 a 10 metros. O número de casas decimais de precisão aumenta quadraticamente; assim, a 50-100 metros (uma ordem de magnitude), você obtém uma precisão de 5-6 dp (duas ordens de magnitude); a 500-1000 metros, você obtém 7-8 dp, etc.
fonte
delta latitude > .1 || delta longitude > .1
para escolher dinamicamente o cosseno (para grandes) ou o haversine (para pequenas distâncias)? Para obter o melhor desempenho e boa precisão.atan2
oferecem benefícios numéricos maisasin
? Vi benchmarks, queatan2
eram 2-3 vezes mais lentos do queasin
e precisamos de um segundosqrt
também.asin
é essencialmente a mesma coisaacos
e, portanto, sofre a mesma perda de precisão para determinados valores - nesse caso, para argumentos próximos a 1 e -1. Em princípio,atan2
não tem esse problema.Uma nota de rodapé histórica:
O haversine era uma maneira de evitar grandes erros de arredondamento em cálculos como
quando x é pequeno. Em termos de barulhento, temos
e 2 * sin (x / 2) ^ 2 podem ser calculados com precisão mesmo quando x é pequeno.
Antigamente, a fórmula haversine tinha uma vantagem adicional de evitar uma adição (o que implicava uma pesquisa antilog, a adição e uma pesquisa de log). Dizia-se que uma fórmula trigonomética que envolvia apenas multiplicações estava em "forma logarítmica".
Atualmente, o uso das fórmulas haversine é levemente anacrônico. Pode ser que o ângulo x seja expresso em termos
sin(x)
ecos(x)
(e x pode não ser explicitamente conhecido). Nesse caso, a computação1 - cos(x)
pela fórmula haversine implica um arco tangente (para obter o ângulo x), metade (para obterx/2
), um seno (para obtersin(x/2)
), um quadrado (para obtersin(x/2)^2
) e uma duplicação final. Você está muito melhor usando a avaliaçãoque não implica avaliações de funções trigonométricas. (Obviamente, use o lado direito apenas se
cos(x) > 0
; caso contrário, não há problema em usá-lo1 - cos(x)
diretamente.)fonte
A fórmula do cosseno pode ser implementada em uma linha:
A fórmula haversine usa várias linhas:
Matematicamente, existem idênticas, portanto, a única diferença é a praticidade.
fonte
atan2
fórmula relacionada ao computador , não há nada que impeça a reescrita das 4 linhas acima em uma única fórmula.atan2(sqrt(a), sqrt(1-a))
é o mesmo queasin(sqrt(a))