Stavo osservando l'implementazione di compare(double, double) nella libreria standard Java (6). Si legge:Perché la funzione Double.compare (double, double) di Java è implementata così com'è?
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)
}
Quali sono i vantaggi di questa implementazione?
modifica: "Meriti" era una (molto) brutta scelta di parole. Volevo sapere come funziona.
Correlato a questo e a tutta la discussione qui: controlla questo po 'di orribilezza di JDK nell'area del confronto in virgola mobile: http://publicobject.com/2009/11/floating-point-equality.html –
@KevinBourrillion - Il modo in cui l'ho letto, riguarda in realtà l'orribilità dello standard in virgola mobile IEE. Java deve comportarsi secondo lo standard IEE, perché questo è ciò che l'hardware su una macchina moderna implementa. –