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
floats vergleichen
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:
Grüße
Gerrit
Code: Alles auswählen
abs(x-y) < eps
Gerrit
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.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.