2009-10-07 23 views
6

acabo de leer una declaración sobre el punto flotante comparación de valoresComparando los valores de punto flotante

valores de punto flotante no se pueden comparar utilizando el == o! = operadores. La mayoría de los valores de punto flotante no tienen representación binaria exacta y tienen una precisión limitada .

En caso afirmativo, ¿cuál es el mejor método para comparar dos valores de coma flotante?

+0

¿Puede explicar por qué necesita compararlos? ¿O solo tienes curiosidad acerca de esa documentación? – rjmunro

+0

posible duplicado de [¿Cómo debo hacer la comparación de coma flotante?] (Http://stackoverflow.com/questions/4915462/how-should-i-do-floating-point-comparison) – Magnus

Respuesta

7

Los siguientes métodos de extensión pueden ser útiles para poner en práctica la sugerencia de Kevin:

public static bool IsEqualTo(this double a, double b, double margin) 
{ 
    return Math.Abs(a - b) < margin; 
} 

public static bool IsEqualTo(this double a, double b) 
{ 
    return Math.Abs(a - b) < double.Epsilon; 
} 

Así que ahora sólo se puede hacer:

if(x1.IsEqualTo(x2)) ... 
if(x1.IsEqualTo(x2, 0.01)) ... 

Sólo cambia el IsEqualTo a un nombre más apropiado, o cambiar el margen predeterminado a algo mejor que double.Epsilon, si es necesario.

3

números de punto Generalmente flotantes deben compararse utilizando un constructo como

if(abs((x1 - x2) < 0.001)) 

La razón por la advertencia que citan es que puede tener dos métodos de cálculo de algo, y que puede ser igual si no tuviera error de redondeo , pero el error de redondeo los hace ligeramente diferentes.

+1

use 'abs (x1 - x2) <0.001 * x1 'en su lugar –

+0

@Alexandre: ¿Por qué? Sería útil si pudiera darnos alguna explicación. – shuhalo

+1

@ user411768: esto se debe a "en general". En general, se compara la precisión relativa, no absoluta. ¿Qué pasa si x1 y x2 están en el orden de 10^-6, pero x1 es cinco veces más grande que x2? Seguramente no querrás que la construcción anterior te diga que x1 == x2. Sin embargo, hay casos en los que la precisión absoluta es correcta. El sujeto es difícil. –

2

"Mejor método" depende de las circunstancias por las que desea comparar los números. En general, si crees que quieres verificar si 2 números de puntos flotantes son iguales, estás haciendo algo mal.

Se supone que los números de punto flotante se utilizan para representar valores reales, en ambos sentidos de la palabra. ¿Este objeto tiene la misma longitud que este otro objeto? Bueno, pueden parecer del mismo largo, pero si obtienes un dispositivo de medición lo suficientemente bueno, siempre puedes encontrar la diferencia. De manera similar, dos números de coma flotante nunca son iguales, a menos que estén midiendo la misma cosa y se hayan procesado exactamente de la misma manera. Aparte de eso, es solo un error de redondeo en algún lugar del sistema.

Es posible que desee comprobar que están cerca, (más cerca de un cierto umbral) como las otras respuestas han sugerido, pero no iguales.

Cuestiones relacionadas