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);