I was looking at the implementation of compare(double, double) in the Java standard library (6). It reads:
public static int compare(double d1, double d2) {
The explanation is in the comments in the code. Java has double values for both 0.0 and -0.0, as well as "not a number" (NaN). You can't use simple == operator for these values. Take a peek into the doubleToLongBits() source and at the Javadoc for the Double.equals() method:
Note that in most cases, for two instances of class
Double,d1andd2, the value ofd1.equals(d2)istrueif and only ifd1.doubleValue() == d2.doubleValue()also has the value
true. However, there are two exceptions:
- If
d1andd2both representDouble.NaN, then the equals method returnstrue, even thoughDouble.NaN == Double.NaNhas the valuefalse.- If
d1represents+0.0whiled2represents-0.0, or vice versa, the equal test has the valuefalse, even though+0.0 == -0.0has the valuetrue.This definition allows hash tables to operate properly.