n
Factorial, the
* product of the numbers 1,...,n
as a double
.
* * Preconditions: *
n >= 0
(otherwise
* IllegalArgumentException
is thrown)double
. The
* largest value of n
for which n!
<
* Double.MAX_VALUE is 170. If the computed value exceeds
* Double.MAX_VALUE, Double.POSITIVE_INFINITY is returnedn!
* @throws IllegalArgumentException if n < 0
*/
public static double factorialDouble(final int n) {
if (n < 0) {
throw new IllegalArgumentException("must have n >= 0 for n!");
}
return Math.floor(Math.exp(factorialLog(n)) + 0.5);
}
/**
* Returns the natural logarithm of n!.
* * Preconditions: *
n >= 0
(otherwise
* IllegalArgumentException
is thrown)n!
* @throws IllegalArgumentException if preconditions are not met.
*/
public static double factorialLog(final int n) {
if (n < 0) {
throw new IllegalArgumentException("must have n > 0 for n!");
}
double logSum = 0;
for (int i = 2; i <= n; i++) {
logSum += Math.log((double)i);
}
return logSum;
}
}