UNPKG

@stdlib/math-base-special-gamma1pm1

Version:
98 lines (88 loc) 2.51 kB
/** * @license Apache-2.0 * * Copyright (c) 2018 The Stdlib Authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * * * ## Notice * * The original C++ code and copyright notice are from the [Boost library]{@link http://www.boost.org/doc/libs/1_64_0/boost/math/special_functions/gamma.hpp}. The implementation has been modified for JavaScript. * * ```text * (C) Copyright John Maddock 2006-7, 2013-14. * (C) Copyright Paul A. Bristow 2007, 2013-14. * (C) Copyright Nikhar Agrawal 2013-14. * (C) Copyright Christopher Kormanyos 2013-14. * * Use, modification and distribution are subject to the * Boost Software License, Version 1.0. (See accompanying file * LICENSE or copy at http://www.boost.org/LICENSE_1_0.txt) * ``` */ 'use strict'; // MODULES // var gamma = require( '@stdlib/math-base-special-gamma' ); var expm1 = require( '@stdlib/math-base-special-expm1' ); var log1p = require( '@stdlib/math-base-special-log1p' ); var isnan = require( '@stdlib/math-base-assert-is-nan' ); var lgammaSmallImp = require( './lgamma_small_imp.js' ); // MAIN // /** * Computes `gamma(x+1) - 1`. * * @param {number} x - input value * @returns {number} function value * * @example * var v = gammap1m1( 0.2 ); * // returns ~-0.082 * * @example * var v = gammap1m1( -9.2 ); * // returns ~-1.0 * * @example * var v = gammap1m1( 0.0 ); * // returns 0.0 * * @example * var v = gammap1m1( -3.0 ); * // returns NaN * * @example * var v = gammap1m1( NaN ); * // returns NaN */ function gammap1m1( x ) { if ( isnan( x ) ) { return NaN; } if ( x < 0.0 ) { if ( x < -0.5 ) { // Best method is simply to subtract 1 from gamma: return gamma( 1.0+x ) - 1.0; } // Use expm1 on the logarithm of gamma: return expm1( -log1p( x ) + lgammaSmallImp( x+2.0, x+1.0, x ) ); } if ( x < 2.0 ) { // Use expm1 on the logarithm of gamma: return expm1( lgammaSmallImp( x+1.0, x, x-1.0 ) ); } // Best method is simply to subtract 1 from gamma: return gamma( 1.0+x ) - 1.0; } // EXPORTS // module.exports = gammap1m1;