| 

.NET C# Java Javascript Exception

7
In meinem C#-Programm kommt folgende (falsche!) Berechnung vor: 0.35 - 0.35 = 3.48022e-006

Ist meine CPU defekt?
19.07.2009
Matg30 165 2 5
2
auch wenn in den antworten schon erklärt ist, warum das passiert, könnte deine cpu strenggenommen trotzdem defekt sein ;-) siehe FDIV-Bug...
sicco 19.07.2009
1
Guter Einwand!
gfoidl 27.07.2009
1
Passiert das wirklich, wenn du 0.35 - 0.35 dir im Programm ausgeben laesst, oder stammt einer der Summanden aus einer Berechnung?
knivil 02.11.2009
1
Bei der Subtraktion gibts keine Summanden. Dort werden sie als Minuend - Subtrahend bezeichnet.

Ich weiß dass du sicher 0.35 + -0.35 gemeint hast ;)
gfoidl 02.11.2009
4 Antworten
3
Für Kommazahlen mit bis zu 4 Nachkommastellen kannst du decimal (System.Decimal) verwenden. Dabei treten keine Rundungsverluste oder Ungenauigkeiten ein.
19.07.2009
jor 791 2 7
12
Aus diesem Grund sollten Gleitkommazahlen auch nicht mit == auf Gleichheit geprüft werden sondern durch die Differenz der Abweichung soll mit einem Epsilon verglichen werden. Das Epsilon stellt dabei den Wert der "Ungenauigkeit" der Gleitkommazahl dar.

Nicht verwendet werden soll:
if (double1 == double2)

sondern:
if (Math.Abs(double1 - double2) < epsilon)
wobei epsilon zB 0.00001 ist.
27.07.2009
gfoidl 9,4k 3 5
1
Vielen Dank, kannte ich nicht. Dachte immer Decimal wäre mit seinen 28-29Stellen schon genau genug, aber Maschinengenau mit epsilon, das hat was, super! : )
Mario Priebe 31.07.2009
1
Siehe für die Berechnung von Epsilon: http://dotnet-snippets.de/dns/maschinengenauigkeit-SID961.aspx
gfoidl 31.07.2009
1
Weiterführende Betrachtung des Problems: http://dotnet-forum.de/forums/t/1755.aspx
gfoidl 21.08.2009
1
Ich verstehe nicht, was das mit der Frage zu tun hat. Die Genauigkeit spielt leine Rolle, da beide Summanden die selbe Darstellung/Bitmust haben, so sollte X - X immer 0 sein, da sie ja das gleiche Bitmuster haben.
knivil 02.11.2009
1
Richtig ist, dass es unsinnig ist doubles auf Gleichheit zu vergleichen,
der Vorschlag gegen ein epsilon zu vergleichen ist grober Unfug den es führt zu folgendem:

if (Math.Abs (1E60 - 10*1E6) < 0.00001)
stefan.bachert 02.11.2009
1
Wie realistisch ist denn dein Vergleich x = x? Gar nicht, denn wer das prüft....
Eher kommt in Frage x = y und darauf bezieht sich die Antwort.
gfoidl 02.11.2009
1
@stefan.bachert: Warum soll der Vergleich mit epsilon ein grober Unfug sein? Im oberen Kommentar (der mit dem Link) ist eine weiterführende Betrachtung die du scheinbar nicht gelesen hast.

In der Numerik wird seit jeher mit epsilon verglichen. Die Wahl für epsilon ist in der Antwort nicht definiert und somit ist dein Beispiel aus deinem Kommentar Schwachsinn der auf Unverständnis der Numerik beruht.
gfoidl 02.11.2009
7
Die eigentliche Ursache für dieses Problem ist die interne Darstellung: 0.1 hat keine endliche Darstellung in Binärform.
Binär 0.1 entspricht Dezimal 0.5
Binär 0.01 entspricht Dezima 0.25
Binär 0.001 entspricht Dezimal 0.125
Binär 0.0001 entspricht Dezimal 0.0625
....
Dezimal 0.1 entspricht Binär 0.00011001100110011....
Da wir im Rechner aber nur endlich viele Stellen abspeichern, entsteht ein Rundungsfehler. So entsrpeicht Binär 0.00011001100110011 eben Dezimal 0,099998474 was zwar fast 0.1 ist, aber eben nur fast.
Um sowas bei Geldbeträgen zu vermeiden, rechnet man intern gerne mit Cent anstelle von Euro.
07.09.2009
Churke 211 1 2
1
Für Geldbeträge gibts decimal (oder hast du das eh gemeint?).
gfoidl 07.09.2009
1
"Die eigentliche Ursache für dieses Problem ist die interne Darstellung"

Ach, die 0.35 im ersten Summanden wird anders dargestellt als die 0.35 im zweiten Summanden?
knivil 02.11.2009
2
Hast du die Antwort gelesen? 0.35 wird hier nie erwähnt. Das gezeigte geht 0.1 aus.

BTW: Bei der Subtraktion gibts keine Summanden. Dort werden sie als Minuend - Subtrahend bezeichnet.
gfoidl 02.11.2009
5
Dieses Phänomen tritt bei Kommazahlen am Computer häufig auf. float und double sind [Gleitkommazahlen][1], d.h. sie haben nur eine beschränkte Genauigkeit.


[1]: http://de.wikipedia.org/wiki/Gleitkommazahl
19.07.2009
alexander 860 2 9
1
"Dieses Phänomen tritt bei Kommazahlen am Computer häufig auf."

Bei nie wenn ich 0.35 - 0.35 rechne.
knivil 02.11.2009

Stelle deine .net-Frage jetzt!
TOP TECHNOLOGIES CONSULTING GmbH