Heim > Backend-Entwicklung > C++ > Warum sind Gleitkommavergleiche ungenau und wie kann ich korrekte Ergebnisse sicherstellen?

Warum sind Gleitkommavergleiche ungenau und wie kann ich korrekte Ergebnisse sicherstellen?

Patricia Arquette
Freigeben: 2024-12-19 17:26:10
Original
1012 Leute haben es durchsucht

Why Are Floating-Point Comparisons Inaccurate, and How Can I Ensure Correct Results?

Verwirrung beim Gleitkommavergleich

Im angegebenen Codeausschnitt sind die Vergleichsprüfungen zwischen Gleitkommazahlen nicht so einfach, wie man erwarten könnte . Beim Umgang mit Gleitkomma-Vergleichen ist es wichtig, die Gleitkomma-Darstellung und die potenziellen Fallstricke zu verstehen.

Die Gleitkomma-Fallstricke

Das Problem mit Der Code liegt im Vergleich von Gleitkommazahlen. Gleitkommazahlen werden in einem Binärformat gespeichert, das eine endliche Anzahl von Bits verwendet, um sowohl den Betrag als auch den Exponenten darzustellen. Dies bedeutet, dass die Genauigkeit, mit der Gleitkommazahlen bestimmte Werte darstellen können, inhärente Einschränkungen aufweist, was zu Rundungsfehlern führt.

Im bereitgestellten Code sind die Variablen a und b beide als Gleitkommazahlen definiert. Beim Vergleich von a mit 0,7 stuft der Compiler den Float für den Vergleich auf ein Double hoch. Diese Typheraufstufung kann zu einem Verlust an Präzision führen, da die doppelte Darstellung von a möglicherweise nicht genau 0,7 entspricht. Darüber hinaus ist 0,5 eine exakte Potenz von 2, die im Gleitkommaformat präzise dargestellt werden kann.

Als Ergebnis ist der Vergleich a < 0,7 wird aufgrund der Umwandlung von a in ein Double und der ungenauen Darstellung von 0,7 als wahr ausgewertet. Dies erklärt die unerwartete Ausgabe von „1 ist richtig“ anstelle der erwarteten „0 ist richtig“.

Gewährleistung korrekter Vergleiche

Um solche Probleme zu vermeiden, gibt es zwei Mögliche Ansätze:

  • Verwenden Sie Doubles statt Floats: Durch die Definition von a und b als Doubles (double a = 0,7; double b = 0,5;) können Sie sicherstellen, dass die Vergleiche mit der vollen Genauigkeit von Doubles durchgeführt werden, wodurch das Risiko von Rundungsfehlern verringert wird.
  • Verwenden Sie Gleitkomma-Suffixe: Alternativ können Sie f-Suffixe an die Gleitkomma-Literale anhängen, um den Compiler zu zwingen, sie während des Vergleichs als Gleitkomma-Literale zu behandeln. Mit diesem Ansatz können Sie den Float-Typ beibehalten und gleichzeitig die richtige Präzision sicherstellen: if (a < 0,7f).

Das obige ist der detaillierte Inhalt vonWarum sind Gleitkommavergleiche ungenau und wie kann ich korrekte Ergebnisse sicherstellen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage