A sabedoria comum de que números de ponto flutuante não podem ser comparados quanto à igualdade é imprecisa. Os números de ponto flutuante não são diferentes dos números inteiros: se você avaliar "a == b", será verdadeiro se eles forem números idênticos e falsos caso contrário (com o entendimento de que dois NaNs não são, obviamente, números idênticos).
O problema real é este: se eu fiz alguns cálculos e não tenho certeza de que os dois números que devo comparar estão exatamente corretos, então o que? Esse problema é o mesmo para o ponto flutuante e para números inteiros. Se você avaliar a expressão inteira "7/3 * 3", ela não será comparada com "7 * 3/3".
Então, suponha que perguntássemos "Como comparo números inteiros para igualdade?" em tal situação. Não há uma resposta única; o que você deve fazer depende da situação específica, principalmente o tipo de erro que você possui e o que deseja obter.
Aqui estão algumas opções possíveis.
Se você deseja obter um resultado "verdadeiro" se os números matematicamente exatos forem iguais, tente usar as propriedades dos cálculos realizados para provar que você obtém os mesmos erros nos dois números. Se isso for possível, e você comparar dois números que resultam de expressões que dariam números iguais se calculados exatamente, você será "verdadeiro" na comparação. Outra abordagem é que você pode analisar as propriedades dos cálculos e provar que o erro nunca excede uma certa quantia, talvez uma quantia absoluta ou uma quantia relativa a uma das entradas ou uma das saídas. Nesse caso, você pode perguntar se os dois números calculados diferem no máximo nesse valor e retornar "true" se estiverem dentro do intervalo. Se você não pode provar um erro vinculado, você pode adivinhar e esperar o melhor. Uma maneira de adivinhar é avaliar muitas amostras aleatórias e ver que tipo de distribuição você obtém nos resultados.
Obviamente, como apenas definimos o requisito de que você seja "verdadeiro" se os resultados matematicamente exatos forem iguais, deixamos em aberto a possibilidade de você ser "verdadeiro", mesmo que sejam desiguais. (De fato, podemos satisfazer o requisito sempre retornando "true". Isso simplifica o cálculo, mas geralmente é indesejável; portanto, discutirei como melhorar a situação abaixo.)
Se você deseja obter um resultado "falso" se os números matematicamente exatos forem desiguais, é necessário provar que sua avaliação dos números gera números diferentes se os números matematicamente exatos forem desiguais. Isso pode ser impossível para fins práticos em muitas situações comuns. Então, vamos considerar uma alternativa.
Um requisito útil pode ser a obtenção de um resultado "falso" se os números matematicamente exatos diferirem mais do que uma certa quantia. Por exemplo, talvez vamos calcular para onde a bola jogada em um jogo de computador viajou e queremos saber se ela atingiu um taco. Nesse caso, certamente queremos ser "verdadeiros" se a bola bater no taco, e queremos ser "falsos" se a bola estiver longe do taco, e podemos aceitar uma resposta "verdadeira" incorreta se a bola uma simulação matematicamente exata perdeu o bastão, mas está a um milímetro de atingi-lo. Nesse caso, precisamos provar (ou adivinhar / estimar) que nosso cálculo da posição da bola e da posição do taco tem um erro combinado de no máximo um milímetro (para todas as posições de interesse). Isso nos permitiria retornar sempre "
Portanto, como você decide o que retornar ao comparar números de ponto flutuante depende muito da sua situação específica.
Quanto à maneira de provar limites de erro para cálculos, isso pode ser um assunto complicado. Qualquer implementação de ponto flutuante usando o padrão IEEE 754 no modo arredondado para o mais próximo retorna o número de ponto flutuante mais próximo do resultado exato para qualquer operação básica (principalmente multiplicação, divisão, adição, subtração, raiz quadrada). (Em caso de empate, arredondar para que o bit mais baixo seja o mesmo.) (Seja particularmente cuidadoso com a raiz quadrada e a divisão; sua implementação de idioma pode usar métodos que não estão em conformidade com o IEEE 754 para esses.) Devido a esse requisito, sabemos o seguinte: erro em um único resultado é no máximo 1/2 do valor do bit menos significativo. (Se fosse mais, o arredondamento teria sido para um número diferente que esteja dentro da metade do valor.)
Continuar a partir daí fica substancialmente mais complicado; a próxima etapa é executar uma operação em que uma das entradas já possui algum erro. Para expressões simples, esses erros podem ser seguidos através dos cálculos para atingir um limite no erro final. Na prática, isso é feito apenas em algumas situações, como trabalhar em uma biblioteca de matemática de alta qualidade. E, é claro, você precisa de um controle preciso sobre exatamente quais operações são executadas. Linguagens de alto nível geralmente oferecem muita folga ao compilador, portanto, você pode não saber em que ordem as operações são executadas.
Há muito mais que poderia ser (e é) escrito sobre esse tópico, mas eu tenho que parar por aí. Em resumo, a resposta é: Não há rotina de biblioteca para essa comparação porque não há uma solução única que atenda à maioria das necessidades que vale a pena colocar em uma rotina de biblioteca. (Se comparar com um intervalo de erro relativo ou absoluto é suficiente para você, você pode fazê-lo simplesmente sem uma rotina de biblioteca.)