O uso do epsilon da máquina é apropriado para testes de igualdade de ponto flutuante?
Este é um acompanhamento paraTeste de igualdade de valor de ponto flutuante: existe um nome padrão para a constante "precisão"?.
Há uma pergunta muito semelhanteDouble.Epsilon
para igualdade, maior que, menor que, menor que ou igual a, maior que ou igual a.
É sabido que um teste de igualdade para dois valores de ponto flutuantex ey deve parecer mais com isso (em vez de simples =):
abdômen(x - y ) <epsilon , Ondeepsilon é algum valor muito pequeno.
Como escolher um valor paraepsilon?
Obviamente, seria preferível escolherepsilon o menor valor possível, para obter a maior precisão possível para a verificação da igualdade.
Como exemplo, a estrutura .NET oferece uma constanteSystem.Double.Epsilon
(= 4.94066 × 10-324), que representa o menor valor positivoSystem.Double
valor maior que zero.
No entanto, verifica-se que esse valor específico não pode ser usado com segurança comoepsilon, Desde a:
0 +System.Double.Epsilon
≠ 0
1 +System.Double.Epsilon
= 1 (!)
ou seja, se eu entendi direito, porque essa constante é menor queepsilon máquina.
→ Isso está correto?
→ Isso também significa que posso usar com segurançaepsilon: = máquina epsilon para testes de igualdade?
Removidas essas duas perguntas, pois elas já foram respondidas adequadamente pela segunda questão SO vinculada ao acima.
O artigo vinculado à Wikipedia diz que para números de ponto flutuante de 64 bits (ou seja, odouble
digitar em vários idiomas), a máquina epsilon é igual a:
2-53Ou aprox. 0,000000000000000111 (um número com 15 zeros após o ponto decimal)
→ Daqui resulta que todos os valores de ponto flutuante de 64 bits têm precisão de 14 (se não 15) dígitos?