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
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)
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 😉
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.
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
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!"
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