Autor Beitrag
thas11
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 25



BeitragVerfasst: Do 21.04.11 14:29 
Hallo zusammen!

Bin bei cSharp noch neuer und hab eigentlich bei allen vorangegangenen Programmierspracher gelernt niemals Double Werte auf Gleichheit zu prüfen..
Hab den Vergleich dann immer in etwa so umgesetzt:

ausblenden C#-Quelltext
1:
2:
3:
4:
 public static bool isDoubleEqual(double a, double b, double eps)
{
    return Math.Abs(a - b) <= eps; 
}


Ok dann finde ich auf der Msdn raus, dass die Double Klasse den Operator "Double.Equality" anbietet um festzustellen ob ein Doublewert mit dem anderen Ident ist ... steht auch so in der Beschreibung dazu

Und dann erklärt mir auch noch ein Bekannter, dass ich unter C# auf einen double Wert die .Equals() Operation ausführen kann und dies sicher ist...
So, soweit so gut .... Nun bin ich schon etwas stutzig und meine Frage sind unter C# Double Werte plötzlich sicher ???
Hab auch schon gegoogelt und antworten gefunden welche dazu Ja als auch nein sagen..... :?:

Also was sagt ein C# Kenner dazu ... weiterhin bei meiner alten Funktion bleiben oder einfach die angebotenen Operatoren nutzen?
Desweiteren stellt sich mir die Frage, falls ich meine alte Funktion nutzen muss wie klein ich das Epsilon wählen muss, da ich diesmal mit teilweise wirklich enorm niedrigen Werten rechnen muss....


Danke & lg,
Wolfi
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19339
Erhaltene Danke: 1752

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Do 21.04.11 14:43 
user profile iconthas11 hat folgendes geschrieben Zum zitierten Posting springen:
Und dann erklärt mir auch noch ein Bekannter, dass ich unter C# auf einen double Wert die .Equals() Operation ausführen kann und dies sicher ist...
Siehe Dokumentation...
Zitat:
The Equals method should be used with caution, because two apparently equivalent values can be unequal due to the differing precision of the two values. The following example reports that the Double value .3333 and the Double returned by dividing 1 by 3 are unequal.

Aber probiere es doch aus, wie auch dort im Beispiel:
technet.microsoft.co...ibrary/ya2zha7s.aspx
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4807
Erhaltene Danke: 1061

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Do 21.04.11 14:57 
Hallo,

auch unter C# sind Fließkommazahlen-Vergleiche natürlich genauso unsicher wie in anderen Sprachen, d.h. der Epsilon-Vergleich ist nötig.
Unter Double und Float: Fehler beim Vergleich und Rundungsfehler stehen auch noch mehr Infos (auch wie man Epsilon bestimmt)...

Für exakte Berechnungen (insbesondere im Finanzbereich) empfiehlt sich aber der Datentyp 'decimal'.
thas11 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 25



BeitragVerfasst: Do 21.04.11 15:05 
Hallo!

Danke für die Antworten

@jaenicke

Zitat:

The Equals method should be used with caution, because two apparently equivalent values can be unequal due to the differing precision of the two values. The following example reports that the Double value .3333 and the Double returned by dividing 1 by 3 are unequal.


Das sind ja auch offensichtlich 2 unterschiedliche Werte und es wär meiner Meinung nach auch unlogisch wenn hier equal rauskommen würde ....

@Th69

Danke für den Link der ist super!!

Eine kurze Frage ob ich da alles richtig verstehe:
Ich rechne einfach in meinem Programm initial mein Epsilon, wie in deinem Link beschrieben aus und benutze dieses dann für die Funktion... ?

Danke & lg,
Wolfi
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4807
Erhaltene Danke: 1061

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Do 21.04.11 16:06 
Ja, hast du richtig verstanden.

Da dies eigentlich dann eine Konstante ist, kannst du diese auch einmalig berechnen und dann fest in deinem Programm als "const" vorgeben.

Du kannst dir auch mal den Artikel en.wikipedia.org/wiki/Machine_epsilon durchlesen (der deutsche Beitrag "Maschinengenauigkeit" ist leider nicht so detailliert).