2012-07-09 13 views
13

¿Hay bibliotecas Java para hacer una comparación doble? p.Java Double Comparison

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

Cada proyecto que empiezo termino por volver a implementar esto y copiar y pegar el código y la prueba.

NB un buen ejemplo de por qué es mejor usar JAR 3 ª parte es que IBM sugerimos:

"Si no conoce la escala de las mediciones subyacentes, mediante la prueba de " abs (a/b - 1) < épsilon "es probable que sea más robusto que simplemente comparar la diferencia"

dudo que mucha gente habría pensado en esto e ilustra que incluso código simple puede ser sub-óptima.

+0

No sigo. Estás haciendo la comparación allí mismo con una línea de código realmente corta. ¿Por qué tendrías que envolverlo en un método? – Thor84no

+0

¿Por qué querrías una biblioteca que haga doble comparación? No tiene sentido ya que el lenguaje estándar ya lo hace. Coloca ese método tuyo en un JAR, importa cuando sea necesario y listo. – m0skit0

+0

Escribo código para muchas personas diferentes y no puedo usar el mismo JAR por razones de propiedad intelectual. También siempre existe la posibilidad de que mi código tenga errores. –

Respuesta

16
+0

ADVERTENCIA: el 'fuzzyCompare()' de Guava usa el enfoque ingenuo de "diferencia absoluta máxima", que es muy poco confiable, ya que solo funciona para un rango muy limitado de valores debido al redondeo y cancelación inherentes a los flotadores. No lo usaría Consulte [esta respuesta] (http://stackoverflow.com/a/28751350/4610114) a una pregunta relacionada para obtener más detalles, o (mi recomendación) lea [este artículo] (https://randomascii.wordpress.com/2012/02/25/comparing-floating-point-numbers-2012-edition /) para una gran introducción a las complejidades del problema aparentemente simple de las comparaciones de flotación. –

2

En la biblioteca estándar de Java no hay métodos para manejar su problema. Le sugiero que siga el enlace de Joachim y use esa biblioteca que sea bastante buena para sus necesidades, aunque mi sugerencia sería crear una biblioteca de utilidades en la que se podría añadir métodos utilizados con frecuencia como el que usted ha declarado en su pregunta, como para diferentes implementaciones de su problema se debe considerar el mirar en esto:

Java double comparison epsilon

No dude en preguntar a cabo cualesquiera otras ambigüedades

2

Debe abstenerse de cualquier lib rary que usa el enfoque ingenuo de "diferencia absoluta máxima" (como la guayaba). Como se detalla en el excelente artículo de Bruce Dawson Comparing Floating Point Numbers, 2012 edition, es altamente propenso a errores, ya que solo funciona para un rango muy limitado de valores. Un enfoque mucho más sólido es usar diferencias relativas o ULP para las comparaciones aproximadas.

La única biblioteca que conozco que implementa un algoritmo de comparación aproximado correcto es apache.common.math.