Forum: PC-Programmierung Addieren von Zahlen funktioneirt nicht


von Jungvogel (Gast)


Lesenswert?

Hi, ich will Zahlen addieren. Dazu habe ich ein Programm, dass Zahlen 
addiert geschrieben und was immer zyklisch läuft:


Beispiel:
1
Addierzahl = 0,0005
2
Zahl = 0
3
4
Schleifenstart:
5
  Zahl = Zahl + Addierzahl
6
  Print Zahl
7
Schleifenende


Jetzt ist folgendes Problem - zunächst sieht "Zahl" noch gut aus, also 
immer

0,0005
0,0010
0,0015
0,0020
...

irgendwann passiert etwas Komisches, was ich nicht verstehe - die letzte 
Ziffer müsste immder 0 oder 5 sein. Aber dann ist sie plötzlich anders, 
wie z.B.
1,2248
1,2253
1,2258
...

Der Abstand ist dann immer noch Addierzahl, aber irgendwann hat sich das 
dann verrechnet an einer Stelle und rechnet dann falsch weiter.

Was könnte das sein? Ich bin mir nicht so sicher, aber hat es vielleicht 
irgendwas mit Gleitkommazahlenaddition zu tun? Ich habe mir z.B. den 
Wert 0,0005 auch mal in Matlab angeguckt. Es ist genaugenommen nur ein 
gerundeter Wert. Statt 5e-4 steht dann da z.B. 5,000000237487257e-4, 
obwohl ich halt in die Konstante zum Addieren 0,0005 rein schrieb.

von cppbert (Gast)


Lesenswert?

Programmiersprache?

von Dirk B. (dirkb2)


Lesenswert?

Nicht alle Fließkommazahlen sind exakt darstellbar.

von leo (Gast)


Lesenswert?

Jungvogel schrieb:
> irgendwann passiert etwas Komisches, was ich nicht verstehe - die letzte
> Ziffer müsste immder 0 oder 5 sein.

Du solltest dich ueber Fliesskommazahlen informieren:

https://de.wikipedia.org/wiki/Gleitkommazahl

"Daraus resultiert die leichte bis absolute Ungenauigkeit der Rechnungen 
und die außer Kraft gesetzte Gültigkeit geläufiger mathematischer 
Rechenregeln."

leo

von Hannes J. (Firma: _⌨_) (pnuebergang)


Lesenswert?


von leo (Gast)


Lesenswert?

Dirk B. schrieb:
> Nicht alle Fließkommazahlen sind exakt darstellbar.

Die wenigsten ...

leo

von leo (Gast)


Lesenswert?

cppbert schrieb:
> Programmiersprache?

Der TO schrieb Matlab und 2. ist das egal.

leo

von WaSe (Gast)


Lesenswert?

Hallo,

0.0005 ist als Gleitkommazahl nicht exakt darstellbar.
Deshalb kummuliert sich der Fehler bei der wiederholten Addition.

Warum zählst du nicht einen Zähler hoch und nimmst

Zähler/2000.0

Das ist so exact wie möglich.

WaSe

von Helmut S. (helmuts)


Lesenswert?

Jungvogel schrieb:
>
> irgendwann passiert etwas Komisches, was ich nicht verstehe - die letzte
> Ziffer müsste immder 0 oder 5 sein. Aber dann ist sie plötzlich anders,
> wie z.B.
> 1,2248
> 1,2253
> 1,2258
> ...
>
> Der Abstand ist dann immer noch Addierzahl, aber irgendwann hat sich das
> dann verrechnet an einer Stelle und rechnet dann falsch weiter.
>
> Was könnte das sein? Ich bin mir nicht so sicher, aber hat es vielleicht
> irgendwas mit Gleitkommazahlenaddition zu tun? Ich habe mir z.B. den
> Wert 0,0005 auch mal in Matlab angeguckt. Es ist genaugenommen nur ein
> gerundeter Wert. Statt 5e-4 steht dann da z.B. 5,000000237487257e-4,
> obwohl ich halt in die Konstante zum Addieren 0,0005 rein schrieb.

So schlecht ist 64bit floating point garantiert nicht.

  1.22499999999992
  1.22549999999992
  1.22599999999992

Um auf die von dir gezeigte Ungenauigkeit zu kommen, hast du garantiert 
nicht um 0,0005 erhöht.

> Es ist genaugenommen nur ein
> gerundeter Wert. Statt 5e-4 steht dann da z.B. 5,000000237487257e-4,

Dann kannst du auch nicht erwarten, dass deine Ergebnisse so sind als 
wären das 0,0005.

von Jungvogel (Gast)


Lesenswert?

Vielen Dank für die Tipps und den Link zu der Gleitkommazahl, der 
Artikel hat mir weitergeholfen.

von Jungvogel (Gast)


Lesenswert?

WaSe schrieb:
> 0.0005 ist als Gleitkommazahl nicht exakt darstellbar.
> Deshalb kummuliert sich der Fehler bei der wiederholten Addition.
>
> Warum zählst du nicht einen Zähler hoch und nimmst
>
> Zähler/2000.0

Das ist auch eine coole Idee :-), vielen Dank dafür :-)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.