Author: erans
Date: Sat Aug 10 00:57:48 2013
New Revision: 1512546

URL: http://svn.apache.org/r1512546
Log:
MATH-1021
Reordering can prevent some overflow occurrences (fix suggested by
Brian Bloniarz).
Added unit test.

Modified:
    commons/proper/math/trunk/pom.xml
    commons/proper/math/trunk/src/changes/changes.xml
    
commons/proper/math/trunk/src/main/java/org/apache/commons/math3/distribution/HypergeometricDistribution.java
    
commons/proper/math/trunk/src/test/java/org/apache/commons/math3/distribution/HypergeometricDistributionTest.java

Modified: commons/proper/math/trunk/pom.xml
URL: 
http://svn.apache.org/viewvc/commons/proper/math/trunk/pom.xml?rev=1512546&r1=1512545&r2=1512546&view=diff
==============================================================================
--- commons/proper/math/trunk/pom.xml (original)
+++ commons/proper/math/trunk/pom.xml Sat Aug 10 00:57:48 2013
@@ -151,6 +151,9 @@
       <name>Michael Bjorkegren</name>
     </contributor>
     <contributor>
+      <name>Brian Bloniarz</name>
+    </contributor>
+    <contributor>
       <name>John Bollinger</name>
     </contributor>
     <contributor>

Modified: commons/proper/math/trunk/src/changes/changes.xml
URL: 
http://svn.apache.org/viewvc/commons/proper/math/trunk/src/changes/changes.xml?rev=1512546&r1=1512545&r2=1512546&view=diff
==============================================================================
--- commons/proper/math/trunk/src/changes/changes.xml (original)
+++ commons/proper/math/trunk/src/changes/changes.xml Sat Aug 10 00:57:48 2013
@@ -51,6 +51,9 @@ If the output is not quite correct, chec
   </properties>
   <body>
     <release version="x.y" date="TBD" description="TBD">
+      <action dev="erans" type="fix" issue="MATH-1021" due-to="Brian Bloniarz">
+        Fixed overflow in "HypergeometricDistribution".
+      </action>
       <action dev="erans" type="fix" issue="MATH-1020">
         Fixed "nextPermutation" method (in 
"o.a.c.m.random.RandomDataGenerator").
         This bug does not affect applications using a previous version of

Modified: 
commons/proper/math/trunk/src/main/java/org/apache/commons/math3/distribution/HypergeometricDistribution.java
URL: 
http://svn.apache.org/viewvc/commons/proper/math/trunk/src/main/java/org/apache/commons/math3/distribution/HypergeometricDistribution.java?rev=1512546&r1=1512545&r2=1512546&view=diff
==============================================================================
--- 
commons/proper/math/trunk/src/main/java/org/apache/commons/math3/distribution/HypergeometricDistribution.java
 (original)
+++ 
commons/proper/math/trunk/src/main/java/org/apache/commons/math3/distribution/HypergeometricDistribution.java
 Sat Aug 10 00:57:48 2013
@@ -265,7 +265,7 @@ public class HypergeometricDistribution 
      * size {@code n}, the mean is {@code n * m / N}.
      */
     public double getNumericalMean() {
-        return (double) (getSampleSize() * getNumberOfSuccesses()) / (double) 
getPopulationSize();
+        return getSampleSize() * (getNumberOfSuccesses() / (double) 
getPopulationSize());
     }
 
     /**

Modified: 
commons/proper/math/trunk/src/test/java/org/apache/commons/math3/distribution/HypergeometricDistributionTest.java
URL: 
http://svn.apache.org/viewvc/commons/proper/math/trunk/src/test/java/org/apache/commons/math3/distribution/HypergeometricDistributionTest.java?rev=1512546&r1=1512545&r2=1512546&view=diff
==============================================================================
--- 
commons/proper/math/trunk/src/test/java/org/apache/commons/math3/distribution/HypergeometricDistributionTest.java
 (original)
+++ 
commons/proper/math/trunk/src/test/java/org/apache/commons/math3/distribution/HypergeometricDistributionTest.java
 Sat Aug 10 00:57:48 2013
@@ -284,4 +284,18 @@ public class HypergeometricDistributionT
         double upper = 1.0 - dist.cumulativeProbability(k) + 
dist.probability(k);
         Assert.assertTrue(Precision.compareTo(1.0, upper, 1) == 0);
     }
+
+    @Test
+    public void testMath1021() {
+        final int N = 43130568;
+        final int m = 42976365;
+        final int n = 50;
+        final HypergeometricDistribution dist = new 
HypergeometricDistribution(N, m, n);
+
+        for (int i = 0; i < 100; i++) {
+            final int sample = dist.sample();
+            Assert.assertTrue("sample=" + sample, 0 <= sample);
+            Assert.assertTrue("sample=" + sample, sample <= n);
+        }
+    }
 }


Reply via email to