Heim > Backend-Entwicklung > C++ > Warum führt mein Gleitkomma-Vergleich zu unerwarteten Ergebnissen?

Warum führt mein Gleitkomma-Vergleich zu unerwarteten Ergebnissen?

Patricia Arquette
Freigeben: 2024-12-25 02:20:09
Original
310 Leute haben es durchsucht

Why Does My Floating-Point Comparison Produce Unexpected Results?

Diskrepanz beim Gleitkomma-Vergleich

Im bereitgestellten Codeausschnitt:

int main()
{
    float a = 0.7;
    float b = 0.5;
    if (a < 0.7)
    {
       if (b < 0.5) printf("2 are right");
       else         printf("1 is right");
    }
    else printf("0 are right");
}
Nach dem Login kopieren

Die erwartete Ausgabe von „0“ ist richtig“ wird nicht erhalten. Stattdessen wird „1 ist richtig“ gedruckt. Diese Diskrepanz entsteht durch die inhärente Ungenauigkeit von Gleitkommazahlen.

Bei Vergleichen mit Gleitkommazahlen werden diese automatisch auf Werte mit doppelter Genauigkeit heraufgestuft. Floats sind weniger präzise als Doubles und geben den beabsichtigten Wert möglicherweise nicht genau wieder. Wenn in diesem Fall a (ein Float) mit 0,7 (ein Double) verglichen wird, wird a intern in ein Double umgewandelt und verliert an Präzision. Dies führt dazu, dass a etwas kleiner als 0,7 ist, was dazu führt, dass a < 0,7-Vergleich, um als wahr auszuwerten.

Um dieses Problem zu beheben, kann man entweder:

  • Float in Double ändern:
double a = 0.7;
double b = 0.5;
Nach dem Login kopieren
  • Verwenden Sie Float-Literale mit dem Suffix „f“:
float a = 0.7f;
float b = 0.5f;
Nach dem Login kopieren

Beide Ansätze stellen sicher, dass die Operanden als Floats bleiben und vermeiden den Präzisionsverlust bei der Heraufstufung auf Double.

Das obige ist der detaillierte Inhalt vonWarum führt mein Gleitkomma-Vergleich zu unerwarteten Ergebnissen?. 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