thas11 - Do 21.04.11 14:29
Titel: Double Werte und CSharp
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:
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
thas11 - 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 - 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
http://en.wikipedia.org/wiki/Machine_epsilon durchlesen (der deutsche Beitrag "Maschinengenauigkeit" ist leider nicht so detailliert).