Rev 78076 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed
/* -*- 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_CCusing 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 requires#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 TRUEtypedef 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 __cplusplusextern "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_STANDALONEvoid 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.cdouble 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 hadalready 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 __cplusplusint 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# endifR_EXTERN double NA_REAL;R_EXTERN double R_PosInf;R_EXTERN double R_NegInf;R_EXTERN int N01_kind;# undef R_EXTERN#elseextern int N01_kind;# endif#endif /* MATHLIB_STANDALONE */#ifdef __cplusplus}#endif#endif /* RMATH_H */