[Python-de] Fliesskomma-Genauigkeiten <seufz 0.9/>

Martin v. Loewis martin at loewis.home.cs.tu-berlin.de
Wed Apr 25 22:52:53 EDT 2001


> Schon, aber warum wurden diese in 1.5.2 dargestellt und in
> 2.0 nicht mehr? Und sollte einem nicht folgendes zu denken
> geben?

Marc-Andre hat eigentlich schon alles erklärt, ich versuch's aber auch
noch mal.

Python benutzt zur Darstellung gebrochener Zeilen das sogenannte
Gleitkommaformat, wie fast jede andere Programmiersprache auch. Und
zwar nicht irgend eins, sondern das auf Binärbasis, mit festgelegter
Mantisse, Exponent etc. Das war schon immer so.

Leider kann dieses Format Brüche, bei denen der Nenner keine
Zweierpotenz ist, nicht exakt repräsentieren - zur Darstellung von
31.4 im Computer muss man also runden, nämlich zur nächsten
darstellbaren Zahl. Das ergibt

>>> 31.4
31.399999999999999
>>> 3.14
3.1400000000000001 

Offenbar führt dieses Runden bei 31.4 zum Abrunden, das Runden von
3.14 jedoch zum Aufrunden.

Eigentlich ist sind das Eigenschaften des Computers, die jedem
Softwareentwickler bekannt sein sollte, siehe auch 

"What Every Computer Scientist Should Know about Floating-Point
Arithmetic" (http://www.validgh.com/goldberg/paper.ps)

>   PythonWin 2.0 (#8, Oct 16 2000, 17:27:58) [MSC 32 bit (Intel)] 
>   [...]
>   >>> x = 10 * 3.14
>   >>> x
>   31.400000000000002
>   >>> x == 31.4
>   0
> 
> Warum die Null? 

Nach dem gesagten sollte es klar sein - Computer funktionieren so.

> Selbst wenn es dafuer einen guten Grund gibt, wird er schwerlich
> einem Anfaenger leicht zu erklaeren sein.

Es ist wirklich schwierig für jedermann.  Gerade deshalb ist es
wichtig, dass Python diese Details nicht versteckt (wie das bis Python
1.5 passiert ist), sondern sie offenlegt. Python unterscheidet
bekanntlich zwischen der String-Konvertierung und der representation
eines Objekts; letztere sollte, wenn möglich, die fehlerlose
Rückkonvertierung bieten. Seit Python 2 funktioniert das auch für
Gleitkommazahlen

>>> repr(3.14)
'3.1400000000000001'
>>> str(3.14)
'3.14'

Wie man sieht, konvertiert str immer noch, indem es auf eine "glatte"
Zahl im Dezimalsystem rundet.

> 
> > Im Ernst, das ist eine FAQ und sollte eigentlich dort auch irgendwo
> > stehen (ich frage mich warum Tim Peters dort noch nichts vermerkt
> > hat).
> 
> Aber hallo!

Es ist tatsächlich irgendwo vermerkt:

http://www.python.org/cgi-bin/moinmoin/FrequentlyAskedQuestions#line24

Ciao,
Martin



More information about the Python-de mailing list