punto flotante binario .net floating-point compare rounding

.net - binario - ¿Es correcto comparar dos números de coma flotante redondeados usando el operador==?



decimal a punto flotante (6)

Todavía puede fallar debido a los problemas normales con la representación de coma flotante. En lugar de truncarlos, use un delta que represente la precisión equivalente.

Puede fallar en los casos en que tenga dos flotadores que normalmente consideraría lo mismo,

10.19999999

10.20000001

pero cuando los truncas dan resultados diferentes.

10.19

10.20

Mientras que, si hubiera usado un delta de 0.001 para comparar con la diferencia, habría visto que estos dos valores son efectivamente los mismos.

¿O existe la posibilidad de que la operación falle?

Gracias.

Elegí el término equivocado y lo que realmente quise decir fue redondear a 0, no truncar.

El punto es que necesito comparar la parte entera de dos dobles y solo los estoy transfiriendo a int y luego usando ==, pero, como alguien señaló en una de mis preguntas anteriores, esto podría arrojar una excepción de desbordamiento si el el doble no puede caber en el entero.

Entonces, la pregunta sería ''¿Es correcto usar el operador == para comparar dos dobles que se han redondeado previamente a 0, o debería seguir el método de conversión a int y detectar una posible excepción?


Nunca es correcto usar == con coma flotante.

¿Qué significa "truncar" en un contexto de punto flotante? ¿A qué función específica de la biblioteca está llamando? Cual es el resultado? ¿Qué te hace creer que los valores "truncados" son más comparables que los valores no truncados?

El punto flotante es una aproximación de valores decimales. El punto flotante solo puede representar poderes de dos con precisión. Todos los otros valores están sujetos a algún error, sin importar qué operaciones de coma flotante haga.

Sin embargo, si convierte a entero, puede usar == .


Si su valor absoluto es inferior a 2 ^ 23 para single o 2 ^ 52 para double, puede usar round () y luego hacer la comparación. Los valores más grandes no se pueden almacenar con precisión y esto se abre para situaciones donde N == N + 1.


Peor aún es que a veces, incluso para el mismo número exacto, fallará. Esto se debe a que algunos compiladores o procesadores usarán más bits de precisión en un registro de la CPU que en la memoria (MSVC tiene 3 opciones diferentes de comportamiento de coma flotante, por ejemplo). Por lo tanto, un valor recientemente calculado puede no tener estos bits truncados y parecerá ser desigual. NUNCA use == en flotadores.



Aquí está el sitio actualizado que analiza los pros y los contras de varios métodos para comparar números de coma flotante. (Todavía puede ver el sitio anterior aquí ).

El método con el que iría es el método de "error relativo". Encuentra la diferencia entre los dos números, conviértela en un porcentaje de los números, y si ese porcentaje es lo suficientemente pequeño, entonces tienes la igualdad.