The R Project SVN R

Rev

Rev 1034 | Rev 1394 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
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
 
1034 maechler 12
/* 30 Decimal-place constants computed with bc -l (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
1001 maechler 64
#ifdef HAVE_IEEE754_H
1034 maechler 65
#include <ieee754.h> /* newer Linuxen */
1001 maechler 66
#else
995 ihaka 67
#ifdef HAVE_IEEEFP_H
1034 maechler 68
#include <ieeefp.h> /* others [Solaris 2.5.x], .. */
995 ihaka 69
#endif
1001 maechler 70
#endif
995 ihaka 71
 
571 ihaka 72
extern double m_zero;
73
extern double m_one;
74
extern double m_tiny;
75
#define ML_ERROR(x)	/* nothing */
76
#define ML_POSINF	(m_one / m_zero)
77
#define ML_NEGINF	((-m_one) / m_zero)
78
#define ML_NAN		(m_zero / m_zero)
79
#define ML_UNDERFLOW	(m_tiny * m_tiny)
777 maechler 80
#define ML_VALID(x)	(!isnan(x))
571 ihaka 81
#else
82
#define ML_ERROR(x)	ml_error(x)
83
#define ML_POSINF	DBL_MAX
84
#define ML_NEGINF	(-DBL_MAX)
85
#define ML_NAN		(-DBL_MAX)
86
#define ML_UNDERFLOW	0
777 maechler 87
#define ML_VALID(x)	(errno == 0)
2 r 88
#endif
89
 
571 ihaka 90
	/* Splus Compatibility */
2 r 91
 
571 ihaka 92
#define snorm	norm_rand
93
#define sunif	unif_rand
94
#define sexp	exp_rand
2 r 95
 
571 ihaka 96
	/* Name Hiding to Avoid Clashes with Fortran */
2 r 97
 
571 ihaka 98
#ifdef HIDE_NAMES
99
#define d1mach	c_d1mach
100
#define i1mach	c_i1mach
101
#endif
2 r 102
 
571 ihaka 103
#define	rround	fround
104
#define	prec	fprec
105
#define	trunc	ftrunc
829 maechler 106
/* NO!  fsign(.) has 2 arguments;  sign(.) has 1..
107
 #define	sign	fsign
108
*/
2 r 109
 
571 ihaka 110
	/* Machine Characteristics */
2 r 111
 
571 ihaka 112
double	d1mach(int);
113
double	d1mach_(int*);
114
int	i1mach(int);
115
int	i1mach_(int*);
2 r 116
 
571 ihaka 117
	/* General Support Functions */
2 r 118
 
571 ihaka 119
int	imax2(int, int);
120
int	imin2(int, int);
829 maechler 121
double	sign(double);
571 ihaka 122
double	fmax2(double, double);
123
double	fmin2(double, double);
124
double	fmod(double, double);
125
double	fprec(double, double);
126
double	fround(double, double);
127
double	ftrunc(double);
128
double	fsign(double, double);
129
double	fsquare(double);
130
double	fcube(double);
2 r 131
 
571 ihaka 132
	/* Random Number Generators */
2 r 133
 
571 ihaka 134
double	snorm(void);
135
double	sunif(void);
136
double	sexp(void);
2 r 137
 
571 ihaka 138
	/* Chebyshev Series */
2 r 139
 
571 ihaka 140
int	chebyshev_init(double*, int, double);
141
double	chebyshev_eval(double, double *, int);
2 r 142
 
571 ihaka 143
	/* Gamma and Related Functions */
2 r 144
 
571 ihaka 145
double	logrelerr(double);
146
void	gammalims(double*, double*);
147
double	lgammacor(double);
148
double	gamma(double);
149
double	lgamma(double);
150
void	dpsifn(double, int, int, int, double*, int*, int*);
151
double	digamma(double);
152
double	trigamma(double);
153
double	tetragamma(double);
154
double	pentagamma(double);
2 r 155
 
571 ihaka 156
double	choose(double, double);
157
double	lchoose(double, double);
158
double	fastchoose(double, double);
159
double	lfastchoose(double, double);
2 r 160
 
571 ihaka 161
	/* Beta and Related Functions */
2 r 162
 
571 ihaka 163
double	beta(double, double);
164
double	lbeta(double, double);
2 r 165
 
571 ihaka 166
	/* Normal Distribution */
2 r 167
 
571 ihaka 168
double	dnorm(double, double, double);
169
double	pnorm(double, double, double);
170
double	qnorm(double, double, double);
171
double	rnorm(double, double);
2 r 172
 
571 ihaka 173
	/* Uniform Distribution */
2 r 174
 
571 ihaka 175
double	dunif(double, double, double);
176
double	punif(double, double, double);
177
double	qunif(double, double, double);
178
double	runif(double, double);
2 r 179
 
571 ihaka 180
	/* Gamma Distribution */
2 r 181
 
