Flutuante equivalência ponto?
-
05-07-2019 - |
Pergunta
Eu quero ser capaz de comparar dois duplos desconsiderando uma possível perda de precisão. Já existe um método que manipula neste caso?
Se não, existe um limiar / orientação para saber quanto é uma equivalência adequada entre dois duplos?
Solução
O limiar é completamente dependente para o problema em si. Para alguns problemas, você pode considerar 1.001 igual a 1.002 e para alguns problemas, você pode precisar de um limiar muito menor.
O techique geral é:
Math.Abs(a - b) < some_epsilon // `a` is roughly equivalent to `b`
Outras dicas
Um muito bom, opção completa para isto é:
public static bool DoubleEquality(double a, double b)
{
const double epsilonValue = 1e-15;
if (double.IsNaN(a))
return double.IsNaN(b);
else if (double.IsInfinity(a))
return double.IsInfinity(b);
else if (a == 0)
return b == 0;
else
return Math.Abs(a - b) <= Math.Abs(a * epsilonValue);
}
Note que Double.Epsilon não é um valor bom epsilon para isso. Isso cria um epsilon que as escalas um pouco com a magnitude do seu primeiro valor, o que ajuda um pouco.
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow