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