You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by er...@apache.org on 2013/11/05 14:51:24 UTC

svn commit: r1538998 - in /commons/proper/math/trunk/src: changes/ main/java/org/apache/commons/math3/distribution/ main/java/org/apache/commons/math3/special/ test/java/org/apache/commons/math3/distribution/ test/java/org/apache/commons/math3/special/

Author: erans
Date: Tue Nov  5 13:51:24 2013
New Revision: 1538998

URL: http://svn.apache.org/r1538998
Log:
MATH-1058
Precision improvements by using "expm1" and "log1p". Thanks to Sean Owen.

Modified:
    commons/proper/math/trunk/src/changes/changes.xml
    commons/proper/math/trunk/src/main/java/org/apache/commons/math3/distribution/LogNormalDistribution.java
    commons/proper/math/trunk/src/main/java/org/apache/commons/math3/distribution/WeibullDistribution.java
    commons/proper/math/trunk/src/main/java/org/apache/commons/math3/special/Beta.java
    commons/proper/math/trunk/src/test/java/org/apache/commons/math3/distribution/LogNormalDistributionTest.java
    commons/proper/math/trunk/src/test/java/org/apache/commons/math3/distribution/WeibullDistributionTest.java
    commons/proper/math/trunk/src/test/java/org/apache/commons/math3/special/BetaTest.java

Modified: commons/proper/math/trunk/src/changes/changes.xml
URL: http://svn.apache.org/viewvc/commons/proper/math/trunk/src/changes/changes.xml?rev=1538998&r1=1538997&r2=1538998&view=diff
==============================================================================
--- commons/proper/math/trunk/src/changes/changes.xml (original)
+++ commons/proper/math/trunk/src/changes/changes.xml Tue Nov  5 13:51:24 2013
@@ -51,6 +51,10 @@ If the output is not quite correct, chec
   </properties>
   <body>
     <release version="3.3" date="TBD" description="TBD">
+      <action dev="erans" type="fix" issue="MATH-1058" due-to="Sean Owen">
+        Precision improvements (for small values of the argument) in "Beta" function
+        and in "LogNormalDistribution" and "WeibullDistribution".
+      </action>
       <action dev="tn" type="fix" issue="MATH-1055" due-to="Sean Owen">
         Fixed some invalid links inside javadoc and added missing deprecated annotations.
       </action>

