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-statistics.git

commit b0850e1f721ed1030ceb4d15dbfd6712896286b0
Author: aherbert <aherb...@apache.org>
AuthorDate: Fri Jul 30 15:21:40 2021 +0100

    Return exact bounds for inverse CDF
---
 .../distribution/TruncatedNormalDistribution.java           | 13 ++++++++++++-
 .../distribution/TruncatedNormalDistributionTest.java       |  5 +++++
 2 files changed, 17 insertions(+), 1 deletion(-)

diff --git 
a/commons-statistics-distribution/src/main/java/org/apache/commons/statistics/distribution/TruncatedNormalDistribution.java
 
b/commons-statistics-distribution/src/main/java/org/apache/commons/statistics/distribution/TruncatedNormalDistribution.java
index b7e77c0..29a2afb 100644
--- 
a/commons-statistics-distribution/src/main/java/org/apache/commons/statistics/distribution/TruncatedNormalDistribution.java
+++ 
b/commons-statistics-distribution/src/main/java/org/apache/commons/statistics/distribution/TruncatedNormalDistribution.java
@@ -137,7 +137,18 @@ public class TruncatedNormalDistribution extends 
AbstractContinuousDistribution
         if (p < 0 || p > 1) {
             throw new 
DistributionException(DistributionException.INVALID_PROBABILITY, p);
         }
-        return standardNormal.inverseCumulativeProbability(cdfAlpha + p * 
cdfDelta) * parentSd + parentMean;
+        // Exact bound
+        if (p == 0) {
+            return lower;
+        } else if (p == 1) {
+            return upper;
+        }
+        final double x = standardNormal.inverseCumulativeProbability(cdfAlpha 
+ p * cdfDelta) * parentSd + parentMean;
+        // Clip to support to handle floating-point error at the support bound
+        if (x <= lower) {
+            return lower;
+        }
+        return x < upper ? x : upper;
     }
 
     /**
diff --git 
a/commons-statistics-distribution/src/test/java/org/apache/commons/statistics/distribution/TruncatedNormalDistributionTest.java
 
b/commons-statistics-distribution/src/test/java/org/apache/commons/statistics/distribution/TruncatedNormalDistributionTest.java
index 7966a17..c837a84 100644
--- 
a/commons-statistics-distribution/src/test/java/org/apache/commons/statistics/distribution/TruncatedNormalDistributionTest.java
+++ 
b/commons-statistics-distribution/src/test/java/org/apache/commons/statistics/distribution/TruncatedNormalDistributionTest.java
@@ -110,6 +110,11 @@ class TruncatedNormalDistributionTest extends 
ContinuousDistributionAbstractTest
         testPrecondition1();
         testPrecondition2();
         testPrecondition3();
+
+        // Bound test
+        Assertions.assertTrue(distribution.getSupportLowerBound() <= 
distribution.inverseCumulativeProbability(Double.MIN_VALUE));
+        Assertions.assertTrue(distribution.getSupportLowerBound() <= 
distribution.inverseCumulativeProbability(Double.MIN_NORMAL));
+        Assertions.assertTrue(distribution.getSupportUpperBound() >= 
distribution.inverseCumulativeProbability(Math.nextDown(1.0)));
     }
 
     /** Test a one-sided truncation with a lower tail. */

Reply via email to