Uso verificações de distância ao quadrado para basicamente todas as minhas verificações de distância (comprimento do vetor3), devido ao aumento de desempenho por não incorrer em uma raiz quadrada (como nas verificações de comprimento simples).
Pelo que parece, as verificações de distância ao quadrado funcionam bem em todas as situações:
if x^2 < y^2, then x < y, even when 0 < (x or y) < 1
Não estou considerando situações em que x ou y é menor que 0, pois a distância e a distância ao quadrado sempre serão positivas.
Como isso funciona, parece que nunca são necessárias verificações de distância, mas sinto que estou perdendo alguma coisa. Isso ainda se mantém em situações críticas de precisão?
fonte
d^2
teve um desempenho horrível. Em A *|dx| + |dy|
funciona bem. Não tenho o link enquanto leio mais ou menos um mês.Como bummzack sugeriu com a analogia de localização de caminho, você PRECISA usar o comprimento "normal" toda vez que adicionar distâncias e desejar comparar sua soma. (Só porque somas de quadrados de comprimentos são diferentes de somas de quadrados de comprimentos).
x ^ 2 + y ^ 2! = (x + y) ^ 2
fonte
A única desvantagem em que consigo pensar é quando se lida com números grandes que transbordam ao quadrado.
Por exemplo, em Java:
Também é importante notar que é o que acontece quando você usa Math.pow () com exatamente os mesmos números e retorna ao int a partir do dobro retornado de
Math.pow()
:Está funcionando? Não , apenas deu a resposta correta porque
y*y
está presaInteger.MAX_VALUE
ex*x
é menor queInteger.MAX_VALUE
. Sex*x
também foi presoInteger.MAX_VALUE
, você obteria uma resposta incorreta.Princípios semelhantes também se aplicam a carros alegóricos e duplos (exceto que obviamente têm um alcance maior antes do transbordamento) e a qualquer outro idioma que silenciosamente permita transbordamentos.
fonte
float
s para coordenadas, que só transbordam depois de10^38
pouco tempoint
.Uma vez eu estava trabalhando em distâncias quadradas e cometi o erro de acumular distâncias quadradas, para uma contagem de odômetros.
Claro, você não pode fazer isso, porque matematicamente,
Então, acabei com um resultado incorreto lá. Opa!
fonte
sqrt
operação de qualquer maneira.Você pode ter problemas se estiver escrevendo um algoritmo que exija a computação de uma posição otimizada. Por exemplo, digamos que você tenha um conjunto de objetos e esteja tentando calcular a posição com a menor distância total de todos os objetos. Apenas para um exemplo concreto, digamos que estamos tentando alimentar três edifícios e queremos descobrir para onde a usina deve ir, para que possamos conectá-la a todos os edifícios usando o menor comprimento total de fio. Usando a métrica da distância ao quadrado, você terminaria com a coordenada x da usina sendo a média das coordenadas x de todos os edifícios (e analogamente para a coordenada y). Usando a métrica de distância comum, a solução seria diferente e geralmente muito distante da solução ao quadrado da distância.
fonte
x^2
é mais fácil trabalhar com isso|x|
.Usar a distância ao quadrado quase sempre é bom e bom para o desempenho. As seguintes considerações são importantes:
Se você quiser pensar na soma de um número de distâncias, a distância ao quadrado será imprecisa. Por exemplo, tenho duas distâncias e quero garantir que a soma seja menor que 10. O código a seguir está incorreto:
Falha ao afirmar no seguinte caso inválido:
a=36
eb=49
. Nesse caso, o primeiro comprimento é 6 e o segundo 7; sua soma é maior que 10, mas a soma dos quadrados não é 100 ou maior.Outra consideração: para distâncias com valor real, a distância ao quadrado sempre será positiva. Se você está medindo o deslocamento, por exemplo, pode ser necessário lidar com valores negativos, e a quadratura deles não é suficiente.
fonte