Modified: commons/proper/math/trunk/src/main/java/org/apache/commons/math3/distribution/LogNormalDistribution.java
URL: http://svn.apache.org/viewvc/commons/proper/math/trunk/src/main/java/org/apache/commons/math3/distribution/LogNormalDistribution.java?rev=1538998&r1=1538997&r2=1538998&view=diff
==============================================================================
--- commons/proper/math/trunk/src/main/java/org/apache/commons/math3/distribution/LogNormalDistribution.java (original)
+++ commons/proper/math/trunk/src/main/java/org/apache/commons/math3/distribution/LogNormalDistribution.java Tue Nov  5 13:51:24 2013
@@ -289,7 +289,7 @@ public class LogNormalDistribution exten
     public double getNumericalVariance() {
         final double s = shape;
         final double ss = s * s;
-        return (FastMath.exp(ss) - 1) * FastMath.exp(2 * scale + ss);
+        return (FastMath.expm1(ss)) * FastMath.exp(2 * scale + ss);
     }
 
     /**

Modified: commons/proper/math/trunk/src/main/java/org/apache/commons/math3/distribution/WeibullDistribution.java
URL: http://svn.apache.org/viewvc/commons/proper/math/trunk/src/main/java/org/apache/commons/math3/distribution/WeibullDistribution.java?rev=1538998&r1=1538997&r2=1538998&view=diff
==============================================================================
--- commons/proper/math/trunk/src/main/java/org/apache/commons/math3/distribution/WeibullDistribution.java (original)
+++ commons/proper/math/trunk/src/main/java/org/apache/commons/math3/distribution/WeibullDistribution.java Tue Nov  5 13:51:24 2013
@@ -221,7 +221,7 @@ public class WeibullDistribution extends
         } else  if (p == 1) {
             ret = Double.POSITIVE_INFINITY;
         } else {
-            ret = scale * FastMath.pow(-FastMath.log(1.0 - p), 1.0 / shape);
+            ret = scale * FastMath.pow(-FastMath.log1p(-p), 1.0 / shape);
         }
         return ret;
     }

Modified: commons/proper/math/trunk/src/main/java/org/apache/commons/math3/special/Beta.java
URL: http://svn.apache.org/viewvc/commons/proper/math/trunk/src/main/java/org/apache/commons/math3/special/Beta.java?rev=1538998&r1=1538997&r2=1538998&view=diff
==============================================================================
--- commons/proper/math/trunk/src/main/java/org/apache/commons/math3/special/Beta.java (original)
+++ commons/proper/math/trunk/src/main/java/org/apache/commons/math3/special/Beta.java Tue Nov  5 13:51:24 2013
@@ -218,7 +218,7 @@ public class Beta {
                     return 1.0;
                 }
             };
-            ret = FastMath.exp((a * FastMath.log(x)) + (b * FastMath.log(1.0 - x)) -
+            ret = FastMath.exp((a * FastMath.log(x)) + (b * FastMath.log1p(-x)) -
                 FastMath.log(a) - logBeta(a, b)) *
                 1.0 / fraction.evaluate(x, epsilon, maxIterations);
         }

Modified: commons/proper/math/trunk/src/test/java/org/apache/commons/math3/distribution/LogNormalDistributionTest.java
URL: http://svn.apache.org/viewvc/commons/proper/math/trunk/src/test/java/org/apache/commons/math3/distribution/LogNormalDistributionTest.java?rev=1538998&r1=1538997&r2=1538998&view=diff
==============================================================================
--- commons/proper/math/trunk/src/test/java/org/apache/commons/math3/distribution/LogNormalDistributionTest.java (original)
+++ commons/proper/math/trunk/src/test/java/org/apache/commons/math3/distribution/LogNormalDistributionTest.java Tue Nov  5 13:51:24 2013
@@ -243,4 +243,12 @@ public class LogNormalDistributionTest e
         Assert.assertEquals(dist.getNumericalMean(), 0.0, tol);
         Assert.assertEquals(dist.getNumericalVariance(), 0.0, tol);
     }
+
+    @Test
+    public void testTinyVariance() {
+        LogNormalDistribution dist = new LogNormalDistribution(0, 1e-9);
+        double t = dist.getNumericalVariance();
+        Assert.assertEquals(1e-18, t, 1e-20);
+    }
+
 }

Modified: commons/proper/math/trunk/src/test/java/org/apache/commons/math3/distribution/WeibullDistributionTest.java
URL: http://svn.apache.org/viewvc/commons/proper/math/trunk/src/test/java/org/apache/commons/math3/distribution/WeibullDistributionTest.java?rev=1538998&r1=1538997&r2=1538998&view=diff
==============================================================================
--- commons/proper/math/trunk/src/test/java/org/apache/commons/math3/distribution/WeibullDistributionTest.java (original)
+++ commons/proper/math/trunk/src/test/java/org/apache/commons/math3/distribution/WeibullDistributionTest.java Tue Nov  5 13:51:24 2013
@@ -64,6 +64,16 @@ public class WeibullDistributionTest ext
     //---------------------------- Additional test cases -------------------------
 
     @Test
+    public void testInverseCumulativeProbabilitySmallPAccuracy() {
+        WeibullDistribution dist = new WeibullDistribution(2, 3);
+        double t = dist.inverseCumulativeProbability(1e-17);
+        // Analytically, answer is solution to 1e-17 = 1-exp(-(x/3)^2)
+        // x = sqrt(-9*log(1-1e-17))
+        // If we're not careful, answer will be 0. Answer below is computed with care in Octave:
+        Assert.assertEquals(9.48683298050514e-9, t, 1e-17);
+    }
+
+    @Test
     public void testInverseCumulativeProbabilityExtremes() {
         setInverseCumulativeTestPoints(new double[] {0.0, 1.0});
         setInverseCumulativeTestValues(

Modified: commons/proper/math/trunk/src/test/java/org/apache/commons/math3/special/BetaTest.java
URL: http://svn.apache.org/viewvc/commons/proper/math/trunk/src/test/java/org/apache/commons/math3/special/BetaTest.java?rev=1538998&r1=1538997&r2=1538998&view=diff
==============================================================================
--- commons/proper/math/trunk/src/test/java/org/apache/commons/math3/special/BetaTest.java (original)
+++ commons/proper/math/trunk/src/test/java/org/apache/commons/math3/special/BetaTest.java Tue Nov  5 13:51:24 2013
@@ -135,6 +135,13 @@ public class BetaTest {
     }
 
     @Test
+    public void testRegularizedBetaTinyArgument() {
+        double actual = Beta.regularizedBeta(1e-17, 1.0, 1e12);
+        // This value is from R: pbeta(1e-17,1,1e12)
+        TestUtils.assertEquals(9.999950000166648e-6, actual, 1e-16);
+    }
+
+    @Test
     public void testLogBetaNanPositive() {
         testLogBeta(Double.NaN, Double.NaN, 2.0);
     }