AW: [mailinglist] [Python-de] Wer nicht fragt, bleibt dumm

Uwe Schmitt schmitt at num.uni-sb.de
Mon Nov 24 17:33:07 CET 2003


::
:: Hallo Liste,
::
:: heute überraschte mich ein Kollege ;-) mit folgender Frage:
::
:: Wieso ist bei Python 1.5.2 ...
::
::  >>> 4.0 - 0.1
:: 3.9
::
:: aber bei 2.1.3 und später ...
::
::  >>> 4.0 - 0.1
:: 3.8999999999999999
::

Ganz einfach ;-)
1/10 hat im Binärsystem keine endliche Darstellung,
analog zu 1/3 im Zehnersystem.
Da Rechner ja nur endlich viele Bytes zur Darstellung
von Zahlen zur Verfügung stellen können, wird
0.1 durch Abbruch der Binärdarstellung nach einer
gewissen Anzahl Ziffern angenähert.
Solche Approximationen beinträchtigen Rechnungen
in der Regel nicht sonderlich stark, auch wenn
es praxisrelevante Beispiele gibt, die bei
"naiver" Implementierung ziemlich in die Hose
gehen: der Darstellungsfehler wirkt sich so
stark auf das Ergebnis aus, dass es total unbrauch-
bar wird.

Warum liefert nun Python 1.5.2 das exakte Ergebnis ?
Die naheliegende Vermutung, daß Python 1.5.2 einen
Rechner mit unendlichem Speicher simmulieren kann,
ist - auch wenn manche Python sowas zutrauen - falsch:
Python 1.5.2 rundet vor der Ausgabe einfach das
Ergebnis.

Gruß, Uwe.