Python- falsches Ergebnis

Themenautor

Themenautor

Aktives Mitglied
Thread Starter
Dabei seit
15.09.2010
Beiträge
785
Reaktionspunkte
61
Hallo,

ich unternehme grad meine ersten Schritte bzgl. Python und habe gleich eine Frage:

Wenn ich Folgendes eingebe, erhalte ich als Ergebnis 6.8999999999999995:

4.6+2.3

Warum ist das so?

Der Themenautor
 
Das liegt daran, dass Gleitkommaarithmetik nicht immer korrekte Ergebnisse liefert, sondern diverse Fehlerquellen existieren, die zu Abweichungen führen können. In ganz ungünstigen Fällen können die Fehler auch sehr groß werden. Für eine kleine Übersicht kannst du dir beispielsweise mal im Wikipediaartikel https://de.wikipedia.org/wiki/Gleitkommazahl#Eigenschaften_einer_Gleitkommaarithmetik den Abschnitt „Eigenschaften einer Gleitkommaarithmetik“ anschauen.

Daher ist das Ergebnis im engeren Sinne nicht falsch, nur berechnet die Gleitkommadivision etwas anderes als die Division, die aus der Mathematik bekannt ist.
 
Grundlegend rechnet der Computer hier richtig nur intern kann der Computer eine Zahl wie "4.6" nicht speichern*
4.6 ist für ihn 01000000100100110011001100110011 und das ist laut IEEE-754 4.599999904632568359375 und nicht 4.6

*kann er doch, macht man aber nur da, wo es wirklich notwendig ist. Python macht es hier nicht.
 
Ok, das verstehe ich soweit. Würde man solch eine (aus menschlicher Sicht) einfache Rechnung innerhalb von Python dann am sinnvollsten lösen, indem man z.B. auf eine Nachkommastelle rundet?

Der Themenautor
 
Einfach rechnen und dann wirklich erst am Ende das Ergebnis runden
 
Oder man nutzt komplexere Zahltypen wie beispielsweise den Typ Ratio von Haskell (eine andere Programmiersprache). Dieser Datentyp repräsentiert Brüche wie sie aus der Schule bekannt sind (also Brüche mit Zähler und Nenner und wirklich beliebiger Größe, bzw. so viel wie der Speicher hergibt). Nur rechnet man damit dann um Größenordnungen langsamer, eignet sich also eher nicht, wenn es auf Performance und nicht so sehr auf die Exaktheit ankommt. Der Datentyp Scientific von Haskell ist da eine gute Mischform. Der Zahlbereich ist wesentlich größer als bei reinen Integern oder Doubles, auch Rechenfehler treten hier seltener und weniger gravierend auf und die Performance ist annehmbar.
 
Zurück
Oben Unten