This is an automated email from the ASF dual-hosted git repository.

asf-gitbox-commits 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 c0b8c17b Avoid overflow in 1+n using 1.0+n
c0b8c17b is described below

commit c0b8c17bda3a2170ea0a9172042354893ca7d93d
Author: Alex Herbert <[email protected]>
AuthorDate: Sun Sep 13 14:34:33 2026 +0100

    Avoid overflow in 1+n using 1.0+n
---
 .../apache/commons/statistics/distribution/ZipfDistribution.java    | 6 +++---
 .../commons/statistics/distribution/ZipfDistributionTest.java       | 2 ++
 2 files changed, 5 insertions(+), 3 deletions(-)

diff --git 
a/commons-statistics-distribution/src/main/java/org/apache/commons/statistics/distribution/ZipfDistribution.java
 
b/commons-statistics-distribution/src/main/java/org/apache/commons/statistics/distribution/ZipfDistribution.java
index d026939a..42ddc654 100644
--- 
a/commons-statistics-distribution/src/main/java/org/apache/commons/statistics/distribution/ZipfDistribution.java
+++ 
b/commons-statistics-distribution/src/main/java/org/apache/commons/statistics/distribution/ZipfDistribution.java
@@ -171,7 +171,7 @@ public final class ZipfDistribution extends 
AbstractDiscreteDistribution {
         public double value(int a, int b) {
             if (b - a >= MIN_TERMS) {
                 final double z1 = a == 1 ? zeta1 : HurwitzZeta.value(s, a);
-                final double z2 = b == n ? zeta1pN : HurwitzZeta.value(s, 1 + 
b);
+                final double z2 = b == n ? zeta1pN : HurwitzZeta.value(s, b + 
1.0);
                 if (allowedDifference(z1, z2)) {
                     return applyBounds(z1 - z2);
                 }
@@ -258,7 +258,7 @@ public final class ZipfDistribution extends 
AbstractDiscreteDistribution {
         // it so the threshold is 4 * MIN_TERMS.
         if (exponent > 1 && (numberOfElements >>> 2) > MIN_TERMS) {
             final double zeta1 = HurwitzZeta.value(exponent, 1);
-            final double zeta1pN = HurwitzZeta.value(exponent, 1 + 
numberOfElements);
+            final double zeta1pN = HurwitzZeta.value(exponent, 
numberOfElements + 1.0);
             if (allowedDifference(zeta1, zeta1pN)) {
                 return new ZipfDistribution(numberOfElements, exponent, zeta1 
- zeta1pN,
                     new ZetaHarmonicSeries(numberOfElements, exponent, zeta1, 
zeta1pN));
@@ -482,7 +482,7 @@ public final class ZipfDistribution extends 
AbstractDiscreteDistribution {
         // to compute the harmonic series.
         if (m > 1 && (n >>> 2) > MIN_TERMS) {
             final double z1 = HurwitzZeta.value(m, 1);
-            final double z2 = HurwitzZeta.value(m, 1 + n);
+            final double z2 = HurwitzZeta.value(m, n + 1.0);
             if (allowedDifference(z1, z2)) {
                 return z1 - z2;
             }
diff --git 
a/commons-statistics-distribution/src/test/java/org/apache/commons/statistics/distribution/ZipfDistributionTest.java
 
b/commons-statistics-distribution/src/test/java/org/apache/commons/statistics/distribution/ZipfDistributionTest.java
index 18a70834..1567c8c2 100644
--- 
a/commons-statistics-distribution/src/test/java/org/apache/commons/statistics/distribution/ZipfDistributionTest.java
+++ 
b/commons-statistics-distribution/src/test/java/org/apache/commons/statistics/distribution/ZipfDistributionTest.java
@@ -79,6 +79,8 @@ class ZipfDistributionTest extends 
BaseDiscreteDistributionTest {
         "999999, 3.1, 1.3184365884771752, 5.083318190566237, 1e-15",
         "987654321, 3.4, 1.2148826443135665, 1.2508670058966394, 1e-15",
         "987654321, 5.4, 1.0312467279214397, 0.045058034902836094, 2e-14",
+        // n=2^31-1 : n+1 overflows
+        "2147483647, 5.4, 1.0312467279214397, 0.045058034902836094, 2e-14",
     })
     void testAdditionalMoments(int n, double exp, double mean, double 
variance, double eps) {
         final DoubleTolerance tolerance = createRelTolerance(eps);

Reply via email to