16 Stimmen

Faustregel zum Testen der Gleichheit von zwei Doubles in C#?

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.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X