571 ihaka 182
double	dgamma(double, double, double);
183
double	pgamma(double, double, double);
184
double	qgamma(double, double, double);
185
double	rgamma(double, double);
2 r 186
 
571 ihaka 187
	/* Beta Distribution */
2 r 188
 
571 ihaka 189
double	dbeta(double, double, double);
190
double	pbeta(double, double, double);
191
double	pbeta_raw(double, double, double);
192
double	qbeta(double, double, double);
193
double	rbeta(double, double);
2 r 194
 
571 ihaka 195
	/* Lognormal Distribution */
2 r 196
 
571 ihaka 197
double	dlnorm(double, double, double);
198
double	plnorm(double, double, double);
199
double	qlnorm(double, double, double);
200
double	rlnorm(double, double);
2 r 201
 
571 ihaka 202
	/* Chi-squared Distribution */
2 r 203
 
571 ihaka 204
double	dchisq(double, double);
205
double	pchisq(double, double);
206
double	qchisq(double, double);
207
double	rchisq(double);
2 r 208
 
571 ihaka 209
	/* Non-central Chi-squared Distribution */
2 r 210
 
605 ihaka 211
double	dnchisq(double, double, double);
571 ihaka 212
double	pnchisq(double, double, double);
213
double	qnchisq(double, double, double);
605 ihaka 214
double	rnchisq(double, double);
571 ihaka 215
 
216
	/* F Distibution */
217
 
218
double	df(double, double, double);
219
double	pf(double, double, double);
220
double	qf(double, double, double);
221
double	rf(double, double);
222
 
223
	/* Student t Distibution */
224
 
225
double	dt(double, double);
226
double	pt(double, double);
227
double	qt(double, double);
228
double	rt(double);
229
 
230
	/* Binomial Distribution */
231
 
232
double	dbinom(double, double, double);
233
double	pbinom(double, double, double);
234
double	qbinom(double, double, double);
235
double	rbinom(double, double);
236
 
237
	/* Cauchy Distribution */
238
 
239
double	dcauchy(double, double, double);
240
double	pcauchy(double, double, double);
241
double	qcauchy(double, double, double);
242
double	rcauchy(double, double);
243
 
244
	/* Exponential Distribution */
245
 
246
double	dexp(double, double);
247
double	pexp(double, double);
248
double	qexp(double, double);
249
double	rexp(double);
250
 
251
	/* Geometric Distribution */
252
 
253
double	dgeom(double, double);
254
double	pgeom(double, double);
255
double	qgeom(double, double);
256
double	rgeom(double);
257
 
258
	/* Hypergeometric Distibution */
259
 
260
double	dhyper(double, double, double, double);
261
double	phyper(double, double, double, double);
262
double	qhyper(double, double, double, double);
263
double	rhyper(double, double, double);
264
 
265
	/* Negative Binomial Distribution */
266
 
267
double	dnbinom(double, double, double);
268
double	pnbinom(double, double, double);
269
double	qnbinom(double, double, double);
270
double	rnbinom(double, double);
271
 
272
	/* Poisson Distribution */
273
 
274
double	dpois(double, double);
275
double	ppois(double, double);
276
double	qpois(double, double);
277
double	rpois(double);
278
 
279
	/* Weibull Distribution */
280
 
281
double	dweibull(double, double, double);
282
double	pweibull(double, double, double);
283
double	qweibull(double, double, double);
284
double	rweibull(double, double);
285
 
286
	/* Logistic Distribution */
287
 
288
double	dlogis(double, double, double);
289
double	plogis(double, double, double);
290
double	qlogis(double, double, double);
291
double	rlogis(double, double);
292
 
602 ihaka 293
	/* Non-central Beta Distribution */
294
 
295
double	dnbeta(double, double, double, double);
296
double	pnbeta(double, double, double, double);
297
double	qnbeta(double, double, double, double);
298
double	rnbeta(double, double, double);
299
 
300
	/* Non-central F Distribution */
301
 
302
double	dnf(double, double, double, double);
303
double	pnf(double, double, double, double);
304
double	qnf(double, double, double, double);
305
double	rnf(double, double, double);
306
 
307
	/* Non-central Student t Distribution */
308
 
309
double	dnt(double, double, double);
310
double	pnt(double, double, double);
311
double	qnt(double, double, double);
312
double	rnt(double, double);
313
 
624 ihaka 314
	/* Studentized Range Distribution */
315
 
316
double	dtukey(double, double, double, double);
317
double	ptukey(double, double, double, double);
318
double	qtukey(double, double, double, double);
319
double	rtukey(double, double, double);
320
 
1276 hornik 321
	/* Wilcoxon Distribution */
322
 
323
#define WILCOX_MMAX 50
324
#define WILCOX_NMAX 50
325
double dwilcox(double, double, double);
326
double pwilcox(double, double, double);
327
double qwilcox(double, double, double);
328
double rwilcox(double, double);
329
 
2 r 330
#endif