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);