Es gibt eine Menge von Dokumenten und Diskussionen über den Vergleich der Float-Zahl. Aber für mich ist es nicht klar, kann man immer garantieren, dass der direkte Zahlenvergleich auf allen Compilern und Plattformen funktioniert?Double/Float-Vergleich mit genauen Werten
double x = 1.;
if (1. == x)
{
//do something
}
Werden wir immer den if
Block eingeben?
Edited:
Und was Vergleich hier korrekt ist (funktioniert immer)? Dieses ?:
double x = 1.;
if (std::abs(1. - x) < std::numeric_limits<double>::epsilon())
{
//do something
}
Einige Fließkommawerte, wie zum Beispiel '1.0', können genau im IEEE Fließkommaformat dargestellt werden (welches das meist verwendete Format ist). So wird Ihr Vergleich in genau dem Code funktionieren, den Sie zeigen. Versuchen Sie jedoch, einige Operationen an 'x' durchzuführen, die * als * 1.0 'zurücklassen und den Vergleich wiederholen sollten. Dies wird höchstwahrscheinlich nicht funktionieren. –
Klingt so, als ob Sie das lesen sollten: https://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html –
Um den zweiten Teil Ihrer Frage zu adressieren, no, 'std :: numeric_limits: : epsilon() 'soll nicht so verwendet werden. 'std :: numeric_limits :: epsilon()' ist ein Maß für die Genauigkeit des Formats, es ist kein Maß für die Genauigkeit der vorangegangenen Berechnungen. Wenn vorausgehende Berechnungen einen absoluten Fehler von 0,125 verursacht haben und Sie einen Test wünschen, der ohne falsche Negative erkennt, wenn die mathematische Berechnung 1,0 ergeben hätte, verwenden Sie "std :: abs (1. - x) <= 0,125". Es gibt keinen magischen Wert, der unabhängig vom Kontext in allen Fällen auf der RHS verwendet werden kann. –