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

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

Patricia Arquette
Patricia ArquetteOriginal
2024-12-25 02:20:09313Durchsuche

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");
}

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;
  • Verwenden Sie Float-Literale mit dem Suffix „f“:
float a = 0.7f;
float b = 0.5f;

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!

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