2012-07-09 9 views
13

Gibt es Java-Bibliotheken für einen doppelten Vergleich? z.B.Java Double Comparison

Jedes Projekt, das ich beginne ich am Ende re-Implementieren dieses und Kopieren-Einfügen-Code und Test.

NB ein gutes Beispiel dafür, warum seine bessere 3rd-Party-JAR-Dateien zu verwenden, ist, dass IBM den folgende empfehlen:

„Wenn Sie nicht wissen, das Ausmaß der zugrunde liegenden Messungen mit Hilfe des Test“ abs (a/b - 1) < epsilon „ist wahrscheinlich robuster sein als nur Vergleich der Differenz“

ich bezweifle, viele Menschen daran gedacht hätte, und zeigt, dass selbst einfache Code suboptimal sein kann.

+0

Ich folge nicht. Sie machen den Vergleich genau dort mit einer wirklich kurzen Codezeile. Warum sollten Sie es in eine Methode einbinden? – Thor84no

+0

Warum möchten Sie eine Bibliothek, die einen doppelten Vergleich durchführt? Macht keinen Sinn, da die Standardsprache das schon macht. Lege diese Methode in ein JAR, importiere sie, wann immer es nötig ist und du bist fertig. – m0skit0

+0

Ich schreibe Code für viele verschiedene Leute und ich kann nicht die gleiche JAR aus Gründen des geistigen Eigentums verwenden. Außerdem besteht immer die Möglichkeit, dass mein Code fehlerhaft ist. –

Antwort

16
+0

WARNUNG: Guavas 'fuzzyCompare()' verwendet den naiven Ansatz der "maximalen absoluten Differenz", der sehr unzuverlässig ist, da er nur für einen sehr begrenzten Bereich von Werten durch Abrundung und Aufhebung in Fließkommazahlen funktioniert. Ich würde es nicht benutzen. Siehe [diese Antwort] (http://stackoverflow.com/a/28751350/4610114) zu einer verwandten Frage für weitere Details, oder (meine Empfehlung) lesen Sie [diesen Artikel] (https://randomascii.wordpress.com/2012/02/25/floating-point-numbers-2012-edition /) für eine gelungene Einführung in die Komplexität des scheinbar einfachen Problems der Float-Vergleiche. –

2

In der Standard-Java-Bibliothek gibt es keine Methoden, um Ihr Problem tatsächlich zu behandeln Ich schlage vor, Joachim Link zu folgen und die Bibliothek zu verwenden, die ziemlich gut für Ihre Bedürfnisse ist, obwohl mein Vorschlag wäre, eine UTILS-Bibliothek zu erstellen Sie können häufig verwendete Methoden wie die hinzufügen, die Sie in Ihrer Frage angegeben haben, wie für verschiedene Implementierungen des Problems sollten bedenken Sie in diesem suchen:

Java double comparison epsilon

Fühlen Sie sich frei weitere Unklarheiten fragen

2

Sie sollten auf jede lib verzichten rary, die den naiven "maximalen absoluten Unterschied" Ansatz (wie Guava) verwendet. Wie in dem ausgezeichneten Artikel Comparing Floating Point Numbers, 2012 edition von Bruce Dawson beschrieben, ist er sehr fehleranfällig, da er nur für einen sehr begrenzten Bereich von Werten funktioniert. Ein viel robusterer Ansatz besteht darin, relative Unterschiede oder ULPs für ungefähre Vergleiche zu verwenden.

Die einzige mir bekannte Bibliothek, die einen korrekten ungefähren Vergleichsalgorithmus implementiert, ist .