Addieren von Zahlen funktioneirt nicht

Gast #6176798
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.
Gast #6176815
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
Gast #6176845
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
#6176863
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.
Gast #6176911
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 :-)

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren