Author: psteitz Date: Sat Jul 21 19:33:08 2007 New Revision: 558450 URL: http://svn.apache.org/viewvc?view=rev&rev=558450 Log: Modified NormalDistributionImpl.cumulativeProbablity to catch MaxIterationsExceededException and return 0 or 1, resp. if the argument is more than 20 standard deviations from the mean.
JIRA: MATH-167 Modified: jakarta/commons/proper/math/trunk/src/java/org/apache/commons/math/distribution/NormalDistributionImpl.java jakarta/commons/proper/math/trunk/src/test/org/apache/commons/math/distribution/NormalDistributionTest.java jakarta/commons/proper/math/trunk/xdocs/changes.xml Modified: jakarta/commons/proper/math/trunk/src/java/org/apache/commons/math/distribution/NormalDistributionImpl.java URL: http://svn.apache.org/viewvc/jakarta/commons/proper/math/trunk/src/java/org/apache/commons/math/distribution/NormalDistributionImpl.java?view=diff&rev=558450&r1=558449&r2=558450 ============================================================================== --- jakarta/commons/proper/math/trunk/src/java/org/apache/commons/math/distribution/NormalDistributionImpl.java (original) +++ jakarta/commons/proper/math/trunk/src/java/org/apache/commons/math/distribution/NormalDistributionImpl.java Sat Jul 21 19:33:08 2007 @@ -20,6 +20,7 @@ import java.io.Serializable; import org.apache.commons.math.MathException; +import org.apache.commons.math.MaxIterationsExceededException; import org.apache.commons.math.special.Erf; /** @@ -100,11 +101,23 @@ * For this disbution, X, this method returns P(X < <code>x</code>). * @param x the value at which the CDF is evaluated. * @return CDF evaluted at <code>x</code>. - * @throws MathException if the algorithm fails to converge. + * @throws MathException if the algorithm fails to converge; unless + * x is more than 20 standard deviations from the mean, in which case the + * convergence exception is caught and 0 or 1 is returned. */ public double cumulativeProbability(double x) throws MathException { - return 0.5 * (1.0 + Erf.erf((x - mean) / - (standardDeviation * Math.sqrt(2.0)))); + try { + return 0.5 * (1.0 + Erf.erf((x - mean) / + (standardDeviation * Math.sqrt(2.0)))); + } catch (MaxIterationsExceededException ex) { + if (x < (mean - 20 * standardDeviation)) { // JDK 1.5 blows at 38 + return 0.0d; + } else if (x > (mean + 20 * standardDeviation)) { + return 1.0d; + } else { + throw ex; + } + } } /** Modified: jakarta/commons/proper/math/trunk/src/test/org/apache/commons/math/distribution/NormalDistributionTest.java URL: http://svn.apache.org/viewvc/jakarta/commons/proper/math/trunk/src/test/org/apache/commons/math/distribution/NormalDistributionTest.java?view=diff&rev=558450&r1=558449&r2=558450 ============================================================================== --- jakarta/commons/proper/math/trunk/src/test/org/apache/commons/math/distribution/NormalDistributionTest.java (original) +++ jakarta/commons/proper/math/trunk/src/test/org/apache/commons/math/distribution/NormalDistributionTest.java Sat Jul 21 19:33:08 2007 @@ -120,4 +120,26 @@ // Expected } } + + /** + * Check to make sure top-coding of extreme values works correctly. + * Verifies fix for JIRA MATH-167 + */ + public void testExtremeValues() throws Exception { + NormalDistribution distribution = (NormalDistribution) getDistribution(); + distribution.setMean(0); + distribution.setStandardDeviation(1); + for (int i = 0; i < 100; i+=5) { // make sure no convergence exception + double lowerTail = distribution.cumulativeProbability((double)-i); + double upperTail = distribution.cumulativeProbability((double) i); + if (i < 10) { // make sure not top-coded + assertTrue(lowerTail > 0.0d); + assertTrue(upperTail < 1.0d); + } + else { // make sure top coding not reversed + assertTrue(lowerTail < 0.00001); + assertTrue(upperTail > 0.99999); + } + } + } } Modified: jakarta/commons/proper/math/trunk/xdocs/changes.xml URL: http://svn.apache.org/viewvc/jakarta/commons/proper/math/trunk/xdocs/changes.xml?view=diff&rev=558450&r1=558449&r2=558450 ============================================================================== --- jakarta/commons/proper/math/trunk/xdocs/changes.xml (original) +++ jakarta/commons/proper/math/trunk/xdocs/changes.xml Sat Jul 21 19:33:08 2007 @@ -87,6 +87,11 @@ <action dev="psteitz" type="update" issue="MATH-160" due-to "Matthias Hummel"> Added two sample (binned comparison) ChiSquare test. </action> + <action dev="psteitz" type="fix" issue="MATH-167"> + Modified NormalDistributionImpl.cumulativeProbablity to catch + MaxIterationsExceededException and return 0 or 1, resp. if the argument + is more than 20 standard deviations from the mean. + </action> </release> <release version="1.1" date="2005-12-17" description="This is a maintenance release containing bug fixes and enhancements. --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]