floats vergleichen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Indur_Dawndeath
User
Beiträge: 5
Registriert: Sonntag 25. Oktober 2009, 14:24

Hallo,

ich habe ein Problem mit dem Vergleich zweier float-Zahlen. Ich habe eine Funktion mit einem Parameter x (x ist float), die prüfen soll, ob x in einer Liste (genauer: einer Liste von Listen, und dort bei jeder internen Liste am Anfang) vorkommt.
Der Debugger gibt mir folgendes aus:

"el[0]"= float: 15.994915
"x"= float: 15.994915
"x==el[0]"= bool: False

Die zu testende List sieht so aus: [[15.994915, 0.9975700000000001], [16.999132, 3.7999999999999997e-4], [17.99916, 2.0499999999999997e-3]]

Wenn ich mir x und el[0] durch die print-Anweisung ausgeben lasse kommen auch diese Zahlen raus.
Ich weiß, dass es aufgrund der IEEE-Darstellung floats an Genauigkeit fehlt. Aber die beiden Variablen haben ja diesen einen extakten Wert und müssten demnach gleich sein. Auch wenn sie intern im Rechner nur als Annäherung dargestellt werden, müsste sie ja den gleichen internen Wert haben.
Ich benutzte Python 3.1.1. (Wieso wird dort in der IDLE eigentlich 0.9 auch als 0.9 ausgeben und nicht als 0.90000000000000002?)

Kann mir jemand meinen Denkfehler erklären?
Und gibt es eine Möglichkeit dies zu umgehen? (Mit dem Decimal-Datentypen kann ich nicht arbeiten, der ist zu ineffizient)

Danke für die Hilfe!

VG
Benutzeravatar
gkuhl
User
Beiträge: 600
Registriert: Dienstag 25. November 2008, 18:03
Wohnort: Hong Kong

Wie du schon geschrieben hast, kann und sollte man Floats nicht miteinander vergleichen. Prüfe stattdessen, ob die Distanz zwischen zwei Floats ``x`` und ``y`` kleiner als ein Fehler ``eps`` ist:

Code: Alles auswählen

abs(x-y) < eps
Grüße
Gerrit
Darii
User
Beiträge: 1177
Registriert: Donnerstag 29. November 2007, 17:02

Indur_Dawndeath hat geschrieben:Ich weiß, dass es aufgrund der IEEE-Darstellung floats an Genauigkeit fehlt. Aber die beiden Variablen haben ja diesen einen extakten Wert und müssten demnach gleich sein.
Leider hat 15.994915 keinen exakten Wert in Binärdarstellung(das ist auch kein Problem der IEEE Darstellung sondern weil 15.994915 keine abbrechende Binärbruchentwicklung hat, ist also so etwas wie 1/3 als Dezimalbruch), deswegen bezweifle ich, dass du da wirklich 15.994915 in el[0] sowie x stehen hast.
Antworten