Heim >Backend-Entwicklung >C++ >Warum gibt der Vergleich von „float'- und „double'-Werten manchmal „false' zurück, selbst wenn sie identisch erscheinen?

Warum gibt der Vergleich von „float'- und „double'-Werten manchmal „false' zurück, selbst wenn sie identisch erscheinen?

Barbara Streisand
Barbara StreisandOriginal
2024-11-01 18:19:30765Durchsuche

Why does comparing `float` and `double` values sometimes return `false` even when they appear identical?

Unerwartete Ergebnisse beim Vergleich von Double- und Float-Datentypen

Beim Vergleich von Gleitkommazahlen mit doppelter Genauigkeit (double) und Gleitkommazahlen mit einfacher Genauigkeit Wenn Sie Zahlen (Floatzahlen) verwenden, kann es zu unerwarteten Ergebnissen kommen. Insbesondere kann die Gleichheitsprüfung (f == d) zwischen einer Float-Variablen f und einer Double-Variablen d „falsch“ zurückgeben, obwohl beide Werte identisch zu sein scheinen.

Dieses Verhalten ist auf zwei grundlegende Faktoren zurückzuführen, die mit Floating verbunden sind: Punktzahlen: Präzision und Rundung.

Präzisions- und Rundungsfehler

  • Präzision: Gleitkommazahlen speichern eine begrenzte Anzahl von Ziffern , was die Genauigkeit der Werte bestimmt, die sie darstellen können. Bestimmte Zahlen, wie z. B. 1/3 im Dezimalformat, haben eine unendliche Dezimaldarstellung und können nicht exakt gespeichert werden, ohne an Präzision zu verlieren.
  • Rundung: Wenn ein Gleitkommawert in einen Binärwert umgewandelt wird, Es ist möglicherweise nicht in der Lage, bestimmte Dezimalwerte genau darzustellen. Beispielsweise wird 0,1 im Dezimalformat im Binärformat als unendliche Ziffernfolge dargestellt. Infolgedessen werden Gleitkommazahlen gerundet, damit sie in ihre Zahlen passen.

Auswirkungen auf Gleichheitsprüfungen

Die Präzision und Rundung, die Gleitkommazahlen innewohnt Punktzahlen können zu Rundungsfehlern führen, insbesondere wenn sehr nahe beieinander liegende Werte verglichen werden. Diese Fehler häufen sich und führen dazu, dass der Gleichheitsvergleich fehlschlägt. Dies macht die direkte Gleichheitsprüfung für Gleitkommazahlen unzuverlässig und anfällig für falsch negative Ergebnisse.

Lösung: Vergleich mit einem Epsilon

Anstelle der Verwendung von Gleichheitsprüfungen ist eine zuverlässigere Die Methode zum Vergleichen von Gleitkommazahlen besteht darin, die absolute Differenz zwischen ihnen zu nehmen und zu prüfen, ob sie unter einem kleinen Wert liegt, der als Epsilon (ε) bezeichnet wird. Dadurch können Sie Rundungsfehler berücksichtigen und feststellen, ob die Differenz für Ihre Anwendung unbedeutend ist.

if (abs(x - y) < epsilon)

Das obige ist der detaillierte Inhalt vonWarum gibt der Vergleich von „float'- und „double'-Werten manchmal „false' zurück, selbst wenn sie identisch erscheinen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn