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-numbers.git
commit b7420d0d45e80f9cea4b13614bc1746da6234ac9 Author: Alex Herbert <[email protected]> AuthorDate: Fri Nov 8 22:41:00 2019 +0000 Use constants for magic numbers. Allow some gamma classes to use magic numbers in PMD rules. --- .../java/org/apache/commons/numbers/gamma/Erf.java | 5 ++- .../org/apache/commons/numbers/gamma/Erfc.java | 5 ++- .../org/apache/commons/numbers/gamma/Gamma.java | 5 ++- .../org/apache/commons/numbers/gamma/LogBeta.java | 37 +++++++++++++--------- src/main/resources/pmd/pmd-ruleset.xml | 5 +++ 5 files changed, 39 insertions(+), 18 deletions(-) diff --git a/commons-numbers-gamma/src/main/java/org/apache/commons/numbers/gamma/Erf.java b/commons-numbers-gamma/src/main/java/org/apache/commons/numbers/gamma/Erf.java index 4434b58..6f700e2 100644 --- a/commons-numbers-gamma/src/main/java/org/apache/commons/numbers/gamma/Erf.java +++ b/commons-numbers-gamma/src/main/java/org/apache/commons/numbers/gamma/Erf.java @@ -20,6 +20,9 @@ package org.apache.commons.numbers.gamma; * <a href="http://mathworld.wolfram.com/Erf.html">Error function</a>. */ public final class Erf { + /** The threshold value for returning the extreme value. */ + private static final double EXTREME_VALUE_BOUND = 40; + /** Private constructor. */ private Erf() { // intenitonal empty. @@ -46,7 +49,7 @@ public final class Erf { * @see RegularizedGamma.P#value(double, double, double, int) */ public static double value(double x) { - if (Math.abs(x) > 40) { + if (Math.abs(x) > EXTREME_VALUE_BOUND) { return x > 0 ? 1 : -1; } final double ret = RegularizedGamma.P.value(0.5, x * x, 1e-15, 10000); diff --git a/commons-numbers-gamma/src/main/java/org/apache/commons/numbers/gamma/Erfc.java b/commons-numbers-gamma/src/main/java/org/apache/commons/numbers/gamma/Erfc.java index 07a7cbc..44a6879 100644 --- a/commons-numbers-gamma/src/main/java/org/apache/commons/numbers/gamma/Erfc.java +++ b/commons-numbers-gamma/src/main/java/org/apache/commons/numbers/gamma/Erfc.java @@ -20,6 +20,9 @@ package org.apache.commons.numbers.gamma; * <a href="http://mathworld.wolfram.com/Erfc.html">Complementary error function</a>. */ public final class Erfc { + /** The threshold value for returning the extreme value. */ + private static final double EXTREME_VALUE_BOUND = 40; + /** Private constructor. */ private Erfc() { // intentionally empty. @@ -46,7 +49,7 @@ public final class Erfc { * @see RegularizedGamma.Q#value(double, double, double, int) */ public static double value(double x) { - if (Math.abs(x) > 40) { + if (Math.abs(x) > EXTREME_VALUE_BOUND) { return x > 0 ? 0 : 2; } final double ret = RegularizedGamma.Q.value(0.5, x * x, 1e-15, 10000); diff --git a/commons-numbers-gamma/src/main/java/org/apache/commons/numbers/gamma/Gamma.java b/commons-numbers-gamma/src/main/java/org/apache/commons/numbers/gamma/Gamma.java index 2698a73..c43e2a7 100644 --- a/commons-numbers-gamma/src/main/java/org/apache/commons/numbers/gamma/Gamma.java +++ b/commons-numbers-gamma/src/main/java/org/apache/commons/numbers/gamma/Gamma.java @@ -31,6 +31,9 @@ package org.apache.commons.numbers.gamma; * </p> */ public final class Gamma { + /** The threshold value for choosing the Lanczos approximation. */ + private static final double LANCZOS_THRESHOLD = 20; + /** √(2π). */ private static final double SQRT_TWO_PI = 2.506628274631000502; @@ -55,7 +58,7 @@ public final class Gamma { } final double absX = Math.abs(x); - if (absX <= 20) { + if (absX <= LANCZOS_THRESHOLD) { if (x >= 1) { /* * From the recurrence relation diff --git a/commons-numbers-gamma/src/main/java/org/apache/commons/numbers/gamma/LogBeta.java b/commons-numbers-gamma/src/main/java/org/apache/commons/numbers/gamma/LogBeta.java index 04ea5b8..12e4863 100644 --- a/commons-numbers-gamma/src/main/java/org/apache/commons/numbers/gamma/LogBeta.java +++ b/commons-numbers-gamma/src/main/java/org/apache/commons/numbers/gamma/LogBeta.java @@ -23,6 +23,13 @@ package org.apache.commons.numbers.gamma; * </p> */ public final class LogBeta { + /** The threshold value of 10 where the series expansion of the Δ function applies. */ + private static final double TEN = 10; + /** The threshold value of 2 for algorithm switch. */ + private static final double TWO = 2; + /** The threshold value of 1000 for algorithm switch. */ + private static final double THOUSAND = 1000; + /** The constant value of ½log 2π. */ private static final double HALF_LOG_TWO_PI = 0.9189385332046727; @@ -85,8 +92,8 @@ public final class LogBeta { a > b) { throw new GammaException(GammaException.OUT_OF_RANGE, a, 0, b); } - if (b < 10) { - throw new GammaException(GammaException.OUT_OF_RANGE, b, 10, Double.POSITIVE_INFINITY); + if (b < TEN) { + throw new GammaException(GammaException.OUT_OF_RANGE, b, TEN, Double.POSITIVE_INFINITY); } final double h = a / b; @@ -126,11 +133,11 @@ public final class LogBeta { private static double sumDeltaMinusDeltaSum(final double p, final double q) { - if (p < 10) { - throw new GammaException(GammaException.OUT_OF_RANGE, p, 10, Double.POSITIVE_INFINITY); + if (p < TEN) { + throw new GammaException(GammaException.OUT_OF_RANGE, p, TEN, Double.POSITIVE_INFINITY); } - if (q < 10) { - throw new GammaException(GammaException.OUT_OF_RANGE, q, 10, Double.POSITIVE_INFINITY); + if (q < TEN) { + throw new GammaException(GammaException.OUT_OF_RANGE, q, TEN, Double.POSITIVE_INFINITY); } final double a = Math.min(p, q); @@ -165,7 +172,7 @@ public final class LogBeta { final double a = Math.min(p, q); final double b = Math.max(p, q); - if (a >= 10) { + if (a >= TEN) { final double w = sumDeltaMinusDeltaSum(a, b); final double h = a / b; final double c = h / (1 + h); @@ -176,8 +183,8 @@ public final class LogBeta { } else { return (((-0.5 * Math.log(b) + HALF_LOG_TWO_PI) + w) - v) - u; } - } else if (a > 2) { - if (b > 1000) { + } else if (a > TWO) { + if (b > THOUSAND) { final int n = (int) Math.floor(a - 1); double prod = 1; double ared = a; @@ -196,7 +203,7 @@ public final class LogBeta { final double h = ared / b; prod1 *= h / (1 + h); } - if (b < 10) { + if (b < TEN) { double prod2 = 1; double bred = b; while (bred > 2) { @@ -215,8 +222,8 @@ public final class LogBeta { } } } else if (a >= 1) { - if (b > 2) { - if (b < 10) { + if (b > TWO) { + if (b < TEN) { double prod = 1; double bred = b; while (bred > 2) { @@ -237,7 +244,7 @@ public final class LogBeta { LogGammaSum.value(a, b); } } else { - if (b >= 10) { + if (b >= TEN) { return LogGamma.value(a) + logGammaMinusLogGammaSum(a, b); } else { @@ -265,8 +272,8 @@ public final class LogBeta { if (a < 0) { throw new GammaException(GammaException.OUT_OF_RANGE, a, 0, Double.POSITIVE_INFINITY); } - if (b < 10) { - throw new GammaException(GammaException.OUT_OF_RANGE, b, 10, Double.POSITIVE_INFINITY); + if (b < TEN) { + throw new GammaException(GammaException.OUT_OF_RANGE, b, TEN, Double.POSITIVE_INFINITY); } /* diff --git a/src/main/resources/pmd/pmd-ruleset.xml b/src/main/resources/pmd/pmd-ruleset.xml index e3b6b26..55ef27b 100644 --- a/src/main/resources/pmd/pmd-ruleset.xml +++ b/src/main/resources/pmd/pmd-ruleset.xml @@ -94,6 +94,11 @@ <rule ref="category/java/errorprone.xml/AvoidLiteralsInIfCondition"> <properties> <property name="ignoreMagicNumbers" value="-1,0,1" /> + <property name="violationSuppressXPath" + value="//ClassOrInterfaceDeclaration[@Image='LogGamma' + or @Image='LogGammaSum' + or @Image='InverseErf' + or @Image='InvGamma1pm1']"/> </properties> </rule>
