Heim > Backend-Entwicklung > C++ > Warum führt der Vergleich von Floats in C manchmal zu unerwarteten Ergebnissen?

Warum führt der Vergleich von Floats in C manchmal zu unerwarteten Ergebnissen?

Linda Hamilton
Freigeben: 2024-12-19 04:18:09
Original
501 Leute haben es durchsucht

Why Does Comparing Floats in C   Sometimes Produce Unexpected Results?

Verstehen des Gleitkommavergleichs in C

Beim Vergleich von Gleitkommawerten in C ist es wichtig, sich möglicher Ungenauigkeiten bewusst zu sein begrenzte Präzision. Im bereitgestellten Codeausschnitt wird die unerwartete Ausgabe „1 ist richtig“ beobachtet, wenn die Gleitkommazahlen a und b mit den Konstanten 0,7 bzw. 0,5 verglichen werden.

Ursachen für die unerwartete Ausgabe:

Das Problem tritt aus folgenden Gründen auf:

  • Implizit Typkonvertierung: Beim Vergleich eines Floats mit einem Double (z. B. if (a < 0,7)) oder eines Floats mit einer Literalkonstanten, die ein Double ist (z. B. if (a < .7)), wird der Float wird implizit in ein Double konvertiert.
  • Begrenzte Präzision von Floats: Floats haben eine geringere Präzision als Doubles, was bedeutet, dass sie dies können weniger Dezimalstellen genau darstellen. Daher ist 0,7 als Float möglicherweise nicht genau dasselbe wie 0,7 als Double.
  • Genaue Darstellung von Konstanten:Konstanten wie 0,5, die Potenzen von 2 sind, können genau so dargestellt werden Floats und Doubles. Daher ist b < 0,5 bleibt falsch, auch wenn b ein etwas ungenauer Gleitkommawert ist.

Auflösung:

Um die erwartete Ausgabe zu erhalten, können Sie entweder:

  • Verwenden Sie Doubles: Ändern Sie die Variablen a und b in Doubles (double a = 0,7; double b = 0,5;).
  • Verwenden Sie Float-Literale: Ändern Sie die Konstanten in Float-Literale (if (a < 0,7f) und if (b < 0,5f)) . Dies zwingt den Vergleich dazu, durchgehend Gleitkommazahlen zu verwenden.

Code mit erwarteter Ausgabe:

int main()
{
    double a = 0.7;
    double 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

In diesem korrigierten Code erfolgt der Vergleich von a und b zu Ihre jeweiligen Doppel stellen eine genaue Präzision sicher, was zur erwarteten Ausgabe von „0 ist richtig“ führt.

Das obige ist der detaillierte Inhalt vonWarum führt der Vergleich von Floats in C manchmal 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