This is an automated email from the ASF dual-hosted git repository. aherbert pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/commons-numbers.git
commit 244f6e7a0d93ed92d0748b062d29a59333217b5e Author: Alex Herbert <aherb...@apache.org> AuthorDate: Thu Dec 19 19:00:43 2019 +0000 Remove use of log1p when value is very small. --- .../src/main/java/org/apache/commons/numbers/complex/Complex.java | 6 +++--- .../test/java/org/apache/commons/numbers/complex/ComplexTest.java | 5 +++++ 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/commons-numbers-complex/src/main/java/org/apache/commons/numbers/complex/Complex.java b/commons-numbers-complex/src/main/java/org/apache/commons/numbers/complex/Complex.java index 5e6fab3..33b6056 100644 --- a/commons-numbers-complex/src/main/java/org/apache/commons/numbers/complex/Complex.java +++ b/commons-numbers-complex/src/main/java/org/apache/commons/numbers/complex/Complex.java @@ -1782,9 +1782,9 @@ public final class Complex implements Serializable { re = Math.log1p((4 * x / y) / (mxp1 * mxp1 / y + y)); } else { // Big y, small x, as above but neglect (1-x)^2/y: - // Note: The boost version has no log1p here. - // This will tend towards 0 and log1p(0) = 0 so it may not matter. - re = Math.log1p(4 * x / y / y); + // Note: log1p(v) == v - v^2/2 + v^3/3 ... Taylor series when v is small. + // Here v is so small only the first term matters. + re = 4 * x / y / y; } } else if (x == 1) { // x = 1, small y: diff --git a/commons-numbers-complex/src/test/java/org/apache/commons/numbers/complex/ComplexTest.java b/commons-numbers-complex/src/test/java/org/apache/commons/numbers/complex/ComplexTest.java index 28601fb..b14166b 100644 --- a/commons-numbers-complex/src/test/java/org/apache/commons/numbers/complex/ComplexTest.java +++ b/commons-numbers-complex/src/test/java/org/apache/commons/numbers/complex/ComplexTest.java @@ -2036,5 +2036,10 @@ public class ComplexTest { Assertions.assertEquals(1, (1 - safeLower) * (1 - safeLower)); // Can we assume 1 - y^2 = 1 when y is small Assertions.assertEquals(1, 1 - safeLower * safeLower); + // Can we assume Math.log1p(4 * x / y / y) = (4 * x / y / y) when big y and small x + final double result = 4 * safeLower / safeUpper / safeUpper; + Assertions.assertEquals(result, Math.log1p(result)); + Assertions.assertEquals(result, result - result * result / 2, + "Expected log1p Taylor series to be redundant"); } }