I've encountered something strange regarding comparing double zeros. Depending on how the double zero primitives are initiated the Double.compare(double,double) method may or may not think that they are "equal" (may or may not return 0).
Comparing the various zero double:s using == always reports them as equal. If they are equal in terms of ==, they must (should) be equal in terms of the the compare method. They are not!
Check out this sample program:
public class CompareZeros {
public static void main(final String[] args) {
final double negDbl = -0.0;
final double posInt = 0;
final double posDbl = 0.0;
final double negInt = -0;
CompareZeros.compare("negDbl <-> posInt", negDbl, posInt);
CompareZeros.compare("negDbl <-> posDbl", negDbl, posDbl);
CompareZeros.compare("negDbl <-> negInt", negDbl, negInt);
CompareZeros.compare("posInt <-> negDbl", posInt, negDbl);
CompareZeros.compare("posInt <-> posDbl", posInt, posDbl);
CompareZeros.compare("posInt <-> negInt", posInt, negInt);
CompareZeros.compare("posDbl <-> negDbl", posDbl, negDbl);
CompareZeros.compare("posDbl <-> posInt", posDbl, posInt);
CompareZeros.compare("posDbl <-> negInt", posDbl, negInt);
CompareZeros.compare("negInt <-> negDbl", negInt, negDbl);
CompareZeros.compare("negInt <-> posInt", negInt, posInt);
CompareZeros.compare("negInt <-> posDbl", negInt, posDbl);
}
static void compare(final String id, final double arg0, final double arg1) {
System.out.print(id + ": ");
if (arg0 == arg1) {
if (Double.compare(arg0, arg1) == 0) {
System.out.println("OK");
} else {
System.out.println("Strange, and must be wrong!");
}
} else {
if (Double.compare(arg0, arg1) == 0) {
System.out.println("Strange, but perhaps logically ok");
} else {
System.out.println("Consistent...");
}
}
}
}
It outputs this:
negDbl <-> posInt: Strange, and must be wrong!
negDbl <-> posDbl: Strange, and must be wrong!
negDbl <-> negInt: Strange, and must be wrong!
posInt <-> negDbl: Strange, and must be wrong!
posInt <-> posDbl: OK
posInt <-> negInt: OK
posDbl <-> negDbl: Strange, and must be wrong!
posDbl <-> posInt: OK
posDbl <-> negInt: OK
negInt <-> negDbl: Strange, and must be wrong!
negInt <-> posInt: OK
negInt <-> posDbl: OK