Treat negative zero properly in Double/Float.compare()

Author: cpovirk@google.com

Change-Id: I20d14c9d35824a73ffc2ae8480a5c6d740020674
diff --git a/user/super/com/google/gwt/emul/java/lang/Double.java b/user/super/com/google/gwt/emul/java/lang/Double.java
index 422b34b..550c31a 100644
--- a/user/super/com/google/gwt/emul/java/lang/Double.java
+++ b/user/super/com/google/gwt/emul/java/lang/Double.java
@@ -103,7 +103,7 @@
       return 1;
     }
     if (x == y) {
-      return 0;
+      return x == 0 ? Double.compare(1 / x, 1 / y) : 0;
     }
 
     if (isNaN(x)) {
diff --git a/user/test/com/google/gwt/emultest/java/lang/DoubleTest.java b/user/test/com/google/gwt/emultest/java/lang/DoubleTest.java
index cd10a2b..8567199 100644
--- a/user/test/com/google/gwt/emultest/java/lang/DoubleTest.java
+++ b/user/test/com/google/gwt/emultest/java/lang/DoubleTest.java
@@ -89,6 +89,10 @@
     assertTrue(Double.compare(3.0, 500.0) < 0);
     assertTrue(Double.compare(500.0, 3.0) > 0);
     assertTrue(Double.compare(500.0, 500.0) == 0);
+    assertTrue(Double.compare(0.0, -0.0) > 0);
+    assertTrue(Double.compare(-0.0, 0.0) < 0);
+    assertTrue(Double.compare(0.0, 0.0) == 0);
+    assertTrue(Double.compare(-0.0, -0.0) == 0);
   }
 
   public void testNPE() {