La sabiduría común de que los números de coma flotante no se pueden comparar para la igualdad es inexacta. Los números de coma flotante no son diferentes de los enteros: si evalúa "a == b", obtendrá verdadero si son números idénticos y falso de lo contrario (entendiendo que dos NaNs no son números idénticos).
El problema real es este: si he hecho algunos cálculos y no estoy seguro de que los dos números que tengo que comparar son exactamente correctos, ¿entonces qué? Este problema es el mismo para el punto flotante que para los enteros. Si evalúa la expresión entera "7/3 * 3", no se comparará igual a "7 * 3/3".
Supongamos que preguntamos "¿Cómo comparo enteros para la igualdad?" en tal situación. No hay una única respuesta; lo que debe hacer depende de la situación específica, en particular qué tipo de errores tiene y qué desea lograr.
Aquí hay algunas opciones posibles.
Si desea obtener un resultado "verdadero" si los números matemáticamente exactos fueran iguales, entonces podría intentar usar las propiedades de los cálculos que realiza para demostrar que obtiene los mismos errores en los dos números. Si eso es factible, y compara dos números que resultan de expresiones que darían números iguales si se calculan exactamente, entonces obtendrá "verdadero" de la comparación. Otro enfoque es que podría analizar las propiedades de los cálculos y demostrar que el error nunca excede una cierta cantidad, tal vez una cantidad absoluta o una cantidad relativa a una de las entradas o una de las salidas. En ese caso, puede preguntar si los dos números calculados difieren en esa cantidad como máximo y devolver "verdadero" si están dentro del intervalo. Si no puede probar un error vinculado, puedes adivinar y esperar lo mejor. Una forma de adivinar es evaluar muchas muestras aleatorias y ver qué tipo de distribución se obtiene en los resultados.
Por supuesto, dado que solo establecemos el requisito de que sea "verdadero" si los resultados matemáticamente exactos son iguales, dejamos abierta la posibilidad de que sea "verdadero" incluso si son desiguales. (De hecho, podemos satisfacer el requisito siempre devolviendo "verdadero". Esto hace que el cálculo sea simple pero generalmente no es deseable, por lo que discutiremos la mejora de la situación a continuación).
Si desea obtener un resultado "falso" si los números matemáticamente exactos fueran desiguales, debe probar que su evaluación de los números arroja números diferentes si los números matemáticamente exactos fueran desiguales. Esto puede ser imposible para fines prácticos en muchas situaciones comunes. Así que consideremos una alternativa.
Un requisito útil podría ser que obtengamos un resultado "falso" si los números matemáticamente exactos difieren en más de una cierta cantidad. Por ejemplo, tal vez vamos a calcular dónde viajó una pelota lanzada en un juego de computadora, y queremos saber si golpeó un bate. En este caso, ciertamente queremos ser "verdaderos" si la pelota golpea el bate, y queremos ser "falsos" si la pelota está lejos del bate, y podemos aceptar una respuesta "verdadera" incorrecta si la pelota entra una simulación matemáticamente exacta falló el bate pero está a un milímetro de golpear el bate. En ese caso, debemos demostrar (o adivinar / estimar) que nuestro cálculo de la posición de la pelota y la posición del bate tienen un error combinado de como máximo un milímetro (para todas las posiciones de interés). Esto nos permitiría volver siempre "
Entonces, cómo decide qué devolver cuando compara números de punto flotante depende mucho de su situación específica.
En cuanto a cómo probar los límites de error para los cálculos, eso puede ser un tema complicado. Cualquier implementación de punto flotante que use el estándar IEEE 754 en el modo redondeado al más cercano devuelve el número de punto flotante más cercano al resultado exacto para cualquier operación básica (en particular, multiplicación, división, suma, resta, raíz cuadrada). (En caso de empate, redondee para que el bit bajo sea par.) (Tenga especial cuidado con la raíz cuadrada y la división; su implementación de lenguaje podría usar métodos que no se ajustan a IEEE 754 para esos). Debido a este requisito, sabemos que El error en un solo resultado es como máximo la mitad del valor del bit menos significativo. (Si fuera más, el redondeo habría ido a un número diferente que está dentro de la mitad del valor).
Continuar desde allí se vuelve mucho más complicado; El siguiente paso es realizar una operación donde una de las entradas ya tiene algún error. Para expresiones simples, estos errores pueden seguirse a través de los cálculos para alcanzar un límite en el error final. En la práctica, esto solo se hace en algunas situaciones, como trabajar en una biblioteca matemática de alta calidad. Y, por supuesto, necesita un control preciso sobre exactamente qué operaciones se realizan. Los lenguajes de alto nivel a menudo le dan al compilador mucha holgura, por lo que es posible que no sepa en qué orden se realizan las operaciones.
Hay mucho más que podría (y está) escrito sobre este tema, pero tengo que parar allí. En resumen, la respuesta es: no hay una rutina de biblioteca para esta comparación porque no hay una solución única que se adapte a la mayoría de las necesidades que valga la pena poner en una rutina de biblioteca. (Si comparar con un intervalo de error relativo o absoluto es suficiente para usted, puede hacerlo simplemente sin una rutina de biblioteca).