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
The following commit(s) were added to refs/heads/master by this push: new 5b36cbe Fix: Avoid t=-0.0 for t-distribution inverse SF with p=0.5 5b36cbe is described below commit 5b36cbecd8385d367d64d7d35b7acee06e773afc Author: Alex Herbert <aherb...@apache.org> AuthorDate: Thu Jul 20 16:47:40 2023 +0100 Fix: Avoid t=-0.0 for t-distribution inverse SF with p=0.5 --- .../commons/statistics/distribution/TDistribution.java | 3 ++- .../statistics/distribution/TDistributionTest.java | 16 ++++++++++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/commons-statistics-distribution/src/main/java/org/apache/commons/statistics/distribution/TDistribution.java b/commons-statistics-distribution/src/main/java/org/apache/commons/statistics/distribution/TDistribution.java index c37bd8c..54c6b2c 100644 --- a/commons-statistics-distribution/src/main/java/org/apache/commons/statistics/distribution/TDistribution.java +++ b/commons-statistics-distribution/src/main/java/org/apache/commons/statistics/distribution/TDistribution.java @@ -274,7 +274,8 @@ public abstract class TDistribution extends AbstractContinuousDistribution { @Override public double inverseSurvivalProbability(double p) { // Exploit symmetry - return -inverseCumulativeProbability(p); + // Subtract from 0 avoids returning -0.0 for p=0.5 + return 0.0 - inverseCumulativeProbability(p); } /** diff --git a/commons-statistics-distribution/src/test/java/org/apache/commons/statistics/distribution/TDistributionTest.java b/commons-statistics-distribution/src/test/java/org/apache/commons/statistics/distribution/TDistributionTest.java index 69b8823..7bcd104 100644 --- a/commons-statistics-distribution/src/test/java/org/apache/commons/statistics/distribution/TDistributionTest.java +++ b/commons-statistics-distribution/src/test/java/org/apache/commons/statistics/distribution/TDistributionTest.java @@ -23,6 +23,7 @@ import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.CsvSource; import org.junit.jupiter.params.provider.MethodSource; +import org.junit.jupiter.params.provider.ValueSource; /** * Test cases for {@link TDistribution}. @@ -148,4 +149,19 @@ class TDistributionTest extends BaseContinuousDistributionTest { Assertions.assertEquals(cdf, p, 6 * Math.ulp(cdf), () -> "cdf error: " + (Double.doubleToLongBits(cdf) - Double.doubleToRawLongBits(p))); } + + /** + * Test the inverse probability edge case for p=0.5. + * The inverse can use symmetry {@code isf(p) = -icdf(p)}. When p=0.5 the inverse + * will generate -0.0 for the negation. This test ensures both return the more logical 0.0. + */ + @ParameterizedTest + @ValueSource(doubles = {1, 42, 1e25}) + void testInverseSymmetryEdgeCase(double df) { + final TDistribution dist = TDistribution.of(df); + final double p = 0.5; + final double t = 0.0; + Assertions.assertEquals(t, dist.inverseCumulativeProbability(p)); + Assertions.assertEquals(t, dist.inverseSurvivalProbability(p)); + } }