myCSharp.de - DIE C# und .NET Community (https://www.mycsharp.de/wbb2/index.php)
- Entwicklung (https://www.mycsharp.de/wbb2/board.php?boardid=3)
-- Grundlagen von C# (https://www.mycsharp.de/wbb2/board.php?boardid=88)
--- Mehrmaliges addieren von 0.1 auf eine Zahl vom Typ double gibt *.9999 oder *.*00001 aus (https://www.mycsharp.de/wbb2/thread.php?threadid=121510)


Geschrieben von Badaboo am 25.01.2019 um 08:21:
  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 =)

C#-Code:
            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


Geschrieben von LaTino am 25.01.2019 um 08:27:
 
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


Geschrieben von M.L. am 25.01.2019 um 10:03:
 
Zitat:
in Mathe echt nicht aufgepasst

Kann sein, zusätzlich ist Gleitkommadarstellung im Rechner ein Problem der  Numerischen Mathematik


Geschrieben von Abt am 25.01.2019 um 14:37:
 
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.


Geschrieben von gfoidl am 27.01.2019 um 11:54:
 
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ü


Geschrieben von Badaboo am 28.01.2019 um 10:00:
 
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


© Copyright 2003-2019 myCSharp.de-Team | Impressum | Datenschutz | Alle Rechte vorbehalten. | Dieses Portal verwendet zum korrekten Betrieb Cookies. 16.12.2019 09:11