Fix Math.tanh when applied to values > ~355. PiperOrigin-RevId: 311832683 Change-Id: I806129162c3af643527c4bbce1c88ee027662bc2
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 1053db3..5bf6829 100644 --- a/user/super/com/google/gwt/emul/java/lang/Math.java +++ b/user/super/com/google/gwt/emul/java/lang/Math.java
@@ -308,7 +308,7 @@ public static native double sin(double x); public static double sinh(double x) { - return x == 0 ? x : (exp(x) - exp(-x)) / 2; + return x == 0.0 ? x : (exp(x) - exp(-x)) / 2; } @JsMethod(namespace = JsPackage.GLOBAL, name = "Math.sqrt") @@ -319,13 +319,15 @@ public static double tanh(double x) { if (x == 0.0) { + // -0.0 should return -0.0. return x; - } else if (Double.isInfinite(x)) { - return signum(x); - } else { - double e2x = exp(2 * x); - return (e2x - 1) / (e2x + 1); } + + double e2x = exp(2 * x); + if (Double.isInfinite(e2x)) { + return 1; + } + return (e2x - 1) / (e2x + 1); } public static double toDegrees(double x) {
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 20897a4..50e4d1d 100644 --- a/user/test/com/google/gwt/emultest/java/lang/MathTest.java +++ b/user/test/com/google/gwt/emultest/java/lang/MathTest.java
@@ -579,8 +579,14 @@ assertEquals(0.761594155, v, 1e-7); v = Math.tanh(-1.0); assertEquals(-0.761594155, v, 1e-7); + v = Math.tanh(500); + assertEquals(1.0, v, 1e-7); + v = Math.tanh(-500); + assertEquals(-1.0, v, 1e-7); v = Math.tanh(Double.NaN); assertNaN(v); + v = Math.tanh(Double.MAX_VALUE); + assertEquals(1.0, v, 1e-7); v = Math.tanh(Double.NEGATIVE_INFINITY); assertEquals(-1.0, v, 1e-7); v = Math.tanh(Double.POSITIVE_INFINITY);