Addieren von Zahlen funktioneirt nicht

Gast #6176798
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
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
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
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

Eine eigene Frage? Dieser Thread ist über 6 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.