Nehmen wir an, ich habe einen Code, der eine Fließkomma-Arithmetik durchführt und die Werte in Doubles speichert. Da einige Werte nicht perfekt im Binärformat dargestellt werden können, wie kann ich mit einem angemessenen Grad an Sicherheit auf Gleichheit testen?
Wie bestimme ich, was "angemessen" bedeutet?
Dose double.Epsilon
in irgendeiner Weise verwendet werden?
Update
Ein paar Dinge. Wie @ho1 bemerkte, ist die Dokumentation für double.Epsilon
weist darauf hin, dass man für den Vergleich zweier Doppelgänger auf Gleichheit wahrscheinlich einen viel größeren Wert als epsilon benötigt. Hier ist der entsprechende Absatz aus der Dokumentation:
Zwei scheinbar äquivalente Fließkommazahlen können aufgrund von Unterschieden in den niedrigstwertigen Ziffern nicht gleichwertig sein. Der C#-Ausdruck (double)1/3 == (double)0,33333 ist beispielsweise nicht gleichwertig, da die Divisionsoperation auf der linken Seite die maximale Genauigkeit hat, während die Konstante auf der rechten Seite nur auf die angegebenen Ziffern genau ist. Wenn Sie einen benutzerdefinierten Algorithmus erstellen, der bestimmt, ob zwei Fließkommazahlen als gleich angesehen werden können, müssen Sie einen Wert verwenden, der größer ist als die Epsilon-Konstante, um den akzeptablen absoluten Differenzbetrag festzulegen, damit die beiden Werte als gleich angesehen werden. (Normalerweise beträgt diese Differenzspanne um ein Vielfaches größer als Epsilon .) -- http://msdn.microsoft.com/en-us/library/system.double.epsilon.aspx
...aber die Frage ist, um wie viel größer?
Für den Fall, dass es Ihre Antwort beeinflussen würde: In meiner speziellen Situation geht es um geometrische Berechnungen (wie Punkt- und Kreuzprodukte mit Punkten und Vektoren). In manchen Fällen kommt man zu unterschiedlichen Schlussfolgerungen, je nachdem, ob A == B
, A > B
, oder A < B
Ich suche also nach einer guten Faustregel, wie man die Größe des Äquivalenzfensters bestimmen kann.