floats vergleichen
Verfasst: Donnerstag 19. November 2009, 22:55
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
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