I came across something strange in comparing double zeros. Depending on how the double zero primitives are initiated, the Double.compare (double, double) method may or may not assume that they are "equal" (may or may not return 0).
Comparing the different values double double: s using == always reports them as equal. If they are equal in terms of ==, they should (should) be equal in terms of the comparison method. They are not!
Check out this 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...");
}
}
}
}
He 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