Vergleich von Float- und Double-Datentypen in Ziel C

Lesezeit: 1 Minute

Benutzer-Avatar
Benutzer183804

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?

  • Siehe stackoverflow.com/questions/17333/…

    Benutzer557219

    17. Februar 2011 um 4:02 Uhr

  • Ebenfalls, eecg.toronto.edu/~moshovos/ECE243-2008/00.practice/…

    Benutzer557219

    17. Februar 2011 um 4:03 Uhr

  • Bekommst du das Problem mit beiden float und double Variablen? Bitte einen Beispielcode posten?

    – Vijay Mathew

    17. Februar 2011 um 4:04 Uhr

Benutzer-Avatar
Stefan Kanon

Wenn einer Variablen eine Zahl zugewiesen wird, die mit einer Dezimalstelle eingegeben wird, z. B. 4,2, kann das im Vergleich verwendete Float oder Double tatsächlich einen Wert wie 4,1999998092651367 haben

Nicht kann. Wille. Um genau zu sein:

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.19999980926513671875aber du vergleichst es mit dem Literal mit doppelter Genauigkeit “4.2”, die den Wert hat 4.20000000000000017763568394002504646778106689453125, 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 arbeiten floatstellen Sie sicher, dass alle Ihre Literale mit angehängt sind f 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).

  • Danke, dass du mich richtig gestellt hast. Jetzt funktioniert der Code wie erwartet mit Vergleichen mit dem Suffix “f” für ganze Zahlen. Ist diese Art von Problem mit Gleitkomma-Arithmetik ein “Feature” oder ein unvermeidbares Problem? Scheint etwas zu sein, das leicht Rechenfehler aus Code einführen könnte, der logisch erscheint und sich problemlos kompilieren lässt.

    – Benutzer183804

    18. Februar 2011 um 3:18 Uhr

  • @ user183804: Ich würde es nicht als Feature oder unvermeidbares Problem bezeichnen. Eher ein “das ist die Natur von binären Gleitkommazahlen, lernen Sie etwas darüber oder sind Sie dazu verdammt, über so etwas zu stolpern”. Es ist bei weitem nicht einzigartig für Gleitkommazahlen; Menschen werden ständig von Integer-Überlauf und anderen Aspekten der Integer-Arithmetik abgeschreckt. Rechnen am Computer ist nicht dasselbe wie das Rechnen, das wir in der Schule lernen, und das ist im Grunde nur eine Tatsache, mit der wir als Programmierer lernen müssen, umzugehen.

    – Stefan Kanon

    18. Februar 2011 um 4:45 Uhr

  • Danke noch einmal. Ich werde meinen gesamten Code mit diesem neuen Wissen im Hinterkopf durchgehen. Sie waren äußerst hilfreich, da sich meine kommende iPhone-App mit medizinischen Berechnungen befasst, daher ist Genauigkeit von größter Bedeutung.

    – Benutzer183804

    18. Februar 2011 um 17:38 Uhr

  • Ich fand das hier eine gute Referenz: cygnus-software.com/papers/comparingfloats/comparingfloats.htm

    – Nielsbot

    21. Oktober 2013 um 23:04 Uhr

  • Basierend auf dem Artikel, den ich verlinkt habe, können Sie versuchen, die Zahlen als Ganzzahlen zu vergleichen. Wenn sie innerhalb von 1 Ganzzahl voneinander liegen, liegen sie innerhalb eines Gleitkomma-/Doppelpräzisionsschritts voneinander. Wenn Sie wissen, dass keines der Argumente Null ist, können Sie Floats/Double mit einer gewissen Mindestgenauigkeit vergleichen.

    – Nielsbot

    21. Oktober 2013 um 23:06 Uhr

1225920cookie-checkVergleich von Float- und Double-Datentypen in Ziel C

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy