Je regardais l'implémentation de compare(double, double) dans la bibliothèque standard de Java (6). Il se lit comme suit :
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)
}
Quels sont les mérites de cette mise en œuvre ?
edit : "Merits" était un (très) mauvais choix de mots. Je voulais savoir comment cela fonctionne.
1 votes
Dans le même ordre d'idées que la discussion qui se tient ici, jetez un coup d'œil à cette horreur du JDK dans le domaine de la comparaison des nombres à virgule flottante : publicobject.com/2009/11/floating-point-equality.html
0 votes
@KevinBourrillion - D'après ce que j'ai lu, il s'agit en fait de l'horreur de la norme de virgule flottante de l'IEE. Java doit se comporter conformément à la norme IEE, car c'est ce que le matériel d'une machine moderne met en œuvre.