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

M.-A. Lemburg mal at lemburg.com
Wed Apr 25 19:20:26 EDT 2001


Dinu Gherman wrote:
> 
> "M.-A. Lemburg" wrote:
> >
> > Das liegt daran, daß Floats (meistens) von der C lib im
> > IEEE Standard verbastelt werden und der orientiert sich
> > am Dualsystem und nicht dem Dezimalsystem, welches für Humanoide
> > zugänglicher ist ;-)
> 
> Schon, aber warum wurden diese in 1.5.2 dargestellt und in
> 2.0 nicht mehr? Und sollte einem nicht folgendes zu denken
> geben?
> 
>   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? Selbst wenn es dafuer einen guten Grund gibt,
> wird er schwerlich einem Anfaenger leicht zu erklaeren sein.

Richtig. Und deswegen möchte Moshe Zadka ja auch gerne bei der
Eingabe von 3.14 eine rationale Zahl anlegen, die dann auch genau
314/100 zum Inhalt hat (und nicht eine IEEE Float, die diesem
Wert nur nahe kommt).

Bis dahin ist aber noch ein weiter Weg -- übrigens habe ich mxNumber
aus genau diesem Grund angefangen. Datenbanken speichern Zahlen
als Strings und dies aus gutem Grund, da sonst der Anwender
womöglich Rundungsfehler bekommt, die er eigentlich gar nicht
erwartet.

Die 0 in Deinem Beispiel ist so ein Fall...
 
> > 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!
> 
> Abgesehen davon finde ich es reichlich... beknackt... sich
> ueber 1/2 == 0.5 auszulassen und gleichzeitig dermassen die
> Leute zu verwirren. Was soll z.B. ein Schueler denken, der
> 
>   >>> 3.14
>   3.1400000000000002
> 
> zu sehen bekommt, fuer den man aber extra 1/2 == 0 eliminiert
> hat, damit er es *leichter* hat?
> 
> Das folgende Argument erklaert *dass*, aber nicht, *warum* man
> die Aenderung gemacht hat:
> 
>   http://www.python.org/2.0/new-python.html:
> 
>   "Taking the repr() of a float now uses a different formatting
> precision
>   than str(). repr() uses %.17g format string for C's sprintf(), while
> str()
>   uses %.12g as before. The effect is that repr() may occasionally show
> more
>   decimal places than str(), for certain numbers. For example, the
> number 8.1
>   can't be represented exactly in binary, so repr(8.1) is
>   '8.0999999999999996', while str(8.1) is '8.1'."

Warum ist einfach: um die Tatsache, daß Floats eben nur Näherungen
von Dezimalbrüchen darstellen deutlicher zu machen. Früher hat
man das erst durch einige Tricks erfahren und sich ansonsten
gewundert, daß 10 * 3.14 != 31.4 ist.

-- 
Marc-Andre Lemburg
______________________________________________________________________
Company & Consulting:                           http://www.egenix.com/
Python Software:                        http://www.lemburg.com/python/



More information about the Python-de mailing list