Laden...

Mehrmaliges addieren von 0.1 auf eine Zahl vom Typ double gibt *.9999 oder *.*00001 aus

Erstellt von Badaboo vor 5 Jahren Letzter Beitrag vor 5 Jahren 1.392 Views
B
Badaboo Themenstarter:in
4 Beiträge seit 2019
vor 5 Jahren
Mehrmaliges addieren von 0.1 auf eine Zahl vom Typ double gibt *.9999 oder *.*00001 aus

Liebe Forumsgemeinde,

bin leider über die Suchfunktion nicht fündig geworden, daher erstelle ich nun diesen Thread. Ich bin gerade dabei mir via Selbststudium und etlichen Büchern C# beizubringen. Stehe aber seit gestern vor einem Problem bzw. einem Rätsel, dass mich leider geistig am Weitermachen hindert solange ich das nicht verstanden / begriffen habe =)

            double z = 0.0;
            z = z + 0.1;

Wenn ich mit Visual Studio einen Button erzeuge, der immer 0.1 auf z hinzuaddiert, dann passiert folgendes:

Beim Sprung von 5.9 auf 6.0 - spuckt er nicht 6.0 aus sondern 5.9999periodisch.
Wenn man weiteraddiert, dann spuckt er irgendwann beim Sprung von 13.7999999 plötzlich 13.8000001 aus.

Alles ziemlich strange.

Wenn ich der Variable den Startwert 5.9 gebe und addiere, dann rechnet er sauber 6.0 - dann kommt dieses periodische Ergebnis halt irgendwann bei 8.79999999999.

Also entweder ich hab in Mathe echt nicht aufgepasst und eine Regel vom addieren nicht verstanden oder hier läuft mächtig was falsch =) Das macht mich noch verrückt.

Kann mir das bitte einer erklären.

Vielen Dank und schöne Grüße
Badaboo

3.003 Beiträge seit 2006
vor 5 Jahren

Das liegt an der Art und Weise, wie Computer gebrochene Zahlen speichern.

http://effbot.org/pyfaq/why-are-floating-point-calculations-so-inaccurate.htm

Versuch's mal mit decimal stattdessen. Hat zwar das selbe grundlegende Problem, aber mehr Platz zum Speichern und ist daher genauer.

LaTino

EDIT: war hier im Forum auch schon oft Thema: [FAQ] Double und Float: Fehler beim Vergleich und Rundungsfehler

"Furlow, is it always about money?"
"Is there anything else? I mean, how much sex can you have?"
"Don't know. I haven't maxed out yet."
(Furlow & Crichton, Farscape)

M
368 Beiträge seit 2006
vor 5 Jahren

in Mathe echt nicht aufgepasst Kann sein, zusätzlich ist Gleitkommadarstellung im Rechner ein Problem der Numerischen Mathematik

Goalkicker.com // DNC Magazine for .NET Developers // .NET Blogs zum Folgen
Software is like cathedrals: first we build them, then we pray 😉

16.806 Beiträge seit 2008
vor 5 Jahren

Im Prinzip steht das auch alles in der Dokumentation zu Double; inkl. dem Hinweis, wie man gegen Double vergleicht: mit einer Toleranz.
Leider zeigen vielen Snippets bei der Toleranz die Verwendung von Epsilon: die Dokumentation unterstreicht jedoch, dass man genau das nicht tun sollte.
Ich habe dies als Hinweis in der FAQ angefügt.

6.911 Beiträge seit 2009
vor 5 Jahren

Hallo,

...weil das Epsilon von .NET nicht jenem Epsilon in der Numerik entspricht (leider). In der FAQ steht jedoch wie das in der Numerik übliche Epsilon ermittelt werden kann.

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"

B
Badaboo Themenstarter:in
4 Beiträge seit 2019
vor 5 Jahren

Vielen Dank für eure Antworten.

Hatte die Suchfunktion eigentlich verwendet aber kam nicht auf die Idee nach Rundungsfehlern zu suchen als Stichwort 😃

Schöne Grüße
Badaboo