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