1 /*
2 * Licensed to the Apache Software Foundation (ASF) under one or more
3 * contributor license agreements. See the NOTICE file distributed with
4 * this work for additional information regarding copyright ownership.
5 * The ASF licenses this file to You under the Apache License, Version 2.0
6 * (the "License"); you may not use this file except in compliance with
7 * the License. You may obtain a copy of the License at
8 *
9 * http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 */
17 package org.apache.commons.numbers.gamma;
18
19 /**
20 * Function \( \ln \Gamma(1 + x) \).
21 *
22 * Class is immutable.
23 */
24 final class LogGamma1p {
25 /** Private constructor. */
26 private LogGamma1p() {
27 // intentionally empty
28 }
29
30 /**
31 * Computes the function \( \ln \Gamma(1 + x) \) for \( -0.5 \leq x \leq 1.5 \).
32 *
33 * This implementation is based on the double precision implementation in
34 * the <em>NSWC Library of Mathematics Subroutines</em>, {@code DGMLN1}.
35 *
36 * @param x Argument.
37 * @return \( \ln \Gamma(1 + x) \)
38 * @throws IllegalArgumentException if {@code x < -0.5} or {@code x > 1.5}.
39 */
40 public static double value(final double x) {
41 if (x < -0.5 || x > 1.5) {
42 throw new GammaException(GammaException.OUT_OF_RANGE, x, -0.5, 1.5);
43 }
44
45 return -Math.log1p(InvGamma1pm1.value(x));
46 }
47 }