Vergleich von Float- und Double-Datentypen in Ziel C

Vergleich von Float- und Double-Datentypen in Ziel C


Bei der Verwendung des Datentyps Double oder Float in einer iPhone-App treten Probleme mit Vergleichen von ">=" und "<=" auf, da einer Variablen eine mit einer Dezimalstelle eingegebene Zahl zugewiesen wird, z. B. 4,2, Float oder Double Der im Vergleich verwendete Wert kann tatsächlich einen Wert wie 4,1999998092651367 haben. Aufgrund dieses Unterschieds ist ein Vergleich wie „>=4,2“ falsch statt wahr. Wie kann ich dieses Problem vermeiden?


Antworten:



Nicht darf . wird . Genauer gesagt:


float f = 4.2;  // f is exactly 4.19999980926513671875
double d = 4.2; // d is exactly 4.20000000000000017763568394002504646778106689453125

Das Problem tritt auf, wenn Sie etwas schreiben wie:


float f = 4.2;
if (f >= 4.2) {
// this block of code is not executed.
}

f ist genau 4.19999980926513671875 , aber Sie vergleichen es mit dem Literal mit doppelter Genauigkeit "4.2", die den Wert 4.20000000000000017763568394002504646778106689453125 hat , also schlägt der Vergleich fehl. Wenn Sie stattdessen mit dem Literal "4.2f" mit einfacher Genauigkeit vergleichen:


float f = 4.2;
if (f >= 4.2f) {
// this block of code is exectued.
}

der Vergleich gelingt, weil die Werte exakt gleich sind. Gleitkommazahlen sind kompliziert, aber vollkommen deterministisch; Eines der einfachsten Dinge, die Sie tun können, um es intuitiver zu gestalten, besteht darin, die Genauigkeiten nicht zu mischen. Wenn Sie mit float arbeiten , stellen Sie sicher, dass alle Ihre Literale das Suffix f haben um sie auch mit einfacher Genauigkeit zu machen.


(Dies kann auch die Leistung verbessern, aber das ist nicht der Grund dafür; der Grund dafür ist, dass Ihr Code dadurch korrekter wird).