Handle NaN and -0.0 in Math.signum

Change-Id: I0aae67a00fb99ac61c17aa80e595cd689e5d18d8
diff --git a/user/super/com/google/gwt/emul/java/lang/Math.java b/user/super/com/google/gwt/emul/java/lang/Math.java
index cb01dc1..82463fa 100644
--- a/user/super/com/google/gwt/emul/java/lang/Math.java
+++ b/user/super/com/google/gwt/emul/java/lang/Math.java
@@ -324,12 +324,10 @@
   }
 
   public static double signum(double d) {
-    if (d > 0.0d) {
-      return 1.0d;
-    } else if (d < 0.0d) {
-      return -1.0d;
+    if (d == 0. || Double.isNaN(d)) {
+      return d;
     } else {
-      return 0.0d;
+      return d < 0 ? -1 : 1;
     }
   }
 
diff --git a/user/test/com/google/gwt/emultest/java/lang/MathTest.java b/user/test/com/google/gwt/emultest/java/lang/MathTest.java
index 7f63a27..c47d4ff 100644
--- a/user/test/com/google/gwt/emultest/java/lang/MathTest.java
+++ b/user/test/com/google/gwt/emultest/java/lang/MathTest.java
@@ -475,6 +475,18 @@
     }
   }
 
+  public void testSignum() {
+    assertTrue(Double.isNaN(Math.signum(Double.NaN)));
+    assertTrue(isNegativeZero(Math.signum(-0.)));
+    assertEquals(0., Math.signum(0.), 0);
+    assertEquals(-1, Math.signum(-2), 0);
+    assertEquals(1, Math.signum(2), 0);
+    assertEquals(-1., Math.signum(-Double.MAX_VALUE), 0);
+    assertEquals(1., Math.signum(Double.MAX_VALUE), 0);
+    assertEquals(-1., Math.signum(Double.NEGATIVE_INFINITY), 0);
+    assertEquals(1., Math.signum(Double.POSITIVE_INFINITY), 0);
+  }
+
   public void testSin() {
     double v = Math.sin(0.0);
     assertEquals(0.0, v, 1e-7);