Skip to content

Commit

Permalink
Fix Math.expm1 implementation
Browse files Browse the repository at this point in the history
Bug: #9331
Change-Id: I65639c4462155a07333d35d91f2e69f66c62489a
Bug-Link: #9331
  • Loading branch information
korzha committed May 15, 2016
1 parent 607054b commit 64da754
Show file tree
Hide file tree
Showing 2 changed files with 45 additions and 36 deletions.
11 changes: 1 addition & 10 deletions user/super/com/google/gwt/emul/java/lang/Math.java
Expand Up @@ -136,16 +136,7 @@ public static double exp(double x) {
}

public static double expm1(double d) {
if (d == 0.0 || Double.isNaN(d)) {
return d; // "a zero with same sign as argument", arg is zero, so...
} else if (!Double.isInfinite(d)) {
if (d < 0.0d) {
return -1.0d;
} else {
return Double.POSITIVE_INFINITY;
}
}
return exp(d) + 1.0d;
return d == 0 ? d : exp(d) - 1;
}

public static double floor(double x) {
Expand Down
70 changes: 44 additions & 26 deletions user/test/com/google/gwt/emultest/java/lang/MathTest.java
Expand Up @@ -42,6 +42,14 @@ private static void assertPositiveZero(double x) {
assertFalse(isNegativeZero(x));
}

private static void assertNaN(double x) {
assertTrue(Double.isNaN(x));
}

private static void assertEquals(double expected, double actual) {
assertEquals(expected, actual, 0.);
}

private static boolean isNegativeZero(double x) {
return Double.doubleToLongBits(-0.0) == Double.doubleToLongBits(x);
}
Expand Down Expand Up @@ -71,7 +79,7 @@ public void testAbs() {
v = Math.abs(Double.POSITIVE_INFINITY);
assertEquals(Double.POSITIVE_INFINITY, v);
v = Math.abs(Double.NaN);
assertTrue(Double.isNaN(v));
assertNaN(v);
}

public void testAddExact() {
Expand Down Expand Up @@ -156,11 +164,11 @@ public void testCos() {
v = Math.cos(Math.PI * 1.5);
assertEquals(0.0, v, 1e-7);
v = Math.cos(Double.NaN);
assertTrue(Double.isNaN(v));
assertNaN(v);
v = Math.cos(Double.NEGATIVE_INFINITY);
assertTrue(Double.isNaN(v));
assertNaN(v);
v = Math.cos(Double.POSITIVE_INFINITY);
assertTrue(Double.isNaN(v));
assertNaN(v);
}

public void testCosh() {
Expand All @@ -171,7 +179,7 @@ public void testCosh() {
v = Math.cosh(-1.0);
assertEquals(1.5430806348, v, 1e-7);
v = Math.cosh(Double.NaN);
assertTrue(Double.isNaN(v));
assertNaN(v);
v = Math.cosh(Double.NEGATIVE_INFINITY);
assertEquals(Double.POSITIVE_INFINITY, v);
v = Math.cosh(Double.POSITIVE_INFINITY);
Expand Down Expand Up @@ -204,6 +212,16 @@ public void testDecrementExactLong() {
}
}

public void testExpm1() {
assertNegativeZero(Math.expm1(-0.));
assertPositiveZero(Math.expm1(0.));
assertNaN(Math.expm1(Double.NaN));
assertEquals(Double.POSITIVE_INFINITY, Math.expm1(Double.POSITIVE_INFINITY));
assertEquals(-1., Math.expm1(Double.NEGATIVE_INFINITY));
assertEquals(-0.632, Math.expm1(-1), 0.001);
assertEquals(1.718, Math.expm1(1), 0.001);
}

public void testFloor() {
double v = Math.floor(0.5);
assertEquals(0, v, 0);
Expand Down Expand Up @@ -320,12 +338,12 @@ public void testMax() {
assertEquals(1d, Math.max(1d, -1d));
assertEquals(-1d, Math.max(-1d, -2d));
assertEquals(-1d, Math.max(-2d, -1d));
assertTrue(Double.isNaN(Math.max(Double.NaN, 1d)));
assertTrue(Double.isNaN(Math.max(1d, Double.NaN)));
assertTrue(Double.isNaN(Math.max(Double.NaN, Double.POSITIVE_INFINITY)));
assertTrue(Double.isNaN(Math.max(Double.POSITIVE_INFINITY, Double.NaN)));
assertTrue(Double.isNaN(Math.max(Double.NaN, Double.NEGATIVE_INFINITY)));
assertTrue(Double.isNaN(Math.max(Double.NEGATIVE_INFINITY, Double.NaN)));
assertNaN(Math.max(Double.NaN, 1d));
assertNaN(Math.max(1d, Double.NaN));
assertNaN(Math.max(Double.NaN, Double.POSITIVE_INFINITY));
assertNaN(Math.max(Double.POSITIVE_INFINITY, Double.NaN));
assertNaN(Math.max(Double.NaN, Double.NEGATIVE_INFINITY));
assertNaN(Math.max(Double.NEGATIVE_INFINITY, Double.NaN));

assertEquals(2f, Math.max(1f, 2f));
assertEquals(2f, Math.max(2f, 1f));
Expand All @@ -352,12 +370,12 @@ public void testMin() {
assertEquals(-1d, Math.min(1d, -1d));
assertEquals(-2d, Math.min(-1d, -2d));
assertEquals(-2d, Math.min(-2d, -1d));
assertTrue(Double.isNaN(Math.min(Double.NaN, 1d)));
assertTrue(Double.isNaN(Math.min(1d, Double.NaN)));
assertTrue(Double.isNaN(Math.min(Double.NaN, Double.POSITIVE_INFINITY)));
assertTrue(Double.isNaN(Math.min(Double.POSITIVE_INFINITY, Double.NaN)));
assertTrue(Double.isNaN(Math.min(Double.NaN, Double.NEGATIVE_INFINITY)));
assertTrue(Double.isNaN(Math.min(Double.NEGATIVE_INFINITY, Double.NaN)));
assertNaN(Math.min(Double.NaN, 1d));
assertNaN(Math.min(1d, Double.NaN));
assertNaN(Math.min(Double.NaN, Double.POSITIVE_INFINITY));
assertNaN(Math.min(Double.POSITIVE_INFINITY, Double.NaN));
assertNaN(Math.min(Double.NaN, Double.NEGATIVE_INFINITY));
assertNaN(Math.min(Double.NEGATIVE_INFINITY, Double.NaN));

assertEquals(1f, Math.min(1f, 2f));
assertEquals(1f, Math.min(2f, 1f));
Expand Down Expand Up @@ -519,7 +537,7 @@ public void testRint_DoubleMaxValue() {
}

public void testSignum() {
assertTrue(Double.isNaN(Math.signum(Double.NaN)));
assertNaN(Math.signum(Double.NaN));
assertTrue(isNegativeZero(Math.signum(-0.)));
assertEquals(0., Math.signum(0.), 0);
assertEquals(-1, Math.signum(-2), 0);
Expand All @@ -542,11 +560,11 @@ public void testSin() {
v = Math.sin(Math.PI * 1.5);
assertEquals(-1.0, v, 1e-7);
v = Math.sin(Double.NaN);
assertTrue(Double.isNaN(v));
assertNaN(v);
v = Math.sin(Double.NEGATIVE_INFINITY);
assertTrue(Double.isNaN(v));
assertNaN(v);
v = Math.sin(Double.POSITIVE_INFINITY);
assertTrue(Double.isNaN(v));
assertNaN(v);
}

public void testSinh() {
Expand All @@ -557,7 +575,7 @@ public void testSinh() {
v = Math.sinh(-1.0);
assertEquals(-1.175201193, v, 1e-7);
v = Math.sinh(Double.NaN);
assertTrue(Double.isNaN(v));
assertNaN(v);
v = Math.sinh(Double.NEGATIVE_INFINITY);
assertEquals(Double.NEGATIVE_INFINITY, v);
v = Math.sinh(Double.POSITIVE_INFINITY);
Expand All @@ -572,11 +590,11 @@ public void testTan() {
v = Math.tan(-0.0);
assertEquals(-0.0, v, 1e-7);
v = Math.tan(Double.NaN);
assertTrue(Double.isNaN(v));
assertNaN(v);
v = Math.tan(Double.NEGATIVE_INFINITY);
assertTrue(Double.isNaN(v));
assertNaN(v);
v = Math.tan(Double.POSITIVE_INFINITY);
assertTrue(Double.isNaN(v));
assertNaN(v);
}

public void testTanh() {
Expand All @@ -587,7 +605,7 @@ public void testTanh() {
v = Math.tanh(-1.0);
assertEquals(-0.761594155, v, 1e-7);
v = Math.tanh(Double.NaN);
assertTrue(Double.isNaN(v));
assertNaN(v);
v = Math.tanh(Double.NEGATIVE_INFINITY);
assertEquals(-1.0, v, 1e-7);
v = Math.tanh(Double.POSITIVE_INFINITY);
Expand Down

0 comments on commit 64da754

Please sign in to comment.