Seite 1 von 1

Einsteigerfrage: zu range()

Verfasst: Montag 6. Mai 2013, 16:54
von mikemet
Hallo, ich lerne gerade Python3 mit dem Buch "Einstieg in Python" von Thomas Theis und habe eine Frage zu folgendem Beispielcode aus dem Buch:

Code: Alles auswählen

# Version 1
for x in range (18, 22):
    print(x/10)
print()

# Version 2
x = 1.8
for i in range(4):
    print(x)
    x = x + 0.1
Das ergibt folgende Ausgabe:
>>>
1.8
1.9
2.0
2.1

1.8
1.9000000000000001
2.0
2.1
>>>

Meine Frage, eigentlich sollten beide Ausgaben ident sein!? Wo kommen bei der Version2 die vielen Nachkommastellen her? Den Quellcode hab ich mehrmals mit dem Buch verglichen, der stimmt bzw. hab ich keine Fehler gefunden....

Ich würde mich über eine Rückmeldung sehr freuen. Natürlich ist mit klar das der Wert jetzt nicht wirklich die Welt bedeutet, mich interessiert nur ob es sich um einen Fehler handelt und ob dieser sich bei Euch reproduzieren lässt. (...oder handelt es sich um ein Problem das zwischen Tastatur und Bürostuhl ? 8) )

LG mikemet

PS: das Buch finde ich bis jetzt wirklich "Einsteigertauglich"......

Re: Einsteigerfrage: zu range()

Verfasst: Montag 6. Mai 2013, 16:58
von cofi
Willkommen zu Python und im Forum!

Das Problem hat nichts mit `range`, ja sogar nichtmal mit Python zu tun: Fliesskommazahlen koennen nicht alle Zahlen repraesentieren.

Python macht sich allerdings seit Python 3(.2?) einige Mehrarbeit um die Ausgabe von Fliesskommazahlen "schoen" zu machen.

Re: Einsteigerfrage: zu range()

Verfasst: Montag 6. Mai 2013, 17:00
von BlackJack
@mikemet: Gleitkommazahlen sind ungenau. Der Rechner kann die 0.1 zum Beispiel nicht exakt speichern, weil das in der internen binären Darstellung eine Periode ergibt, ähnlich wie 1/3 im Dezimalsystem und weil der Speicher für eine Zahl endlich ist. Und beim addieren gibt es dann das Problem das nicht 0.1 addiert wird, sondern jedes mal ein Wert der ein ganz kleines bisschen kleiner ist als 0.1. Das Phänomen ist auch der Grund warum man keine zwei Gleitkommazahlen auf Gleichheit testen sollte, sondern schauen ob die Differenz klein genug ist, dass man sie als fast gleich ansehen kann.

Re: Einsteigerfrage: zu range()

Verfasst: Montag 6. Mai 2013, 17:05
von mikemet
WOW! :D

Ihr seid ja superschnell mit den Antworten, Danke!
Es war eine ganz vage Vermutung das es so sein könnte, da der Unterschied ja sehr klein war, ich wollte verstehen woher das kommt.

:!: DANKE :!:

LG mikemet