| 571 |
ihaka |
1 |
#ifndef MATHLIB_H
|
|
|
2 |
#define MATHLIB_H
|
| 2 |
r |
3 |
|
|
|
4 |
#include "Arith.h"
|
|
|
5 |
|
| 571 |
ihaka |
6 |
#include <errno.h>
|
|
|
7 |
#include <float.h>
|
|
|
8 |
#include <limits.h>
|
| 2 |
r |
9 |
#include <math.h>
|
|
|
10 |
#include <stdlib.h>
|
|
|
11 |
|
| 777 |
maechler |
12 |
/* (>=) 30 Decimal-place constants computed with bc (scale=32; proper round) */
|
| 2 |
r |
13 |
|
| 777 |
maechler |
14 |
#ifndef M_SQRT_2
|
|
|
15 |
#define M_SQRT_2 1.4142135623730950488016887242097
|
|
|
16 |
#define M_1_SQRT_2 0.707106781186547524400844362105 /* 1/sqrt(2) */
|
|
|
17 |
#define M_SQRT_32 5.656854249492380195206754896838 /* sqrt(32) */
|
| 2 |
r |
18 |
#endif
|
|
|
19 |
|
| 777 |
maechler |
20 |
#ifndef M_LN_2
|
|
|
21 |
#define M_LN_2 0.693147180559945309417232121458176568
|
|
|
22 |
#define M_LOG10_2 0.301029995663981195213738894724493027
|
|
|
23 |
#endif
|
|
|
24 |
|
| 2 |
r |
25 |
#ifndef M_PI
|
| 777 |
maechler |
26 |
#define M_PI 3.141592653589793238462643383279502884197169399375
|
| 2 |
r |
27 |
#endif
|
|
|
28 |
#ifndef M_PI_half
|
| 777 |
maechler |
29 |
#define M_PI_half 1.570796326794896619231321691640
|
| 2 |
r |
30 |
#endif
|
|
|
31 |
|
|
|
32 |
#ifndef M_SQRT_PI
|
| 777 |
maechler |
33 |
/* sqrt(pi), 1/sqrt(2pi), sqrt(2/pi) : */
|
|
|
34 |
#define M_SQRT_PI 1.772453850905516027298167483341
|
|
|
35 |
#define M_1_SQRT_2PI 0.398942280401432677939946059934
|
|
|
36 |
#define M_SQRT_2dPI 0.79788456080286535587989211986876
|
| 2 |
r |
37 |
#endif
|
|
|
38 |
|
|
|
39 |
|
| 777 |
maechler |
40 |
#ifndef M_LN_SQRT_PI
|
|
|
41 |
/* log(sqrt(pi)) = log(pi)/2 : */
|
|
|
42 |
#define M_LN_SQRT_PI 0.5723649429247000870717136756765293558
|
| 2 |
r |
43 |
/* log(sqrt(2*pi)) = log(2*pi)/2 : */
|
| 777 |
maechler |
44 |
#define M_LN_SQRT_2PI 0.91893853320467274178032973640562
|
|
|
45 |
/* log(sqrt(pi/2)) = log(pi/2)/2 : */
|
|
|
46 |
#define M_LN_SQRT_PId2 0.225791352644727432363097614947441
|
| 2 |
r |
47 |
#endif
|
|
|
48 |
|
| 777 |
maechler |
49 |
|
|
|
50 |
|
| 571 |
ihaka |
51 |
#define MATHLIB_ERROR(x) { printf("%s\n",x); exit(1); }
|
|
|
52 |
#define MATHLIB_WARNING(x) { printf("%s\n",x); }
|
| 2 |
r |
53 |
|
| 571 |
ihaka |
54 |
#define ME_NONE 0
|
|
|
55 |
#define ME_DOMAIN 1
|
|
|
56 |
#define ME_RANGE 2
|
|
|
57 |
#define ME_NOCONV 3
|
|
|
58 |
#define ME_PRECISION 4
|
|
|
59 |
#define ME_UNDERFLOW 5
|
|
|
60 |
|
|
|
61 |
#undef ML_PRECISION_WARNINGS
|
|
|
62 |
|
|
|
63 |
#ifdef IEEE_754
|
| 989 |
maechler |
64 |
#include <ieeefp.h>
|
| 571 |
ihaka |
65 |
extern double m_zero;
|
|
|
66 |
extern double m_one;
|
|
|
67 |
extern double m_tiny;
|
|
|
68 |
#define ML_ERROR(x) /* nothing */
|
|
|
69 |
#define ML_POSINF (m_one / m_zero)
|
|
|
70 |
#define ML_NEGINF ((-m_one) / m_zero)
|
|
|
71 |
#define ML_NAN (m_zero / m_zero)
|
|
|
72 |
#define ML_UNDERFLOW (m_tiny * m_tiny)
|
| 777 |
maechler |
73 |
#define ML_VALID(x) (!isnan(x))
|
| 571 |
ihaka |
74 |
#else
|
|
|
75 |
#define ML_ERROR(x) ml_error(x)
|
|
|
76 |
#define ML_POSINF DBL_MAX
|
|
|
77 |
#define ML_NEGINF (-DBL_MAX)
|
|
|
78 |
#define ML_NAN (-DBL_MAX)
|
|
|
79 |
#define ML_UNDERFLOW 0
|
| 777 |
maechler |
80 |
#define ML_VALID(x) (errno == 0)
|
| 2 |
r |
81 |
#endif
|
|
|
82 |
|
| 571 |
ihaka |
83 |
/* Splus Compatibility */
|
| 2 |
r |
84 |
|
| 571 |
ihaka |
85 |
#define snorm norm_rand
|
|
|
86 |
#define sunif unif_rand
|
|
|
87 |
#define sexp exp_rand
|
| 2 |
r |
88 |
|
| 571 |
ihaka |
89 |
/* Name Hiding to Avoid Clashes with Fortran */
|
| 2 |
r |
90 |
|
| 571 |
ihaka |
91 |
#ifdef HIDE_NAMES
|
|
|
92 |
#define d1mach c_d1mach
|
|
|
93 |
#define i1mach c_i1mach
|
|
|
94 |
#endif
|
| 2 |
r |
95 |
|
| 571 |
ihaka |
96 |
#define rround fround
|
|
|
97 |
#define prec fprec
|
|
|
98 |
#define trunc ftrunc
|
| 829 |
maechler |
99 |
/* NO! fsign(.) has 2 arguments; sign(.) has 1..
|
|
|
100 |
#define sign fsign
|
|
|
101 |
*/
|
| 2 |
r |
102 |
|
| 571 |
ihaka |
103 |
/* Machine Characteristics */
|
| 2 |
r |
104 |
|
| 571 |
ihaka |
105 |
double d1mach(int);
|
|
|
106 |
double d1mach_(int*);
|
|
|
107 |
int i1mach(int);
|
|
|
108 |
int i1mach_(int*);
|
| 2 |
r |
109 |
|
| 571 |
ihaka |
110 |
/* General Support Functions */
|
| 2 |
r |
111 |
|
| 571 |
ihaka |
112 |
int imax2(int, int);
|
|
|
113 |
int imin2(int, int);
|
| 829 |
maechler |
114 |
double sign(double);
|
| 571 |
ihaka |
115 |
double fmax2(double, double);
|
|
|
116 |
double fmin2(double, double);
|
|
|
117 |
double fmod(double, double);
|
|
|
118 |
double fprec(double, double);
|
|
|
119 |
double fround(double, double);
|
|
|
120 |
double ftrunc(double);
|
|
|
121 |
double fsign(double, double);
|
|
|
122 |
double fsquare(double);
|
|
|
123 |
double fcube(double);
|
| 2 |
r |
124 |
|
| 571 |
ihaka |
125 |
/* Random Number Generators */
|
| 2 |
r |
126 |
|
| 571 |
ihaka |
127 |
double snorm(void);
|
|
|
128 |
double sunif(void);
|
|
|
129 |
double sexp(void);
|
| 2 |
r |
130 |
|
| 571 |
ihaka |
131 |
/* Chebyshev Series */
|
| 2 |
r |
132 |
|
| 571 |
ihaka |
133 |
int chebyshev_init(double*, int, double);
|
|
|
134 |
double chebyshev_eval(double, double *, int);
|
| 2 |
r |
135 |
|
| 571 |
ihaka |
136 |
/* Gamma and Related Functions */
|
| 2 |
r |
137 |
|
| 571 |
ihaka |
138 |
double logrelerr(double);
|
|
|
139 |
void gammalims(double*, double*);
|
|
|
140 |
double lgammacor(double);
|
|
|
141 |
double gamma(double);
|
|
|
142 |
double lgamma(double);
|
|
|
143 |
void dpsifn(double, int, int, int, double*, int*, int*);
|
|
|
144 |
double digamma(double);
|
|
|
145 |
double trigamma(double);
|
|
|
146 |
double tetragamma(double);
|
|
|
147 |
double pentagamma(double);
|
| 2 |
r |
148 |
|
| 571 |
ihaka |
149 |
double choose(double, double);
|
|
|
150 |
double lchoose(double, double);
|
|
|
151 |
double fastchoose(double, double);
|
|
|
152 |
double lfastchoose(double, double);
|
| 2 |
r |
153 |
|
| 571 |
ihaka |
154 |
/* Beta and Related Functions */
|
| 2 |
r |
155 |
|
| 571 |
ihaka |
156 |
double beta(double, double);
|
|
|
157 |
double lbeta(double, double);
|
| 2 |
r |
158 |
|
| 571 |
ihaka |
159 |
/* Normal Distribution */
|
| 2 |
r |
160 |
|
| 571 |
ihaka |
161 |
double dnorm(double, double, double);
|
|
|
162 |
double pnorm(double, double, double);
|
|
|
163 |
double qnorm(double, double, double);
|
|
|
164 |
double rnorm(double, double);
|
| 2 |
r |
165 |
|
| 571 |
ihaka |
166 |
/* Uniform Distribution */
|
| 2 |
r |
167 |
|
| 571 |
ihaka |
168 |
double dunif(double, double, double);
|
|
|
169 |
double punif(double, double, double);
|
|
|
170 |
double qunif(double, double, double);
|
|
|
171 |
double runif(double, double);
|
| 2 |
r |
172 |
|
| 571 |
ihaka |
173 |
/* Gamma Distribution */
|
| 2 |
r |
174 |
|
| 571 |
ihaka |
175 |
double dgamma(double, double, double);
|
|
|
176 |
double pgamma(double, double, double);
|
|
|
177 |
double qgamma(double, double, double);
|
|
|
178 |
double rgamma(double, double);
|
| 2 |
r |
179 |
|
| 571 |
ihaka |
180 |
/* Beta Distribution */
|
| 2 |
r |
181 |
|
| 571 |
ihaka |
182 |
double dbeta(double, double, double);
|
|
|
183 |
double pbeta(double, double, double);
|
|
|
184 |
double pbeta_raw(double, double, double);
|
|
|
185 |
double qbeta(double, double, double);
|
|
|
186 |
double rbeta(double, double);
|
| 2 |
r |
187 |
|
| 571 |
ihaka |
188 |
/* Lognormal Distribution */
|
| 2 |
r |
189 |
|
| 571 |
ihaka |
190 |
double dlnorm(double, double, double);
|
|
|
191 |
double plnorm(double, double, double);
|
|
|
192 |
double qlnorm(double, double, double);
|
|
|
193 |
double rlnorm(double, double);
|
| 2 |
r |
194 |
|
| 571 |
ihaka |
195 |
/* Chi-squared Distribution */
|
| 2 |
r |
196 |
|
| 571 |
ihaka |
197 |
double dchisq(double, double);
|
|
|
198 |
double pchisq(double, double);
|
|
|
199 |
double qchisq(double, double);
|
|
|
200 |
double rchisq(double);
|
| 2 |
r |
201 |
|
| 571 |
ihaka |
202 |
/* Non-central Chi-squared Distribution */
|
| 2 |
r |
203 |
|
| 605 |
ihaka |
204 |
double dnchisq(double, double, double);
|
| 571 |
ihaka |
205 |
double pnchisq(double, double, double);
|
|
|
206 |
double qnchisq(double, double, double);
|
| 605 |
ihaka |
207 |
double rnchisq(double, double);
|
| 571 |
ihaka |
208 |
|
|
|
209 |
/* F Distibution */
|
|
|
210 |
|
|
|
211 |
double df(double, double, double);
|
|
|
212 |
double pf(double, double, double);
|
|
|
213 |
double qf(double, double, double);
|
|
|
214 |
double rf(double, double);
|
|
|
215 |
|
|
|
216 |
/* Student t Distibution */
|
|
|
217 |
|
|
|
218 |
double dt(double, double);
|
|
|
219 |
double pt(double, double);
|
|
|
220 |
double qt(double, double);
|
|
|
221 |
double rt(double);
|
|
|
222 |
|
|
|
223 |
/* Binomial Distribution */
|
|
|
224 |
|
|
|
225 |
double dbinom(double, double, double);
|
|
|
226 |
double pbinom(double, double, double);
|
|
|
227 |
double qbinom(double, double, double);
|
|
|
228 |
double rbinom(double, double);
|
|
|
229 |
|
|
|
230 |
/* Cauchy Distribution */
|
|
|
231 |
|
|
|
232 |
double dcauchy(double, double, double);
|
|
|
233 |
double pcauchy(double, double, double);
|
|
|
234 |
double qcauchy(double, double, double);
|
|
|
235 |
double rcauchy(double, double);
|
|
|
236 |
|
|
|
237 |
/* Exponential Distribution */
|
|
|
238 |
|
|
|
239 |
double dexp(double, double);
|
|
|
240 |
double pexp(double, double);
|
|
|
241 |
double qexp(double, double);
|
|
|
242 |
double rexp(double);
|
|
|
243 |
|
|
|
244 |
/* Geometric Distribution */
|
|
|
245 |
|
|
|
246 |
double dgeom(double, double);
|
|
|
247 |
double pgeom(double, double);
|
|
|
248 |
double qgeom(double, double);
|
|
|
249 |
double rgeom(double);
|
|
|
250 |
|
|
|
251 |
/* Hypergeometric Distibution */
|
|
|
252 |
|
|
|
253 |
double dhyper(double, double, double, double);
|
|
|
254 |
double phyper(double, double, double, double);
|
|
|
255 |
double qhyper(double, double, double, double);
|
|
|
256 |
double rhyper(double, double, double);
|
|
|
257 |
|
|
|
258 |
/* Negative Binomial Distribution */
|
|
|
259 |
|
|
|
260 |
double dnbinom(double, double, double);
|
|
|
261 |
double pnbinom(double, double, double);
|
|
|
262 |
double qnbinom(double, double, double);
|
|
|
263 |
double rnbinom(double, double);
|
|
|
264 |
|
|
|
265 |
/* Poisson Distribution */
|
|
|
266 |
|
|
|
267 |
double dpois(double, double);
|
|
|
268 |
double ppois(double, double);
|
|
|
269 |
double qpois(double, double);
|
|
|
270 |
double rpois(double);
|
|
|
271 |
|
|
|
272 |
/* Weibull Distribution */
|
|
|
273 |
|
|
|
274 |
double dweibull(double, double, double);
|
|
|
275 |
double pweibull(double, double, double);
|
|
|
276 |
double qweibull(double, double, double);
|
|
|
277 |
double rweibull(double, double);
|
|
|
278 |
|
|
|
279 |
/* Logistic Distribution */
|
|
|
280 |
|
|
|
281 |
double dlogis(double, double, double);
|
|
|
282 |
double plogis(double, double, double);
|
|
|
283 |
double qlogis(double, double, double);
|
|
|
284 |
double rlogis(double, double);
|
|
|
285 |
|
| 602 |
ihaka |
286 |
/* Non-central Beta Distribution */
|
|
|
287 |
|
|
|
288 |
double dnbeta(double, double, double, double);
|
|
|
289 |
double pnbeta(double, double, double, double);
|
|
|
290 |
double qnbeta(double, double, double, double);
|
|
|
291 |
double rnbeta(double, double, double);
|
|
|
292 |
|
|
|
293 |
/* Non-central F Distribution */
|
|
|
294 |
|
|
|
295 |
double dnf(double, double, double, double);
|
|
|
296 |
double pnf(double, double, double, double);
|
|
|
297 |
double qnf(double, double, double, double);
|
|
|
298 |
double rnf(double, double, double);
|
|
|
299 |
|
|
|
300 |
/* Non-central Student t Distribution */
|
|
|
301 |
|
|
|
302 |
double dnt(double, double, double);
|
|
|
303 |
double pnt(double, double, double);
|
|
|
304 |
double qnt(double, double, double);
|
|
|
305 |
double rnt(double, double);
|
|
|
306 |
|
| 624 |
ihaka |
307 |
/* Studentized Range Distribution */
|
|
|
308 |
|
|
|
309 |
double dtukey(double, double, double, double);
|
|
|
310 |
double ptukey(double, double, double, double);
|
|
|
311 |
double qtukey(double, double, double, double);
|
|
|
312 |
double rtukey(double, double, double);
|
|
|
313 |
|
| 2 |
r |
314 |
#endif
|