| /* -*- C -*- |
| * Mathlib : A C Library of Special Functions |
| * Copyright (C) 1998-2018 The R Core Team |
| * Copyright (C) 2004 The R Foundation |
| * |
| * This program is free software; you can redistribute it and/or modify |
| * it under the terms of the GNU Lesser General Public License as published by |
| * the Free Software Foundation; either version 2.1 of the License, or |
| * (at your option) any later version. |
| * |
| * This program is distributed in the hope that it will be useful, |
| * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| * GNU Lesser General Public License for more details. |
| * |
| * You should have received a copy of the GNU Lesser General Public License |
| * along with this program; if not, a copy is available at |
| * https://www.R-project.org/Licenses/ |
| * |
| |
| * Rmath.h should contain ALL headers from R's C code in `src/nmath' |
| ------- such that ``the Math library'' can be used by simply |
| |
| ``#include <Rmath.h> '' |
| |
| and nothing else. |
| |
| It is part of the API and supports 'standalone Rmath'. |
| |
| */ |
| #ifndef RMATH_H |
| #define RMATH_H |
| |
| /* needed for cospi etc */ |
| #ifndef __STDC_WANT_IEC_60559_FUNCS_EXT__ |
| # define __STDC_WANT_IEC_60559_FUNCS_EXT__ 1 |
| #endif |
| #if defined(__cplusplus) && !defined(DO_NOT_USE_CXX_HEADERS) |
| # include <cmath> |
| // See comment in R.h |
| # ifdef __SUNPRO_CC |
| using namespace std; |
| # endif |
| #else |
| # include <math.h> |
| #endif |
| |
| #ifdef NO_C_HEADERS |
| # warning "use of NO_C_HEADERS is defunct and will be ignored" |
| #endif |
| |
| /*-- Mathlib as part of R -- define this for standalone : */ |
| /* #undef MATHLIB_STANDALONE */ |
| |
| #define R_VERSION_STRING "@PACKAGE_VERSION@" |
| |
| // Legacy defines -- C99 functions which R >= 3.5.0 reauires |
| #ifndef HAVE_EXPM1 |
| # define HAVE_EXPM1 1 |
| #endif |
| #ifndef HAVE_HYPOT |
| # define HAVE_HYPOT 1 |
| #endif |
| #ifndef HAVE_LOG1P |
| # define HAVE_LOG1P 1 |
| #endif |
| |
| #ifndef HAVE_WORKING_LOG1P |
| @RMATH_HAVE_WORKING_LOG1P@ |
| #endif |
| |
| #if !defined(HAVE_WORKING_LOG1P) |
| /* remap to avoid problems with getting the right entry point */ |
| double Rlog1p(double); |
| #define log1p Rlog1p |
| #endif |
| |
| |
| /* ----- The following constants and entry points are part of the R API ---- */ |
| |
| /* 30 Decimal-place constants */ |
| /* Computed with bc -l (scale=32; proper round) */ |
| |
| /* SVID & X/Open Constants */ |
| /* Names from Solaris math.h */ |
| |
| #ifndef M_E |
| #define M_E 2.718281828459045235360287471353 /* e */ |
| #endif |
| |
| #ifndef M_LOG2E |
| #define M_LOG2E 1.442695040888963407359924681002 /* log2(e) */ |
| #endif |
| |
| #ifndef M_LOG10E |
| #define M_LOG10E 0.434294481903251827651128918917 /* log10(e) */ |
| #endif |
| |
| #ifndef M_LN2 |
| #define M_LN2 0.693147180559945309417232121458 /* ln(2) */ |
| #endif |
| |
| #ifndef M_LN10 |
| #define M_LN10 2.302585092994045684017991454684 /* ln(10) */ |
| #endif |
| |
| #ifndef M_PI |
| #define M_PI 3.141592653589793238462643383280 /* pi */ |
| #endif |
| |
| #ifndef M_2PI |
| #define M_2PI 6.283185307179586476925286766559 /* 2*pi */ |
| #endif |
| |
| #ifndef M_PI_2 |
| #define M_PI_2 1.570796326794896619231321691640 /* pi/2 */ |
| #endif |
| |
| #ifndef M_PI_4 |
| #define M_PI_4 0.785398163397448309615660845820 /* pi/4 */ |
| #endif |
| |
| #ifndef M_1_PI |
| #define M_1_PI 0.318309886183790671537767526745 /* 1/pi */ |
| #endif |
| |
| #ifndef M_2_PI |
| #define M_2_PI 0.636619772367581343075535053490 /* 2/pi */ |
| #endif |
| |
| #ifndef M_2_SQRTPI |
| #define M_2_SQRTPI 1.128379167095512573896158903122 /* 2/sqrt(pi) */ |
| #endif |
| |
| #ifndef M_SQRT2 |
| #define M_SQRT2 1.414213562373095048801688724210 /* sqrt(2) */ |
| #endif |
| |
| #ifndef M_SQRT1_2 |
| #define M_SQRT1_2 0.707106781186547524400844362105 /* 1/sqrt(2) */ |
| #endif |
| |
| /* R-Specific Constants */ |
| |
| #ifndef M_SQRT_3 |
| #define M_SQRT_3 1.732050807568877293527446341506 /* sqrt(3) */ |
| #endif |
| |
| #ifndef M_SQRT_32 |
| #define M_SQRT_32 5.656854249492380195206754896838 /* sqrt(32) */ |
| #endif |
| |
| #ifndef M_LOG10_2 |
| #define M_LOG10_2 0.301029995663981195213738894724 /* log10(2) */ |
| #endif |
| |
| #ifndef M_SQRT_PI |
| #define M_SQRT_PI 1.772453850905516027298167483341 /* sqrt(pi) */ |
| #endif |
| |
| #ifndef M_1_SQRT_2PI |
| #define M_1_SQRT_2PI 0.398942280401432677939946059934 /* 1/sqrt(2pi) */ |
| #endif |
| |
| #ifndef M_SQRT_2dPI |
| #define M_SQRT_2dPI 0.797884560802865355879892119869 /* sqrt(2/pi) */ |
| #endif |
| |
| |
| #ifndef M_LN_2PI |
| #define M_LN_2PI 1.837877066409345483560659472811 /* log(2*pi) */ |
| #endif |
| |
| #ifndef M_LN_SQRT_PI |
| #define M_LN_SQRT_PI 0.572364942924700087071713675677 /* log(sqrt(pi)) |
| == log(pi)/2 */ |
| #endif |
| |
| #ifndef M_LN_SQRT_2PI |
| #define M_LN_SQRT_2PI 0.918938533204672741780329736406 /* log(sqrt(2*pi)) |
| == log(2*pi)/2 */ |
| #endif |
| |
| #ifndef M_LN_SQRT_PId2 |
| #define M_LN_SQRT_PId2 0.225791352644727432363097614947 /* log(sqrt(pi/2)) |
| == log(pi/2)/2 */ |
| #endif |
| |
| |
| #ifdef MATHLIB_STANDALONE |
| # ifndef R_EXT_BOOLEAN_H_ |
| /* "copy-paste" R_ext/Boolean.h if not already included: */ |
| #define R_EXT_BOOLEAN_H_ |
| #undef FALSE |
| #undef TRUE |
| typedef enum { FALSE = 0, TRUE } Rboolean; |
| # endif |
| #else |
| # include <R_ext/Boolean.h> |
| #endif |
| |
| |
| #if !defined(MATHLIB_STANDALONE) && !defined(R_NO_REMAP_RMATH) |
| #define bessel_i Rf_bessel_i |
| #define bessel_j Rf_bessel_j |
| #define bessel_k Rf_bessel_k |
| #define bessel_y Rf_bessel_y |
| #define bessel_i_ex Rf_bessel_i_ex |
| #define bessel_j_ex Rf_bessel_j_ex |
| #define bessel_k_ex Rf_bessel_k_ex |
| #define bessel_y_ex Rf_bessel_y_ex |
| #define beta Rf_beta |
| #define choose Rf_choose |
| #define dbeta Rf_dbeta |
| #define dbinom Rf_dbinom |
| #define dbinom_raw Rf_dbinom_raw |
| #define dcauchy Rf_dcauchy |
| #define dchisq Rf_dchisq |
| #define dexp Rf_dexp |
| #define df Rf_df |
| #define dgamma Rf_dgamma |
| #define dgeom Rf_dgeom |
| #define dhyper Rf_dhyper |
| #define digamma Rf_digamma |
| #define dlnorm Rf_dlnorm |
| #define dlogis Rf_dlogis |
| #define dnbeta Rf_dnbeta |
| #define dnbinom Rf_dnbinom |
| #define dnbinom_mu Rf_dnbinom_mu |
| #define dnchisq Rf_dnchisq |
| #define dnf Rf_dnf |
| #define dnorm4 Rf_dnorm4 |
| #define dnt Rf_dnt |
| #define dpois_raw Rf_dpois_raw |
| #define dpois Rf_dpois |
| #define dpsifn Rf_dpsifn |
| #define dsignrank Rf_dsignrank |
| #define dt Rf_dt |
| #define dtukey Rf_dtukey |
| #define dunif Rf_dunif |
| #define dweibull Rf_dweibull |
| #define dwilcox Rf_dwilcox |
| #define fmax2 Rf_fmax2 |
| #define fmin2 Rf_fmin2 |
| #define fprec Rf_fprec |
| #define fround Rf_fround |
| #define ftrunc Rf_ftrunc |
| #define fsign Rf_fsign |
| #define gammafn Rf_gammafn |
| #define imax2 Rf_imax2 |
| #define imin2 Rf_imin2 |
| #define lbeta Rf_lbeta |
| #define lchoose Rf_lchoose |
| #define lgammafn Rf_lgammafn |
| #define lgammafn_sign Rf_lgammafn_sign |
| #define lgamma1p Rf_lgamma1p |
| #define log1pexp Rf_log1pexp |
| #define log1pmx Rf_log1pmx |
| #define logspace_add Rf_logspace_add |
| #define logspace_sub Rf_logspace_sub |
| #define logspace_sum Rf_logspace_sum |
| #define pbeta Rf_pbeta |
| #define pbeta_raw Rf_pbeta_raw |
| #define pbinom Rf_pbinom |
| #define pcauchy Rf_pcauchy |
| #define pchisq Rf_pchisq |
| #define pentagamma Rf_pentagamma |
| #define pexp Rf_pexp |
| #define pf Rf_pf |
| #define pgamma Rf_pgamma |
| #define pgeom Rf_pgeom |
| #define phyper Rf_phyper |
| #define plnorm Rf_plnorm |
| #define plogis Rf_plogis |
| #define pnbeta Rf_pnbeta |
| #define pnbinom Rf_pnbinom |
| #define pnbinom_mu Rf_pnbinom_mu |
| #define pnchisq Rf_pnchisq |
| #define pnf Rf_pnf |
| #define pnorm5 Rf_pnorm5 |
| #define pnorm_both Rf_pnorm_both |
| #define pnt Rf_pnt |
| #define ppois Rf_ppois |
| #define psignrank Rf_psignrank |
| #define psigamma Rf_psigamma |
| #define pt Rf_pt |
| #define ptukey Rf_ptukey |
| #define punif Rf_punif |
| #define pweibull Rf_pweibull |
| #define pwilcox Rf_pwilcox |
| #define qbeta Rf_qbeta |
| #define qbinom Rf_qbinom |
| #define qcauchy Rf_qcauchy |
| #define qchisq Rf_qchisq |
| #define qchisq_appr Rf_qchisq_appr |
| #define qexp Rf_qexp |
| #define qf Rf_qf |
| #define qgamma Rf_qgamma |
| #define qgeom Rf_qgeom |
| #define qhyper Rf_qhyper |
| #define qlnorm Rf_qlnorm |
| #define qlogis Rf_qlogis |
| #define qnbeta Rf_qnbeta |
| #define qnbinom Rf_qnbinom |
| #define qnbinom_mu Rf_qnbinom_mu |
| #define qnchisq Rf_qnchisq |
| #define qnf Rf_qnf |
| #define qnorm5 Rf_qnorm5 |
| #define qnt Rf_qnt |
| #define qpois Rf_qpois |
| #define qsignrank Rf_qsignrank |
| #define qt Rf_qt |
| #define qtukey Rf_qtukey |
| #define qunif Rf_qunif |
| #define qweibull Rf_qweibull |
| #define qwilcox Rf_qwilcox |
| #define rbeta Rf_rbeta |
| #define rbinom Rf_rbinom |
| #define rcauchy Rf_rcauchy |
| #define rchisq Rf_rchisq |
| #define rexp Rf_rexp |
| #define rf Rf_rf |
| #define rgamma Rf_rgamma |
| #define rgeom Rf_rgeom |
| #define rhyper Rf_rhyper |
| #define rlnorm Rf_rlnorm |
| #define rlogis Rf_rlogis |
| #define rmultinom Rf_rmultinom |
| #define rnbeta Rf_rnbeta |
| #define rnbinom Rf_rnbinom |
| #define rnbinom_mu Rf_rnbinom_mu |
| #define rnchisq Rf_rnchisq |
| #define rnf Rf_rnf |
| #define rnorm Rf_rnorm |
| #define rnt Rf_rnt |
| #define rpois Rf_rpois |
| #define rsignrank Rf_rsignrank |
| #define rt Rf_rt |
| #define rtukey Rf_rtukey |
| #define runif Rf_runif |
| #define rweibull Rf_rweibull |
| #define rwilcox Rf_rwilcox |
| #define sign Rf_sign |
| #define tetragamma Rf_tetragamma |
| #define trigamma Rf_trigamma |
| #endif |
| |
| #define dnorm dnorm4 |
| #define pnorm pnorm5 |
| #define qnorm qnorm5 |
| |
| #ifdef __cplusplus |
| extern "C" { |
| #endif |
| /* R's versions with !R_FINITE checks */ |
| |
| double R_pow(double x, double y); |
| double R_pow_di(double, int); |
| |
| /* Random Number Generators */ |
| |
| double norm_rand(void); |
| double unif_rand(void); |
| double R_unif_index(double); |
| double exp_rand(void); |
| #ifdef MATHLIB_STANDALONE |
| void set_seed(unsigned int, unsigned int); |
| void get_seed(unsigned int *, unsigned int *); |
| #endif |
| |
| /* Normal Distribution */ |
| |
| double dnorm(double, double, double, int); |
| double pnorm(double, double, double, int, int); |
| double qnorm(double, double, double, int, int); |
| double rnorm(double, double); |
| void pnorm_both(double, double *, double *, int, int);/* both tails */ |
| |
| /* Uniform Distribution */ |
| |
| double dunif(double, double, double, int); |
| double punif(double, double, double, int, int); |
| double qunif(double, double, double, int, int); |
| double runif(double, double); |
| |
| /* Gamma Distribution */ |
| |
| double dgamma(double, double, double, int); |
| double pgamma(double, double, double, int, int); |
| double qgamma(double, double, double, int, int); |
| double rgamma(double, double); |
| |
| double log1pmx(double); |
| double log1pexp(double); // <-- ../nmath/plogis.c |
| double lgamma1p(double); |
| double logspace_add(double, double); |
| double logspace_sub(double, double); |
| double logspace_sum(const double *, int); |
| |
| /* Beta Distribution */ |
| |
| double dbeta(double, double, double, int); |
| double pbeta(double, double, double, int, int); |
| double qbeta(double, double, double, int, int); |
| double rbeta(double, double); |
| |
| /* Lognormal Distribution */ |
| |
| double dlnorm(double, double, double, int); |
| double plnorm(double, double, double, int, int); |
| double qlnorm(double, double, double, int, int); |
| double rlnorm(double, double); |
| |
| /* Chi-squared Distribution */ |
| |
| double dchisq(double, double, int); |
| double pchisq(double, double, int, int); |
| double qchisq(double, double, int, int); |
| double rchisq(double); |
| |
| /* Non-central Chi-squared Distribution */ |
| |
| double dnchisq(double, double, double, int); |
| double pnchisq(double, double, double, int, int); |
| double qnchisq(double, double, double, int, int); |
| double rnchisq(double, double); |
| |
| /* F Distibution */ |
| |
| double df(double, double, double, int); |
| double pf(double, double, double, int, int); |
| double qf(double, double, double, int, int); |
| double rf(double, double); |
| |
| /* Student t Distibution */ |
| |
| double dt(double, double, int); |
| double pt(double, double, int, int); |
| double qt(double, double, int, int); |
| double rt(double); |
| |
| /* Binomial Distribution */ |
| |
| double dbinom_raw(double x, double n, double p, double q, int give_log); |
| double dbinom(double, double, double, int); |
| double pbinom(double, double, double, int, int); |
| double qbinom(double, double, double, int, int); |
| double rbinom(double, double); |
| |
| /* Multnomial Distribution */ |
| |
| void rmultinom(int, double*, int, int*); |
| |
| /* Cauchy Distribution */ |
| |
| double dcauchy(double, double, double, int); |
| double pcauchy(double, double, double, int, int); |
| double qcauchy(double, double, double, int, int); |
| double rcauchy(double, double); |
| |
| /* Exponential Distribution */ |
| |
| double dexp(double, double, int); |
| double pexp(double, double, int, int); |
| double qexp(double, double, int, int); |
| double rexp(double); |
| |
| /* Geometric Distribution */ |
| |
| double dgeom(double, double, int); |
| double pgeom(double, double, int, int); |
| double qgeom(double, double, int, int); |
| double rgeom(double); |
| |
| /* Hypergeometric Distibution */ |
| |
| double dhyper(double, double, double, double, int); |
| double phyper(double, double, double, double, int, int); |
| double qhyper(double, double, double, double, int, int); |
| double rhyper(double, double, double); |
| |
| /* Negative Binomial Distribution */ |
| |
| double dnbinom(double, double, double, int); |
| double pnbinom(double, double, double, int, int); |
| double qnbinom(double, double, double, int, int); |
| double rnbinom(double, double); |
| |
| double dnbinom_mu(double, double, double, int); |
| double pnbinom_mu(double, double, double, int, int); |
| double qnbinom_mu(double, double, double, int, int); |
| double rnbinom_mu(double, double); |
| |
| /* Poisson Distribution */ |
| |
| double dpois_raw (double, double, int); |
| double dpois(double, double, int); |
| double ppois(double, double, int, int); |
| double qpois(double, double, int, int); |
| double rpois(double); |
| |
| /* Weibull Distribution */ |
| |
| double dweibull(double, double, double, int); |
| double pweibull(double, double, double, int, int); |
| double qweibull(double, double, double, int, int); |
| double rweibull(double, double); |
| |
| /* Logistic Distribution */ |
| |
| double dlogis(double, double, double, int); |
| double plogis(double, double, double, int, int); |
| double qlogis(double, double, double, int, int); |
| double rlogis(double, double); |
| |
| /* Non-central Beta Distribution */ |
| |
| double dnbeta(double, double, double, double, int); |
| double pnbeta(double, double, double, double, int, int); |
| double qnbeta(double, double, double, double, int, int); |
| double rnbeta(double, double, double); |
| |
| /* Non-central F Distribution */ |
| |
| double dnf(double, double, double, double, int); |
| double pnf(double, double, double, double, int, int); |
| double qnf(double, double, double, double, int, int); |
| |
| /* Non-central Student t Distribution */ |
| |
| double dnt(double, double, double, int); |
| double pnt(double, double, double, int, int); |
| double qnt(double, double, double, int, int); |
| |
| /* Studentized Range Distribution */ |
| |
| double ptukey(double, double, double, double, int, int); |
| double qtukey(double, double, double, double, int, int); |
| |
| /* Wilcoxon Rank Sum Distribution */ |
| |
| double dwilcox(double, double, double, int); |
| double pwilcox(double, double, double, int, int); |
| double qwilcox(double, double, double, int, int); |
| double rwilcox(double, double); |
| |
| /* Wilcoxon Signed Rank Distribution */ |
| |
| double dsignrank(double, double, int); |
| double psignrank(double, double, int, int); |
| double qsignrank(double, double, int, int); |
| double rsignrank(double); |
| |
| /* Gamma and Related Functions */ |
| double gammafn(double); |
| double lgammafn(double); |
| double lgammafn_sign(double, int*); |
| void dpsifn(double, int, int, int, double*, int*, int*); |
| double psigamma(double, double); |
| double digamma(double); |
| double trigamma(double); |
| double tetragamma(double); |
| double pentagamma(double); |
| |
| double beta(double, double); |
| double lbeta(double, double); |
| |
| double choose(double, double); |
| double lchoose(double, double); |
| |
| /* Bessel Functions */ |
| |
| double bessel_i(double, double, double); |
| double bessel_j(double, double); |
| double bessel_k(double, double, double); |
| double bessel_y(double, double); |
| double bessel_i_ex(double, double, double, double *); |
| double bessel_j_ex(double, double, double *); |
| double bessel_k_ex(double, double, double, double *); |
| double bessel_y_ex(double, double, double *); |
| |
| |
| /* General Support Functions */ |
| |
| int imax2(int, int); |
| int imin2(int, int); |
| double fmax2(double, double); |
| double fmin2(double, double); |
| double sign(double); |
| double fprec(double, double); |
| double fround(double, double); |
| double fsign(double, double); |
| double ftrunc(double); |
| |
| double log1pmx(double); /* Accurate log(1+x) - x, {care for small x} */ |
| double lgamma1p(double);/* accurate log(gamma(x+1)), small x (0 < x < 0.5) */ |
| |
| /* More accurate cos(pi*x), sin(pi*x), tan(pi*x) |
| |
| These declarations might clash with system headers if someone had |
| already included math.h with __STDC_WANT_IEC_60559_FUNCS_EXT__ |
| defined (and we try, above). |
| We check for that via the value of __STDC_IEC_60559_FUNCS__ |
| */ |
| #if !(defined(__STDC_IEC_60559_FUNCS__) && __STDC_IEC_60559_FUNCS__ >= 201506L) |
| double cospi(double); |
| double sinpi(double); |
| double tanpi(double); |
| #endif |
| |
| /* Compute the log of a sum or difference from logs of terms, i.e., |
| * |
| * log (exp (logx) + exp (logy)) |
| * or log (exp (logx) - exp (logy)) |
| * |
| * without causing overflows or throwing away too much accuracy: |
| */ |
| double logspace_add(double logx, double logy); |
| double logspace_sub(double logx, double logy); |
| |
| |
| /* ----------------- Private part of the header file ------------------- */ |
| |
| #if defined(MATHLIB_STANDALONE) && !defined(MATHLIB_PRIVATE_H) |
| /* second is defined by nmath.h */ |
| |
| /* If isnan is a macro, as C99 specifies, the C++ |
| math header will undefine it. This happens on macOS */ |
| # ifdef __cplusplus |
| int R_isnancpp(double); /* in mlutils.c */ |
| # define ISNAN(x) R_isnancpp(x) |
| # else |
| # define ISNAN(x) (isnan(x)!=0) |
| # endif |
| |
| # define R_FINITE(x) R_finite(x) |
| int R_finite(double); |
| |
| # ifdef _WIN32 /* not Win32 as no config information */ |
| # ifdef RMATH_DLL |
| # define R_EXTERN extern __declspec(dllimport) |
| # else |
| # define R_EXTERN extern |
| # endif |
| R_EXTERN double NA_REAL; |
| R_EXTERN double R_PosInf; |
| R_EXTERN double R_NegInf; |
| R_EXTERN int N01_kind; |
| # undef R_EXTERN |
| #else |
| extern int N01_kind; |
| # endif |
| |
| #endif /* MATHLIB_STANDALONE */ |
| |
| #ifdef __cplusplus |
| } |
| #endif |
| |
| #endif /* RMATH_H */ |