mikrocontroller.net

Forum: PC-Programmierung Addieren von Zahlen funktioneirt nicht


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Jungvogel (Gast)


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


Beispiel:
Addierzahl = 0,0005
Zahl = 0

Schleifenstart:
  Zahl = Zahl + Addierzahl
  Print Zahl
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)


Bewertung
0 lesenswert
nicht lesenswert
Programmiersprache?

von Dirk B. (dirkb2)


Bewertung
1 lesenswert
nicht lesenswert
Nicht alle Fließkommazahlen sind exakt darstellbar.

von leo (Gast)


Bewertung
0 lesenswert
nicht 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: professional Professional) (pnuebergang)


Bewertung
0 lesenswert
nicht lesenswert

von leo (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Dirk B. schrieb:
> Nicht alle Fließkommazahlen sind exakt darstellbar.

Die wenigsten ...

leo

von leo (Gast)


Bewertung
0 lesenswert
nicht lesenswert
cppbert schrieb:
> Programmiersprache?

Der TO schrieb Matlab und 2. ist das egal.

leo

von WaSe (Gast)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


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

von Jungvogel (Gast)


Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.