Por que eu usaria o complemento de 2 para comparar duas duplas em vez de comparar suas diferenças com um valor epsilon?

Referenciado aqui e aqui ... Por que eu usaria o complemento de dois sobre um método epsilon? Parece que o método epsilon seria bom o suficiente para a maioria dos casos.


Update: I'm purely looking for a theoretical reason why you'd use one over the other. I've always used the epsilon method.

Alguém já usou a comparação de complemento do 2 com sucesso? Por quê? Por que não?

0
adicionado editado
Visualizações: 1

6 Respostas

Oskar está certo. Não brinque com isso, a menos que você realmente precise desse desempenho.

E você não Se você estivesse nessa situação, não teria precisado fazer a pergunta - você já saberia. Se você pensa que sim, então você não pensa. Seus problemas de desempenho estão em outro lugar. Basta usar a versão legível.

0
adicionado

O método dos bits pode ser mais rápido. Digo poder porque em processadores modernos (multicore, altamente canalizados) muitas vezes é impossível adivinhar o que é realmente mais rápido. Codifique a implementação mais simples e mais correta, depois meça e opere.

0
adicionado

Quando se trata de velocidade, siga estas regras:

  1. Se você não é um desenvolvedor muito experiente, não otimize.
  2. Se você é um desenvolvedor experiente, não otimize ainda.

Faça o método mais fácil.

Alex

0
adicionado
O que isso tem a ver com o que estou perguntando? Eu quero saber por que você usaria uma abordagem em detrimento de outra, não se deveria otimizar alguma coisa.
adicionado o autor Steve Duitsman, fonte

o segundo link que você mencionou menciona um artigo que tem uma descrição bastante longa do problema:

http://www.cygnus-software.com/papers/comparingfloats/comparingfloats. htm

mas a menos que você esteja aprimorando o desempenho, eu ficaria com o epsilon para que as pessoas pudessem depurar seu código

0
adicionado
Resposta tão curta ... o desempenho é melhor quando comparado ao epsilon?
adicionado o autor Steve Duitsman, fonte
Eu concordo com você. Se nada mais, a legibilidade deve ser minha primeira preocupação.
adicionado o autor Steve Duitsman, fonte
note que o desempenho pode ser pior usando o método inteiro bit-twiddling, já que mover bitstrings entre ponto flutuante e registradores inteiros não é uma operação rápida (dependendo do chip e do conjunto de instruções usado). Eu evitá-lo a menos que você esteja absolutamente certo de que você precisa do desempenho extra, e você não pode obtê-lo (por exemplo) simplesmente escolhendo um epsilon absoluto de forma inteligente.
adicionado o autor Eamon Nerbonne, fonte
Não sei. Eu não usaria nada tão complexo para uma comparação, a menos que comparar números fosse a parte principal do meu aplicativo. Basta imaginar o tempo gasto na depuração de um simples erro de digitação ...
adicionado o autor Oskar, fonte

Em suma, ao comparar dois carros alegóricos com origens desconhecidas, escolher um épsilon válido é quase impossível.

Por exemplo:

O que é um bom epsilon ao comparar a distância em milhas entre Atlanta GA, Dallas TX e algum lugar em Ohio?

O que é um bom epsilon ao comparar a distância em milhas entre o meu pé esquerdo, o meu pé direito e o computador embaixo da minha mesa?

EDITAR:

Ok, estou recebendo um bom número de pessoas que não entendem porque você não sabe qual é o seu épsilon.

Nos velhos tempos do folclore, escrevi dois programas que funcionavam com NeverWinter Nights (um jogo feito pela BioWare). Um dos programas pegou um modelo binário e o converteu para ASCII. O outro programa pegou um modelo ASCII e compilou-o em binário. Um dos testes que escrevi foi pegar todos os modelos binários da BioWare, descompilá-los em ASCII e depois voltar ao binário. Então eu comparei minha versão binária com a original da BioWare. Um dos problemas durante a comparação foi lidar com algumas das pequenas variações nos valores de ponto flutuante. Então, ao invés de criar um monte de EPSILONS diferentes para cada tipo de número de ponto flutuante (vértice, normal, etc), eu queria usar algo como essa comparação de dois pares. Evitando assim toda a questão EPSILON múltipla.

O mesmo tipo de problema pode ser aplicado a qualquer tipo de software que processa dados de terceiros e precisa validar seus resultados com o original. Nesses casos, você pode nem saber o que os valores de ponto flutuante representam, você só precisa compará-los. Nós nos deparamos com esse problema com nosso software de automação industrial.

EDITAR:

LOL, isso foi votado para cima e para baixo por pessoas diferentes.

Vou resumir o problema, dado dois números de ponto flutuante arbitrários , como você decide qual é o epsilon? Você não pode.

Como você pode comparar 1e23 e 1.0001e23 com um epsilon e ainda comparar 1e-23 e 5.2e-23 usando o mesmo épsilon? Claro, você pode fazer alguns truques epsilon dinâmicos, mas esse é o ponto inteiro para a comparação de inteiros (que NÃO requer que os inteiros sejam exatos).

A comparação de inteiros é capaz de comparar dois flutuadores usando um épsilon em relação à magnitude dos números.

EDITAR

Steve, vamos olhar o que você disse nos comentários:

"Mas você sabe o que significa igualdade para você ... Portanto, você deve ser capaz de encontrar um epsilon apropriado".

Gire essa declaração para dizer:

"Se você sabe o que a igualdade significa para você, então você deve ser capaz de encontrar um épsilon apropriado."

O ponto principal para o que estou tentando dizer é que existem aplicações onde não sabemos o que significa igualdade no sentido absoluto, portanto, temos que recorrer a uma comparação relativa, que é o que a versão inteira está tentando fazer.

0
adicionado
Mas você sabe o que significa igualdade para você ... e seu código é o único que os compara. Portanto, você deve ser capaz de encontrar um epsilon apropriado.
adicionado o autor Steve Duitsman, fonte
Epsilon trabalha no domínio do problema, se você está escrevendo um satnav para levá-lo a partir de Dalls-Atlanta, o épsilon é a incerteza em seu GPS
adicionado o autor Martin Beckett, fonte
Isso é verdade, mas meu ponto é que quando você não tem um quadro de referência quanto às origens dos carros alegóricos, escolher um épsilon seria muito difícil.
adicionado o autor Torlack, fonte

Using any method that compares bitwise will result in trouble when fractions are represented by approximations. All floating point numbers with fractions that are not denominated in powers of two (1/2, 1/4, 1/8, 1/65536, &c) are approximated. So, of course, are all irrational numbers.

Terceiro Flutuante = 1/3; float two = 2.0; float another_two = terceiro * 6,0; se (dois! = outro_ dois)    print ("Aproximação! \ n");

O único tempo que compara bit a bit funcionaria é quando você deriva os números de ponto flutuante exatamente da mesma maneira ou eles são representações exatas (números inteiros, potências de fração de dois). Mesmo assim, pode haver várias representações de alguns números, embora eu nunca tenha visto isso em um sistema em funcionamento.

0
adicionado
Nem eu, e é por isso que estou curioso sobre isso.
adicionado o autor Steve Duitsman, fonte