2012-07-09 15 views
13

Czy istnieją biblioteki Java do wykonywania podwójnego porównania? np.Porównanie Double Java

public static boolean greaterThanOrEqual(double a, double b, double epsilon){ 
    return a - b > -epsilon; 
} 

Każdy projekt, który rozpoczynam, kończy się ponownym wdrożeniem tego kodu i testowania.

NB dobrym przykładem, dlaczego jej lepiej używać 3rd JAR firm jest to, że IBM zaleca następujące:

„Jeśli nie wiesz skalę pomiarów bazowych, przy użyciu testu ” abs (a/b - 1) < epsilon „jest prawdopodobnie bardziej wytrzymałe niż zwykłe porównując różnicę”

wątpię, wielu ludzi by pomyślał o tym i pokazuje, że nawet prosty kod może być nieoptymalne.

+0

Nie podążam. Dokonujesz porównania tam z naprawdę krótką linią kodu. Dlaczego trzeba zawinąć go w metodę? – Thor84no

+0

Dlaczego chcesz mieć bibliotekę, która wykonuje podwójne porównanie? Nie ma sensu, ponieważ język standardowy już to robi. Umieść tę swoją metodę w pliku JAR, zaimportuj ją, gdy zajdzie taka potrzeba, i gotowe. – m0skit0

+0

Piszę kod dla wielu różnych osób i nie mogę używać tego samego JAR z powodów związanych z własnością intelektualną. Zawsze jest też szansa, że ​​mój kod jest błędny. –

Odpowiedz

16
+0

OSTRZEŻENIE: Guawa 'fuzzyCompare()' używa naiwnego podejścia "maksymalna różnica absolutna", co jest wysoce niewiarygodne, ponieważ działa tylko dla bardzo ograniczonego zakresu wartości z powodu zaokrąglenia i anulowania właściwego dla pływaków. Nie użyłbym tego. Zobacz [tę odpowiedź] (http://stackoverflow.com/a/28751350/4610114) na powiązane pytanie, aby uzyskać więcej informacji, lub (moje zalecenie) przeczytaj [ten artykuł] (https://randomascii.wordpress.com/2012/02/25/comparing-floating-point-numbers-2012-edition /) dla wspaniałego wprowadzenia w złożoność pozornie prostego problemu porównań pływowych. –

2

W standardowej bibliotece Java nie ma żadnych metod radzenia sobie z twoim problemem. Proponuję, żebyś podążył za linkiem Joachima i użył tej biblioteki, która jest całkiem dobra dla twoich potrzeb, mimo że moja sugestia polegałaby na utworzeniu biblioteki utils, w której można dodać często używane metody jak ten pan stwierdził w swoim pytaniu, jak dla różnych implementacjach problemu należy rozważyć patrząc na to:

Java double comparison epsilon

Zapraszam do zadawania jakichkolwiek innych niejasności

2

Powinieneś powstrzymać się od jakichkolwiek lib rary, która używa naiwnego podejścia "maksymalna różnica absolutna" (jak Guava). Jak wyszczególniono w doskonałym artykule Bruce'a Dawsona Comparing Floating Point Numbers, 2012 edition, jest on wysoce podatny na błędy, ponieważ działa tylko w bardzo ograniczonym zakresie wartości. Bardziej niezawodnym podejściem jest stosowanie względnych różnic lub ULP dla przybliżonych porównań.

Jedyną biblioteką, o której wiem, że implementuje poprawny algorytm porównania jest apache.common.math.