Seite 1 von 1

Gleitkommazahlen

Verfasst: Sonntag 27. August 2006, 18:16
von Conker
Hi,
ich habe mit Python vor 2 Wochen angefangen. Im Vergleich zu C++ ist es auf jeden Fall einfacher zu lernen.
Jedoch ist mir folgendes aufgefallen, als ich es auf dem PDA ausprobiert habe:

Wenn ich 1.2**2 eingebe , also 1.2 zum Quadrat, dann müsste eigentlich genau 1.4 ausgegeben werden.
Aber ich erhalte folgende Ausgabe:
>>> 1.2**2
1.4399999999999999

Das selbe erhalte ich auf dem PC.
Deshalb wollte ich nachfragen, ob das nun ein Fehler in Python oder eine falsche Eingabe ist.
Habe auf beidem Python 2.4.3

Conker

Verfasst: Sonntag 27. August 2006, 18:28
von Crush
irgendwo habe ich mal gelesen, wieso man hier solche Resultate erhält... aber leider weiss ich das nicht mehr :?

jedenfalls erhälst du das "richtige" Ergebnis wenn du für die Ausgabe print verwendest:

Code: Alles auswählen

>>> print 1.2**2
1.44
>>>
Mich würde es aber auch interessieren, wieso man hier "1.439999999 ..." als Resultat erhält, was ja eigentlich auch 1.44 ist, wenn man die Anzahl Stellen gegen Unendlich gehen lässt. Vielleicht hat ja jemand einen Link parat. :)

Crush

Verfasst: Sonntag 27. August 2006, 19:00
von DatenMetzgerX
das hatten wir mal in einem Thread wo es darum ging das 0.3 - 0.1 eins nicht genau o.2 gab sondern 0.199999999999

das Problem ist... du kannst Binär 1.44 nicht abbilden und darum besteht immer eine gewisse ungenauikeit.

Wenn du mit print das ganze ausgibst, formt er das resultat in einen string um und roundet zusätzlich noch auf irgend wie 12 stellen. und dann gibt es logischerweise 1.44

Verfasst: Sonntag 27. August 2006, 19:35
von Maho
Das problem mit dem rundungsfehler kommt daher, das Gleitpunktzahlen intern als Brüche behandelt werden. Das hat verschiedene Vorteile, aber eben auch Nachteile. Genaueres dazu erfährt man in der Wikipedia, die einen sehr ausführlichen Artikel zu dem Thema haben.

Verfasst: Sonntag 27. August 2006, 19:39
von Michael Schneider
Hi,

Du kannst mit

Code: Alles auswählen

round(f,10)
den Floatwert auf 10 Stellen runden.

Wie Datenmetzger schon ansprach können manche Zahlen nicht angezeigt werden. Stell Dir vor, Du solltest mit einem Byte Zahlen zwischen 0 und 1 darstellen.
Du könntest sagen: "Gut, ich kann 256 unterschiedliche Werte darstellen. Dann nehme ich die Zustände von 0-200 dividiere durch 200."
Dann kannst Du alle Werte darstellen, die durch 0.005 teilbar sind, also 0, 0.005, 0.01, 0.015, 0.02, 0.025, [...], 0.995, 1.
Du könntest aber die Werte 0.003 oder 0.018 nicht darstellen, weil sie nicht in Deinem Wertebereich liegen.
Um noch tiefer zu gehen: Du würdest bei obiger Lösung 55 Zustände verschwenden, also teilst Du die Zahl durch 255. Dann ist jede Unterteilung 0,003921568.... Einheiten groß. Versuch damit mal eine 0.5 zu basteln. ;-)

Das gleiche Problem tritt aber auch bei C-Typen auf. Nur dass da auf eine genaue Stellenzahl gerundet wird.
EDIT Nachtrag: wenn ich mich recht erinnere können in C mit 4 Bytes 7 Stellen (8 mit der ganzen Stelle) genau dargestellt werden.

Michael

Verfasst: Sonntag 27. August 2006, 20:21
von Conker
Ja, habe auch vermutet, dass es an der internen Verarbeitung liegt.
Danke, dass ihr es erklärt habt. :)
Ich wollte erst hier nachfragen, bevor ich Entwickler bei Python benachrichtige.

Conker

Verfasst: Montag 28. August 2006, 08:09
von jens
Zum Thema hab ich gerade eine Wiki Seite gefunden:

[wiki]Das Problem mit den Dezimalzahlen[/wiki]

Verfasst: Montag 28. August 2006, 20:09
von Michael Schneider
Hi,

das ist eine seltsame Frage, finde ich:
PythonWiki hat geschrieben:Warum ist 1 / 3.0 nicht 0.3, sondern 0.33333333333333331?
1/3.0 war noch nie 0.3, nicht mal annähernd. :) Jedenfalls für mich ist es weit von 0.33333333 Periode 3 entfernt.

Dabei ist gerade die Periode ein gutes Beispiel dafür, wie wir einen an sich eindeutigen Wert (im Beispiel den, der 1 ergibt, wenn man ihn mit 3 multipliziert) nicht als Dezimalzahl darstellen können. Faszinieren!

Grüße,
Michael

Verfasst: Montag 28. August 2006, 20:43
von mitsuhiko
Michael Schneider hat geschrieben:
PythonWiki hat geschrieben:Warum ist 1 / 3.0 nicht 0.3, sondern 0.33333333333333331?
1/3.0 war noch nie 0.3, nicht mal annähernd. :) Jedenfalls für mich ist es weit von 0.33333333 Periode 3 entfernt.
Fehler meinerseits. Fixed