1 // -*- mode: C++; c-indent-level: 4; c-basic-offset: 4; indent-tabs-mode: nil; -*-
2 //
3 // Rmath.h: Rcpp R/C++ interface class library -- Wrappers for R's Rmath API
4 //
5 // Copyright (C) 2012 Dirk Eddelbuettel and Romain Francois
6 //
7 // This file is part of Rcpp.
8 //
9 // Rcpp is free software: you can redistribute it and/or modify it
10 // under the terms of the GNU General Public License as published by
11 // the Free Software Foundation, either version 2 of the License, or
12 // (at your option) any later version.
13 //
14 // Rcpp is distributed in the hope that it will be useful, but
15 // WITHOUT ANY WARRANTY; without even the implied warranty of
16 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17 // GNU General Public License for more details.
18 //
19 // You should have received a copy of the GNU General Public License
20 // along with Rcpp.  If not, see <http://www.gnu.org/licenses/>.
21 
22 #ifndef Rcpp_Rmath_h
23 #define Rcpp_Rmath_h
24 
25 namespace R {
26 
27     // see R's Rmath.h as well as Writing R Extension
28 
29     /* Random Number Generators */
norm_rand(void)30     inline double norm_rand(void) 	{ return ::norm_rand(); }
unif_rand(void)31     inline double unif_rand(void)	{ return ::unif_rand(); }
exp_rand(void)32     inline double exp_rand(void)	{ return ::exp_rand(); }
33 
34     /* Normal Distribution */
dnorm(double x,double mu,double sigma,int lg)35     inline double dnorm(double x, double mu, double sigma, int lg)              { return ::Rf_dnorm4(x, mu, sigma, lg); }
pnorm(double x,double mu,double sigma,int lt,int lg)36     inline double pnorm(double x, double mu, double sigma, int lt, int lg)      { return ::Rf_pnorm5(x, mu, sigma, lt, lg); }
qnorm(double p,double mu,double sigma,int lt,int lg)37     inline double qnorm(double p, double mu, double sigma, int lt, int lg)      { return ::Rf_qnorm5(p, mu, sigma, lt, lg); }
rnorm(double mu,double sigma)38     inline double rnorm(double mu, double sigma)                                { return ::Rf_rnorm(mu, sigma); }
pnorm_both(double x,double * cum,double * ccum,int lt,int lg)39     inline void	pnorm_both(double x, double *cum, double *ccum, int lt, int lg) { return ::Rf_pnorm_both(x, cum, ccum, lt, lg); }
40 
41     /* Uniform Distribution */
dunif(double x,double a,double b,int lg)42     inline double dunif(double x, double a, double b, int lg)		{ return ::Rf_dunif(x, a, b, lg); }
punif(double x,double a,double b,int lt,int lg)43     inline double punif(double x, double a, double b, int lt, int lg)   { return ::Rf_punif(x, a, b, lt, lg); }
qunif(double p,double a,double b,int lt,int lg)44     inline double qunif(double p, double a, double b, int lt, int lg)   { return ::Rf_qunif(p, a, b, lt, lg); }
runif(double a,double b)45     inline double runif(double a, double b)                             { return ::Rf_runif(a, b); }
46 
47     /* Gamma Distribution */
dgamma(double x,double shp,double scl,int lg)48     inline double dgamma(double x, double shp, double scl, int lg)	   { return ::Rf_dgamma(x, shp, scl, lg); }
pgamma(double x,double alp,double scl,int lt,int lg)49     inline double pgamma(double x, double alp, double scl, int lt, int lg) { return ::Rf_pgamma(x, alp, scl, lt, lg); }
qgamma(double p,double alp,double scl,int lt,int lg)50     inline double qgamma(double p, double alp, double scl, int lt, int lg) { return ::Rf_qgamma(p, alp, scl, lt, lg); }
rgamma(double a,double scl)51     inline double rgamma(double a, double scl)                             { return ::Rf_rgamma(a, scl); }
52 
log1pmx(double x)53     inline double log1pmx(double x)                  { return ::Rf_log1pmx(x); }
log1pexp(double x)54     inline double log1pexp(double x)                 { return ::log1pexp(x); }  // <-- ../nmath/plogis.c
lgamma1p(double a)55     inline double lgamma1p(double a)                 { return ::Rf_lgamma1p(a); }
logspace_add(double lx,double ly)56     inline double logspace_add(double lx, double ly) { return ::Rf_logspace_add(lx, ly); }
logspace_sub(double lx,double ly)57     inline double logspace_sub(double lx, double ly) { return ::Rf_logspace_sub(lx, ly); }
58 
59     /* Beta Distribution */
dbeta(double x,double a,double b,int lg)60     inline double dbeta(double x, double a, double b, int lg)         { return ::Rf_dbeta(x, a, b, lg); }
pbeta(double x,double p,double q,int lt,int lg)61     inline double pbeta(double x, double p, double q, int lt, int lg) { return ::Rf_pbeta(x, p, q, lt, lg); }
qbeta(double a,double p,double q,int lt,int lg)62     inline double qbeta(double a, double p, double q, int lt, int lg) { return ::Rf_qbeta(a, p, q, lt, lg); }
rbeta(double a,double b)63     inline double rbeta(double a, double b)                           { return ::Rf_rbeta(a, b); }
64 
65     /* Lognormal Distribution */
dlnorm(double x,double ml,double sl,int lg)66     inline double dlnorm(double x, double ml, double sl, int lg)	 { return ::Rf_dlnorm(x, ml, sl, lg); }
plnorm(double x,double ml,double sl,int lt,int lg)67     inline double plnorm(double x, double ml, double sl, int lt, int lg) { return ::Rf_plnorm(x, ml, sl, lt, lg); }
qlnorm(double p,double ml,double sl,int lt,int lg)68     inline double qlnorm(double p, double ml, double sl, int lt, int lg) { return ::Rf_qlnorm(p, ml, sl, lt, lg); }
rlnorm(double ml,double sl)69     inline double rlnorm(double ml, double sl)                           { return ::Rf_rlnorm(ml, sl); }
70 
71     /* Chi-squared Distribution */
dchisq(double x,double df,int lg)72     inline double dchisq(double x, double df, int lg)          { return ::Rf_dchisq(x, df, lg); }
pchisq(double x,double df,int lt,int lg)73     inline double pchisq(double x, double df, int lt, int lg)  { return ::Rf_pchisq(x, df, lt, lg); }
qchisq(double p,double df,int lt,int lg)74     inline double qchisq(double p, double df, int lt, int lg)  { return ::Rf_qchisq(p, df, lt, lg); }
rchisq(double df)75     inline double rchisq(double df)                            { return ::Rf_rchisq(df); }
76 
77     /* Non-central Chi-squared Distribution */
dnchisq(double x,double df,double ncp,int lg)78     inline double dnchisq(double x, double df, double ncp, int lg)          { return ::Rf_dnchisq(x, df, ncp, lg); }
pnchisq(double x,double df,double ncp,int lt,int lg)79     inline double pnchisq(double x, double df, double ncp, int lt, int lg)  { return ::Rf_pnchisq(x, df, ncp, lt, lg); }
qnchisq(double p,double df,double ncp,int lt,int lg)80     inline double qnchisq(double p, double df, double ncp, int lt, int lg)  { return ::Rf_qnchisq(p, df, ncp, lt, lg); }
rnchisq(double df,double lb)81     inline double rnchisq(double df, double lb)                             { return ::Rf_rnchisq(df, lb); }
82 
83     /* F Distibution */
df(double x,double df1,double df2,int lg)84     inline double df(double x, double df1, double df2, int lg)		{ return ::Rf_df(x, df1, df2, lg); }
pf(double x,double df1,double df2,int lt,int lg)85     inline double pf(double x, double df1, double df2, int lt, int lg)	{ return ::Rf_pf(x, df1, df2, lt, lg); }
qf(double p,double df1,double df2,int lt,int lg)86     inline double qf(double p, double df1, double df2, int lt, int lg)	{ return ::Rf_qf(p, df1, df2, lt, lg); }
rf(double df1,double df2)87     inline double rf(double df1, double df2)				{ return ::Rf_rf(df1, df2); }
88 
89     /* Student t Distibution */
dt(double x,double n,int lg)90     inline double dt(double x, double n, int lg)			{ return ::Rf_dt(x, n, lg); }
pt(double x,double n,int lt,int lg)91     inline double pt(double x, double n, int lt, int lg)		{ return ::Rf_pt(x, n, lt, lg); }
qt(double p,double n,int lt,int lg)92     inline double qt(double p, double n, int lt, int lg)		{ return ::Rf_qt(p, n, lt, lg); }
rt(double n)93     inline double rt(double n)						{ return ::Rf_rt(n); }
94 
95     /* Binomial Distribution */
dbinom(double x,double n,double p,int lg)96     inline double dbinom(double x, double n, double p, int lg)	  	{ return ::Rf_dbinom(x, n, p, lg); }
pbinom(double x,double n,double p,int lt,int lg)97     inline double pbinom(double x, double n, double p, int lt, int lg)  { return ::Rf_pbinom(x, n, p, lt, lg); }
qbinom(double p,double n,double m,int lt,int lg)98     inline double qbinom(double p, double n, double m, int lt, int lg)  { return ::Rf_qbinom(p, n, m, lt, lg); }
rbinom(double n,double p)99     inline double rbinom(double n, double p)				{ return ::Rf_rbinom(n, p); }
100 
101     /* Multnomial Distribution */
rmultinom(int n,double * prob,int k,int * rn)102     inline void rmultinom(int n, double* prob, int k, int* rn)		{ return ::rmultinom(n, prob, k, rn); }
103 
104     /* Cauchy Distribution */
dcauchy(double x,double lc,double sl,int lg)105     inline double dcauchy(double x, double lc, double sl, int lg)		{ return ::Rf_dcauchy(x, lc, sl, lg); }
pcauchy(double x,double lc,double sl,int lt,int lg)106     inline double pcauchy(double x, double lc, double sl, int lt, int lg)	{ return ::Rf_pcauchy(x, lc, sl, lt, lg); }
qcauchy(double p,double lc,double sl,int lt,int lg)107     inline double qcauchy(double p, double lc, double sl, int lt, int lg)	{ return ::Rf_qcauchy(p, lc, sl, lt, lg); }
rcauchy(double lc,double sl)108     inline double rcauchy(double lc, double sl)					{ return ::Rf_rcauchy(lc, sl); }
109 
110     /* Exponential Distribution */
dexp(double x,double sl,int lg)111     inline double dexp(double x, double sl, int lg)		{ return ::Rf_dexp(x, sl, lg); }
pexp(double x,double sl,int lt,int lg)112     inline double pexp(double x, double sl, int lt, int lg)	{ return ::Rf_pexp(x, sl, lt, lg); }
qexp(double p,double sl,int lt,int lg)113     inline double qexp(double p, double sl, int lt, int lg)	{ return ::Rf_qexp(p, sl, lt, lg); }
rexp(double sl)114     inline double rexp(double sl)				{ return ::Rf_rexp(sl); }
115 
116     /* Geometric Distribution */
dgeom(double x,double p,int lg)117     inline double dgeom(double x, double p, int lg)		{ return ::Rf_dgeom(x, p, lg); }
pgeom(double x,double p,int lt,int lg)118     inline double pgeom(double x, double p, int lt, int lg)	{ return ::Rf_pgeom(x, p, lt, lg); }
qgeom(double p,double pb,int lt,int lg)119     inline double qgeom(double p, double pb, int lt, int lg)	{ return ::Rf_qgeom(p, pb, lt, lg); }
rgeom(double p)120     inline double rgeom(double p)				{ return ::Rf_rgeom(p); }
121 
122     /* Hypergeometric Distibution */
dhyper(double x,double r,double b,double n,int lg)123     inline double dhyper(double x, double r, double b, double n, int lg)		{ return ::Rf_dhyper(x, r, b, n, lg); }
phyper(double x,double r,double b,double n,int lt,int lg)124     inline double phyper(double x, double r, double b, double n, int lt, int lg)	{ return ::Rf_phyper(x, r, b, n, lt, lg); }
qhyper(double p,double r,double b,double n,int lt,int lg)125     inline double qhyper(double p, double r, double b, double n, int lt, int lg)	{ return ::Rf_qhyper(p, r, b, n, lt, lg); }
rhyper(double r,double b,double n)126     inline double rhyper(double r, double b, double n)					{ return ::Rf_rhyper(r, b, n); }
127 
128     /* Negative Binomial Distribution */
dnbinom(double x,double sz,double pb,int lg)129     inline double dnbinom(double x, double sz, double pb, int lg)		{ return ::Rf_dnbinom(x, sz, pb, lg); }
pnbinom(double x,double sz,double pb,int lt,int lg)130     inline double pnbinom(double x, double sz, double pb, int lt, int lg)	{ return ::Rf_pnbinom(x, sz, pb, lt, lg); }
qnbinom(double p,double sz,double pb,int lt,int lg)131     inline double qnbinom(double p, double sz, double pb, int lt, int lg)	{ return ::Rf_qnbinom(p, sz, pb, lt, lg); }
rnbinom(double sz,double pb)132     inline double rnbinom(double sz, double pb)					{ return ::Rf_rnbinom(sz, pb); }
133 
134 #if R_VERSION >= R_Version(3, 1, 2)
dnbinom_mu(double x,double sz,double mu,int lg)135     inline double dnbinom_mu(double x, double sz, double mu, int lg)		{ return ::Rf_dnbinom_mu(x, sz, mu, lg); }
pnbinom_mu(double x,double sz,double mu,int lt,int lg)136     inline double pnbinom_mu(double x, double sz, double mu, int lt, int lg)	{ return ::Rf_pnbinom_mu(x, sz, mu, lt, lg); }
qnbinom_mu(double x,double sz,double mu,int lt,int lg)137     inline double qnbinom_mu(double x, double sz, double mu, int lt, int lg)	{ return ::Rf_qnbinom_mu(x, sz, mu, lt, lg); }
138     //inline double rnbinom_mu(double sz, double mu)				{ return ::Rf_rnbinom_mu(sz, mu); }
139 #endif
140 
141     /* Poisson Distribution */
dpois(double x,double lb,int lg)142     inline double dpois(double x, double lb, int lg)		{ return ::Rf_dpois(x, lb, lg); }
ppois(double x,double lb,int lt,int lg)143     inline double ppois(double x, double lb, int lt, int lg)	{ return ::Rf_ppois(x, lb, lt, lg); }
qpois(double p,double lb,int lt,int lg)144     inline double qpois(double p, double lb, int lt, int lg)	{ return ::Rf_qpois(p, lb, lt, lg); }
rpois(double mu)145     inline double rpois(double mu)				{ return ::Rf_rpois(mu); }
146 
147     /* Weibull Distribution */
dweibull(double x,double sh,double sl,int lg)148     inline double dweibull(double x, double sh, double sl, int lg)		{ return ::Rf_dweibull(x, sh, sl, lg); }
pweibull(double x,double sh,double sl,int lt,int lg)149     inline double pweibull(double x, double sh, double sl, int lt, int lg)	{ return ::Rf_pweibull(x, sh, sl, lt, lg); }
qweibull(double p,double sh,double sl,int lt,int lg)150     inline double qweibull(double p, double sh, double sl, int lt, int lg)	{ return ::Rf_qweibull(p, sh, sl, lt, lg); }
rweibull(double sh,double sl)151     inline double rweibull(double sh, double sl)				{ return ::Rf_rweibull(sh, sl); }
152 
153     /* Logistic Distribution */
dlogis(double x,double lc,double sl,int lg)154     inline double dlogis(double x, double lc, double sl, int lg)		{ return ::Rf_dlogis(x, lc, sl, lg); }
plogis(double x,double lc,double sl,int lt,int lg)155     inline double plogis(double x, double lc, double sl, int lt, int lg)	{ return ::Rf_plogis(x, lc, sl, lt, lg); }
qlogis(double p,double lc,double sl,int lt,int lg)156     inline double qlogis(double p, double lc, double sl, int lt, int lg)	{ return ::Rf_qlogis(p, lc, sl, lt, lg); }
rlogis(double lc,double sl)157     inline double rlogis(double lc, double sl)					{ return ::Rf_rlogis(lc, sl); }
158 
159     /* Non-central Beta Distribution */
dnbeta(double x,double a,double b,double ncp,int lg)160     inline double dnbeta(double x, double a, double b, double ncp, int lg)		{ return ::Rf_dnbeta(x, a, b, ncp, lg); }
pnbeta(double x,double a,double b,double ncp,int lt,int lg)161     inline double pnbeta(double x, double a, double b, double ncp, int lt, int lg)	{ return ::Rf_pnbeta(x, a, b, ncp, lt, lg); }
qnbeta(double p,double a,double b,double ncp,int lt,int lg)162     inline double qnbeta(double p, double a, double b, double ncp, int lt, int lg)	{ return ::Rf_qnbeta(p, a, b, ncp, lt, lg); }
rnbeta(double a,double b,double np)163     inline double rnbeta(double a, double b, double np)					{ return ::Rf_rnbeta(a, b, np); }
164 
165     /* Non-central F Distribution */
dnf(double x,double df1,double df2,double ncp,int lg)166     inline double dnf(double x, double df1, double df2, double ncp, int lg)		{ return ::Rf_dnf(x, df1, df2, ncp, lg); }
pnf(double x,double df1,double df2,double ncp,int lt,int lg)167     inline double pnf(double x, double df1, double df2, double ncp, int lt, int lg)	{ return ::Rf_pnf(x, df1, df2, ncp, lt, lg); }
qnf(double p,double df1,double df2,double ncp,int lt,int lg)168     inline double qnf(double p, double df1, double df2, double ncp, int lt, int lg)	{ return ::Rf_qnf(p, df1, df2, ncp, lt, lg); }
169 
170     /* Non-central Student t Distribution */
dnt(double x,double df,double ncp,int lg)171     inline double dnt(double x, double df, double ncp, int lg)		{ return ::Rf_dnt(x, df, ncp, lg); }
pnt(double x,double df,double ncp,int lt,int lg)172     inline double pnt(double x, double df, double ncp, int lt, int lg)	{ return ::Rf_pnt(x, df, ncp, lt, lg); }
qnt(double p,double df,double ncp,int lt,int lg)173     inline double qnt(double p, double df, double ncp, int lt, int lg)	{ return ::Rf_qnt(p, df, ncp, lt, lg); }
174 
175     /* Studentized Range Distribution */
ptukey(double q,double rr,double cc,double df,int lt,int lg)176     inline double ptukey(double q, double rr, double cc, double df, int lt, int lg)	{ return ::Rf_ptukey(q, rr, cc, df, lt, lg); }
qtukey(double p,double rr,double cc,double df,int lt,int lg)177     inline double qtukey(double p, double rr, double cc, double df, int lt, int lg)	{ return ::Rf_qtukey(p, rr, cc, df, lt, lg); }
178 
179     /* Wilcoxon Rank Sum Distribution */
dwilcox(double x,double m,double n,int lg)180     inline double dwilcox(double x, double m, double n, int lg)		{ return ::Rf_dwilcox(x, m, n, lg); }
pwilcox(double q,double m,double n,int lt,int lg)181     inline double pwilcox(double q, double m, double n, int lt, int lg)	{ return ::Rf_pwilcox(q, m, n, lt, lg); }
qwilcox(double x,double m,double n,int lt,int lg)182     inline double qwilcox(double x, double m, double n, int lt, int lg)	{ return ::Rf_qwilcox(x, m, n, lt, lg); }
rwilcox(double m,double n)183     inline double rwilcox(double m, double n)				{ return ::Rf_rwilcox(m, n); }
184 
185     /* Wilcoxon Signed Rank Distribution */
dsignrank(double x,double n,int lg)186     inline double dsignrank(double x, double n, int lg)			{ return ::Rf_dsignrank(x, n, lg); }
psignrank(double x,double n,int lt,int lg)187     inline double psignrank(double x, double n, int lt, int lg)		{ return ::Rf_psignrank(x, n, lt, lg); }
qsignrank(double x,double n,int lt,int lg)188     inline double qsignrank(double x, double n, int lt, int lg)		{ return ::Rf_qsignrank(x, n, lt, lg); }
rsignrank(double n)189     inline double rsignrank(double n)					{ return ::Rf_rsignrank(n); }
190 
191     /* Gamma and Related Functions */
gammafn(double x)192     inline double gammafn(double x)			{ return ::Rf_gammafn(x); }
lgammafn(double x)193     inline double lgammafn(double x)			{ return ::Rf_lgammafn(x); }
lgammafn_sign(double x,int * sgn)194     inline double lgammafn_sign(double x, int *sgn)	{ return ::Rf_lgammafn_sign(x, sgn); }
dpsifn(double x,int n,int kode,int m,double * ans,int * nz,int * ierr)195     inline void   dpsifn(double x, int n, int kode, int m, double *ans, int *nz, int *ierr)	{ return ::Rf_dpsifn(x, n, kode, m, ans, nz, ierr); }
psigamma(double x,double deriv)196     inline double psigamma(double x, double deriv)	{ return ::Rf_psigamma(x, deriv); }
digamma(double x)197     inline double digamma(double x)	{ return ::Rf_digamma(x); }
trigamma(double x)198     inline double trigamma(double x)	{ return ::Rf_trigamma(x); }
tetragamma(double x)199     inline double tetragamma(double x)	{ return ::Rf_tetragamma(x); }
pentagamma(double x)200     inline double pentagamma(double x)	{ return ::Rf_pentagamma(x); }
201 
beta(double a,double b)202     inline double beta(double a, double b)	{ return ::Rf_beta(a, b); }
lbeta(double a,double b)203     inline double lbeta(double a, double b)	{ return ::Rf_lbeta(a, b); }
204 
choose(double n,double k)205     inline double choose(double n, double k)	{ return ::Rf_choose(n, k); }
lchoose(double n,double k)206     inline double lchoose(double n, double k)	{ return ::Rf_lchoose(n, k); }
207 
208     /* Bessel Functions */
bessel_i(double x,double al,double ex)209     inline double bessel_i(double x, double al, double ex)	{ return ::Rf_bessel_i(x, al, ex); }
bessel_j(double x,double al)210     inline double bessel_j(double x, double al)			{ return ::Rf_bessel_j(x, al); }
bessel_k(double x,double al,double ex)211     inline double bessel_k(double x, double al, double ex)	{ return ::Rf_bessel_k(x, al, ex); }
bessel_y(double x,double al)212     inline double bessel_y(double x, double al)			{ return ::Rf_bessel_y(x, al); }
bessel_i_ex(double x,double al,double ex,double * bi)213     inline double bessel_i_ex(double x, double al, double ex, double *bi)	{ return ::Rf_bessel_i_ex(x, al, ex, bi); }
bessel_j_ex(double x,double al,double * bj)214     inline double bessel_j_ex(double x, double al, double *bj)			{ return ::Rf_bessel_j_ex(x, al, bj); }
bessel_k_ex(double x,double al,double ex,double * bk)215     inline double bessel_k_ex(double x, double al, double ex, double *bk)	{ return ::Rf_bessel_k_ex(x, al, ex, bk); }
bessel_y_ex(double x,double al,double * by)216     inline double bessel_y_ex(double x, double al, double *by)			{ return ::Rf_bessel_y_ex(x, al, by); }
217 
218     /* General Support Functions */
219 #ifndef HAVE_HYPOT
hypot(double a,double b)220     inline double hypot(double a, double b)	{ return ::Rf_hypot(a, b); }
221 #endif
222     /* Gone since R 2.14.0 according to Brian Ripley and is now comment out per his request */
223     /* inline double pythag(double a, double b)	{ return ::Rf_pythag(a, b); } */
224 #ifndef HAVE_EXPM1
225     inline double expm1(double x); /* = exp(x)-1 {care for small x} */	{ return ::Rf_expm1(x); }
226 #endif
227 #ifndef HAVE_LOG1P
228     inline double log1p(double x); /* = log(1+x) {care for small x} */ { return ::Rf_log1p(x); }
229 #endif
imax2(int x,int y)230     inline int imax2(int x, int y)		{ return ::Rf_imax2(x, y); }
imin2(int x,int y)231     inline int imin2(int x, int y)		{ return ::Rf_imin2(x, y); }
fmax2(double x,double y)232     inline double fmax2(double x, double y)	{ return ::Rf_fmax2(x, y); }
fmin2(double x,double y)233     inline double fmin2(double x, double y)	{ return ::Rf_fmin2(x, y); }
sign(double x)234     inline double sign(double x)		{ return ::Rf_sign(x); }
fprec(double x,double dg)235     inline double fprec(double x, double dg)	{ return ::Rf_fprec(x, dg); }
fround(double x,double dg)236     inline double fround(double x, double dg)	{ return ::Rf_fround(x, dg); }
fsign(double x,double y)237     inline double fsign(double x, double y)	{ return ::Rf_fsign(x, y); }
ftrunc(double x)238     inline double ftrunc(double x)		{ return ::Rf_ftrunc(x); }
239 
240 }
241 
242 #endif
243