Por que eu iria usar complemento de 2 para comparar duas duplas em vez de comparar suas diferenças contra um valor epsilon?

StackOverflow https://stackoverflow.com/questions/96233

  •  01-07-2019
  •  | 
  •  

Pergunta

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


Update: Estou puramente à procura de uma razão teórica por que você usaria um sobre o outro. Eu sempre usei o método epsilon.

Alguém já usou comparação complemento de 2 de sucesso? Por quê? Why Not?

Foi útil?

Solução

o segundo link você faz referência menciona um artigo que tem um longo descrição do problema:

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

mas a menos que você está aprimorando o desempenho eu iria ficar com epsilon que as pessoas possam depurar seu código

Outras dicas

O método pedaços pode ser mais rápido. Eu digo poder, porque na moderna (multicore, altamente pipeline) processadores muitas vezes é impossível adivinhar o que é realmente mais rápido. Código o mais simples implementação mais obviamente correta, em seguida, medir, então optomise.

Em suma, ao comparar dois carros alegóricos com origens desconhecidas, escolhendo um epsilon que é 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, meu pé direito e o computador debaixo da minha mesa?

EDIT:

Ok, eu estou recebendo um bom número de pessoas não entendendo por que você não sabe o que seu epsilon é.

De volta aos velhos dias de lore, escrevi dois programas que trabalharam com Neverwinter Nights (um jogo feito pela BioWare). Um dos programas tomou um modelo binário e convertido para ASCII. O outro programa tomou um modelo ASCII e compilado-lo em binário. Um dos testes que eu escrevi era levar todos modelos binários da BioWare, decompor-los para ASCII e depois voltar para binário. Então eu comparei a minha versão binária com original da BioWare. Um dos problemas durante a comparação foi lidar com alguns dos ligeiras variações em valores de ponto flutuante. Então, em vez de chegar com um monte de diferentes Epsilons para cada tipo de número de ponto flutuante (vértice, normal, etc), eu queria usar algo como este pares elogio comparar. Evitando assim toda a questão EPSILON múltipla.

O mesmo tipo de problema pode ser aplicado a qualquer tipo de software que processa os dados do 3o partido e, em seguida, precisa validar os seus resultados com o original. Nestes casos, você pode até não saber o que os valores de ponto flutuante representam, você só tem que compará-los. Nós corri para este problema com o nosso software de automação industrial.

EDIT:

LOL, este tem sido votado cima e para baixo por pessoas diferentes.

Vou ferver o problema para baixo a este, dada dois arbitrária números de ponto flutuante, como você decide o que epsilon de usar? Você não pode.

Como você pode comparar 1e23 e 1.0001e23 com um epsilon e ainda comparar 1e23 e 5.2E-23 usando o mesmo epsilon? Claro, você pode fazer alguns truques epsilon dinâmico, mas esse é o ponto inteiro para o número inteiro comparar (que não exige que o inteiros ser exato).

O inteiro comparar é capaz de comparar dois carros alegóricos usando um epsilon relação à magnitude dos números.

Editar

Steve, vamos olhar para 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".

Vire esta afirmação em torno a dizer:

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

O ponto inteiro para o que estou tentando dizer é que existem aplicações onde não sabemos o que significa em sentido absoluto igualdade, portanto, temos de recorrer a um parente comparar que é o que a versão inteiro está tentando fazer.

Quando se trata de velocidade, siga estas regras:

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

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

Alex

direita de Oskar. Não parafuso a menos que você realmente, realmente precisa que o desempenho.

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

O uso de qualquer método que compara bit a bit irá resultar em problemas quando frações são representados por aproximações. Todos os números de ponto flutuante com fracções que não são expressos em potências de dois (1/2, 1/4, 1/8, 1/65536, e c) são aproximadas. Então, é claro, são todos os números irracionais.

flutuador terceiro = 1/3; flutuar duas = 2,0; flutuar another_two = terceiro * 6.0; if (dois! = another_two) imprimir ( "Aproximação! \ n");

A única vez comparar bit a bit iria trabalhar é quando você obter os números de ponto flutuante exatamente da mesma maneira ou eles são representações exatas (números inteiros, poderes fração de dois). Mesmo assim, pode haver múltiplas representações de alguns números, embora eu nunca vi isso em um sistema de trabalho.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top