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

Warum führt der Gleitkommavergleich in C manchmal zu unerwarteten Ergebnissen?

Mary-Kate Olsen
Freigeben: 2024-12-17 01:21:25
Original
371 Leute haben es durchsucht

Why Does Floating-Point Comparison in C Sometimes Produce Unexpected Results?

Gleitkomma-Vergleichsanomalien

Das Konzept der Gleitkomma-Vergleiche kann irreführend sein, insbesondere beim Umgang mit Gleitkomma-Datentypen. Betrachten Sie das folgende Beispiel:

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

Intuitiv könnte man annehmen, dass dieser Code „0 sind richtig“ ausgeben würde, da die Anfangsbedingung falsch ist. Überraschenderweise lautet die tatsächliche Ausgabe jedoch „1 ist richtig“.

Erklärung

Die Erklärung liegt in der internen Darstellung von Gleitkommazahlen. In C werden Floats bei Vergleichen zu Doubles hochgestuft, und Doubles sind präziser als Floats. Daher ist 0,7 als Float nicht genau dasselbe wie 0,7 als Double. Wenn 0,7 (als Float) zu einem Double hochgestuft wird, wird er etwas kleiner als 0,7 (als Double).

Andererseits ist 0,5 (als Float) zufällig eine exakte Darstellung im Double Präzision. Wenn daher die Bedingung b < Wenn 0,5 ausgewertet wird, wird „falsch“ zurückgegeben, da 0,5 (als Double) nicht kleiner als sich selbst ist.

Lösungen

Um dieses Problem zu beheben, kann man entweder:

  1. Float in Double ändern: Indem Sie a und b als Doubles deklarieren, stellen Sie dies sicher Sie werden beim Vergleich nicht heraufgestuft und das erwartete Verhalten wird erhalten.
  2. Suffix f zu Literalen hinzufügen: Durch Anhängen des Suffixes f an die Literale geben Sie ausdrücklich an, dass sie behandelt werden sollen als Schwimmer. Dadurch wird verhindert, dass beim Vergleich eine Verdoppelung erfolgt.

Durch die Implementierung einer dieser Lösungen können Sie die gewünschte Ausgabe von „0 sind richtig“ erhalten.

Das obige ist der detaillierte Inhalt vonWarum führt der Gleitkommavergleich 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