Estaba viendo la implementación de compare(double, double) en la biblioteca estándar de Java (6). Se lee:¿Por qué Java's Double.compare (doble, doble) está implementado como está?
public static int compare(double d1, double d2) {
if (d1 < d2)
return -1; // Neither val is NaN, thisVal is smaller
if (d1 > d2)
return 1; // Neither val is NaN, thisVal is larger
long thisBits = Double.doubleToLongBits(d1);
long anotherBits = Double.doubleToLongBits(d2);
return (thisBits == anotherBits ? 0 : // Values are equal
(thisBits < anotherBits ? -1 : // (-0.0, 0.0) or (!NaN, NaN)
1)); // (0.0, -0.0) or (NaN, !NaN)
}
¿Cuáles son los méritos de esta implementación?
corregir: "Merits" fue una (muy) mala elección de palabras. Quería saber cómo funciona esto.
Relacionado con esto y toda la discusión aquí: echa un vistazo a este poco de horribleidad JDK en el área de la comparación de punto flotante: http://publicobject.com/2009/11/floating-point-equality.html –
@KevinBourrillion - La forma en que lo leí, en realidad se trata de la horribleidad del estándar de coma flotante IEE. Java tiene que comportarse de acuerdo con el estándar IEE, porque eso es lo que implementa el hardware en una máquina moderna. –