falsche Rechnung

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Gartenschlauch
User
Beiträge: 3
Registriert: Samstag 16. September 2017, 07:16

Ich habe folgendes Problem.

Wenn ich in Python rechne: -399.9 + 0.1
dann sollte das ja -399.8 geben und zwar exakt.
Aber Python gibt mir als Resultat: -399.79999999999995
Kann mir jemand sagen wieso das so ist?
Wäre echt wichtig, dass ich das richtige Resultat erhalte.

Gruss

Matthias
Gartenschlauch
User
Beiträge: 3
Registriert: Samstag 16. September 2017, 07:16

Ich habe selber eine Lösung gefunden.

Man kann mit dem round-Befehl das Problem zum Teil lösen.
Etwa so:
round(-399.9+0.1,1)
Die zweite Zahl im round-Befehl gibt an, auf wieviele Stellen gerundet werden soll.

Die ganze Angelegenheit im Detail, wie Python mit Komma-Zahlen genau rechnet, ist übrigens relativ kompliziert.
Das Problem ist, dass Python bereits die Zahl 0.1 nicht genau darstellen kann im Speicher.

Ich hoffe, ich konnte helfen.
Benutzeravatar
noisefloor
User
Beiträge: 3854
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,
Die ganze Angelegenheit im Detail, wie Python mit Komma-Zahlen genau rechnet, ist übrigens relativ kompliziert.
???

Das ganze ist _kein_ Python-Problem, sondern ein Problem, wie Computer Fließkommazahlen (näherungsweise) speichern (müssen) - betrifft andere Programmiersprachen genau so. Das ganz ist auch in der Pyhton-Doku erklärt: Link. Oder wenn du bei Google nach "float precision" suchst, dann findest du auch jede Menge Links, wo das erklärt wird.

Die "Lösung" mit `round()` ist nicht so richtig eine, weil dadurch ja die Genauigkeit nicht verbessert wird. Du bekommst "lediglich" die Darstellung, die du erwartest. Wenn du eine genauere Darstellung / Rechnung haben möchtest, dann solltest du das `decimal` Modul nehmen.

Gruß, noisefloor
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@Gartenschlauch: round ist keine Lösung. Rechnen mit Fließkommazahlen ist immer näherungsweise, das ist meistens aber auch kein Problem, weil die Näherung gut genug ist. Meist sind die Eingangsdaten ja auch nicht exakt. Man muß also überlegen, wie gut der Input ist, damit man weiß, wie gut der Output ist und dann erst das Ergebnis mit entsprechender Genauigkeit darstellen.

Beispiel, man hat also irgendeine Rechnung:

Code: Alles auswählen

>>> eingabe_1 = -399.9
>>> eingabe_2 = 0.1
>>> ergebnis = eingabe_1 + eingabe_2
Und weiß dann, das das Ergebnis z.B. auf 8 Stellen genau ist, dann gibt man die Zahl mit 8 Stellen aus:

Code: Alles auswählen

>>> print("Ergebnis: {:.8f}".format(ergebnis))
Ergebnis: -399.80000000
Gartenschlauch
User
Beiträge: 3
Registriert: Samstag 16. September 2017, 07:16

Hallo zusammen.

Vielen Dank für die guten Antworten und die vielen guten Anregungen.
So macht es doch Spass.

Gruss

Matthias
ruedi_br
User
Beiträge: 13
Registriert: Montag 11. September 2017, 08:24

Hallo zusammen,
ich kann mich an ein entsprechendes Problem in guten alten FORTRAN-Zeiten erinnern:
dort wurde die Maschinengenauigkeit (genannt mach_eps), damals eher so in der Größenordnung 1E-6, in den Vergleich mit eingebunden in der Form abs(Zaehler - Grenze) < macheps als Abbruchkriterium also hier sowas wie (-399,9+0,1)- 399,8 < macheps. Ist zwar sinngemäß der Rundungsvariante vergleichbar, aber erlaubt definierte Abbrüche z.B. bei float-Berechnungen.
Antworten