Hasta ahora he visto muchas publicaciones relacionadas con la igualdad de números en coma flotante. La respuesta estándar a una pregunta como "¿cómo deberíamos decidir si xey son iguales?" es¿Deberíamos comparar los números de coma flotante para la igualdad con un error * relativo *?
abs(x - y) < epsilon
donde épsilon es un fijo, constante pequeña. Esto se debe a que los "operandos" xey son a menudo el resultado de algún cálculo en el que está involucrado un error de redondeo, por lo tanto, el operador de igualdad estándar == no es lo que queremos decir, y lo que realmente deberíamos preguntar es si xey son cerrar, no igual.
Ahora, siento que si x es "casi iguales" a y, a continuación, también x * 10^20 debe ser "casi igual" a Y * 10^20, en el sentido de que el error relativodebe ser el mismo (pero "relativo" a qué?). Pero con estos números grandes, la prueba anterior fallaría, es decir, esa solución no "escala".
¿Cómo lidiarías con este problema? ¿Deberíamos reescalar los números o reestructurar épsilon? ¿Cómo? (O es mi intuición mal?)
Aquí es una related question, pero no me gusta su respuesta aceptada, por lo reinterpret_cast parece un poco complicado para mí, no entiendo lo que está pasando. Intente proporcionar una prueba simple.
Gracias. El documento también explica las motivaciones detrás del rude cast para int (aunque en el código ordinario yo optaría por la comprensibilidad y uso una de las soluciones all-float :) –
La versión actualizada del enlace de arriba es [Comparación de números de coma flotante, edición de 2012] (http://randomascii.wordpress.com/2012/02/25/comparing-floating-point-numbers-2012-edition/) – sfstewman