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 2016/04/22 01:15:33 UTC
[47/53] [abbrv] [math] MATH-1356
MATH-1356
Handle special cases for which the computation would otherwise produce NaN.
Thanks to Thomas Lacroix for the report.
Project: http://git-wip-us.apache.org/repos/asf/commons-math/repo
Commit: http://git-wip-us.apache.org/repos/asf/commons-math/commit/0880a21c
Tree: http://git-wip-us.apache.org/repos/asf/commons-math/tree/0880a21c
Diff: http://git-wip-us.apache.org/repos/asf/commons-math/diff/0880a21c
Branch: refs/heads/develop
Commit: 0880a21c56cec1a2442b5123c3845bfc99e83a7f
Parents: 3066a80
Author: Gilles <er...@apache.org>
Authored: Tue Apr 19 00:27:32 2016 +0200
Committer: Gilles <er...@apache.org>
Committed: Tue Apr 19 00:27:32 2016 +0200
----------------------------------------------------------------------
.../distribution/SaddlePointExpansion.java | 6 +++++
.../HypergeometricDistributionTest.java | 26 ++++++++++++++++++++
2 files changed, 32 insertions(+)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/commons-math/blob/0880a21c/src/main/java/org/apache/commons/math4/distribution/SaddlePointExpansion.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/commons/math4/distribution/SaddlePointExpansion.java b/src/main/java/org/apache/commons/math4/distribution/SaddlePointExpansion.java
index 01b0f65..aea0e3c 100644
--- a/src/main/java/org/apache/commons/math4/distribution/SaddlePointExpansion.java
+++ b/src/main/java/org/apache/commons/math4/distribution/SaddlePointExpansion.java
@@ -159,6 +159,9 @@ final class SaddlePointExpansion {
}
ret = s1;
} else {
+ if (x == 0) {
+ return mu;
+ }
ret = x * FastMath.log(x / mu) + mu - x;
}
return ret;
@@ -180,6 +183,9 @@ final class SaddlePointExpansion {
if (p < 0.1) {
ret = -getDeviancePart(n, n * q) - n * p;
} else {
+ if (n == 0) {
+ return 0;
+ }
ret = n * FastMath.log(q);
}
} else if (x == n) {
http://git-wip-us.apache.org/repos/asf/commons-math/blob/0880a21c/src/test/java/org/apache/commons/math4/distribution/HypergeometricDistributionTest.java
----------------------------------------------------------------------
diff --git a/src/test/java/org/apache/commons/math4/distribution/HypergeometricDistributionTest.java b/src/test/java/org/apache/commons/math4/distribution/HypergeometricDistributionTest.java
index e12c5b4..7e7ce8c 100644
--- a/src/test/java/org/apache/commons/math4/distribution/HypergeometricDistributionTest.java
+++ b/src/test/java/org/apache/commons/math4/distribution/HypergeometricDistributionTest.java
@@ -312,6 +312,32 @@ public class HypergeometricDistributionTest extends IntegerDistributionAbstractT
}
@Test
+ public void testZeroTrial() {
+ final int n = 11; // population
+ final int m = 4; // successes in population
+ final int s = 0; // number of trials
+
+ final HypergeometricDistribution dist = new HypergeometricDistribution(n, m, 0);
+
+ for (int i = 1; i <= n; i++) {
+ final double p = dist.probability(i);
+ Assert.assertEquals("p=" + p, 0, p, 0d);
+ }
+ }
+
+ @Test
+ public void testMath1356() {
+ final int n = 11; // population
+ final int m = 11; // successes in population
+
+ for (int s = 0; s <= n; s++) {
+ final HypergeometricDistribution dist = new HypergeometricDistribution(n, m, s);
+ final double p = dist.probability(s);
+ Assert.assertEquals("p=" + p, 1, p, 0d);
+ }
+ }
+
+ @Test
public void testMath1021() {
final int N = 43130568;
final int m = 42976365;