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:
double a = 0.7; double b = 0.5;
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!