The R Project SVN R

Rev

Rev 3076 | Rev 3279 | 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
 
3076 pd 4
#define MATHLIB_IN_R/*-- Mathlib as part of R --*/
5
 
2 r 6
#include "Arith.h"
3076 pd 7
#include "Random.h"
2 r 8
 
2629 maechler 9
#ifdef FORTRAN_H
10
#error __MUST__include "Mathlib.h"  _before_  "Fortran.h"
11
#endif
12
 
571 ihaka 13
#include <errno.h>
2737 hornik 14
#include <limits.h>
571 ihaka 15
#include <float.h>
2 r 16
#include <math.h>
17
#include <stdlib.h>
18
 
2629 maechler 19
/* TRUE and FALSE conflict with the Mac --- Fortran.h still defines them... */
20
#define LTRUE	(1)
21
#define LFALSE	(0)
22
 
3244 ihaka 23
/* 30 Decimal-place constants */
24
/* Computed with bc -l (scale=32; proper round) */
2 r 25
 
3244 ihaka 26
/* SVID & X/Open Constants */
27
/* Names from Solaris math.h */
28
 
29
#ifndef M_E
30
#define M_E		2.718281828459045235360287471353	/* e */
31
#endif
32
 
33
#ifndef M_LOG2E
34
#define M_LOG2E		1.442695040888963407359924681002	/* log2(e) */
35
#endif
36
 
37
#ifndef M_LOG10E
38
#define M_LOG10E        0.434294481903251827651128918917	/* log10(e) */
39
#endif
40
 
41
#ifndef M_LN2
42
#define M_LN2		0.693147180559945309417232121458	/* ln(2) */
43
#endif
44
 
45
#ifndef M_LN10
46
#define M_LN10		2.302585092994045684017991454684	/* ln(10) */
47
#endif
48
 
49
#ifndef M_PI
50
#define M_PI		3.141592653589793238462643383280        /* pi */
51
#endif
52
 
53
#ifndef M_PI_2
54
#define M_PI_2		1.570796326794896619231321691640	/* pi/2 */
55
#endif
56
 
57
#ifndef M_PI_4
58
#define M_PI_4		0.785398163397448309615660845820	/* pi/4 */
59
#endif
60
 
61
#ifndef M_1_PI		
62
#define M_1_PI		0.318309886183790671537767526745	/* 1/pi */
63
#endif
64
 
65
#ifndef M_2_PI		
66
#define M_2_PI		0.636619772367581343075535053490	/* 1/pi */
67
#endif
68
 
69
#ifndef M_2_SQRTPI
70
#define M_2_SQRTPI	1.128379167095512573896158903122	/* 1/sqrt(pi) */
71
#endif
72
 
73
#ifndef M_SQRT2
74
#define M_SQRT2		1.414213562373095048801688724210	/* sqrt(2) */
75
#endif
76
 
77
#ifndef M_SQRT1_2
78
#define M_SQRT1_2	0.707106781186547524400844362105	/* 1/sqrt(2) */
79
#endif
80
 
81
/* Other, R-Specific Constants */
82
/* Note there are some repeats of values above */
83
/* Needs a cleanup */
84
 
85
#ifndef M_1_SQRT_2
777 maechler 86
#define M_1_SQRT_2	0.707106781186547524400844362105	/* 1/sqrt(2) */
3244 ihaka 87
#endif
88
 
89
#ifndef M_SQRT_32
777 maechler 90
#define M_SQRT_32	5.656854249492380195206754896838	/* sqrt(32) */
2 r 91
#endif
92
 
3244 ihaka 93
#ifndef M_LOG10_2
94
#define M_LOG10_2	0.301029995663981195213738894724	/* log10(2) */
777 maechler 95
#endif
96
 
2 r 97
#ifndef M_PI_half
3244 ihaka 98
#define M_PI_half	1.570796326794896619231321691640	/* pi/2 */
2 r 99
#endif
100
 
101
#ifndef M_SQRT_PI
3244 ihaka 102
#define M_SQRT_PI	1.772453850905516027298167483341	/* sqrt(pi) */
2 r 103
#endif
104
 
3244 ihaka 105
#ifndef M_1_SQRT_2PI
106
#define M_1_SQRT_2PI	0.398942280401432677939946059934	/* 1/sqrt(2pi) */
107
#endif
2 r 108
 
3244 ihaka 109
#ifndef M_SQRT_2dPI
110
#define M_SQRT_2dPI	0.797884560802865355879892119869	/* sqrt(2/pi) */
111
#endif
112
 
113
 
777 maechler 114
#ifndef M_LN_SQRT_PI
3244 ihaka 115
#define M_LN_SQRT_PI	0.572364942924700087071713675677	/* log(sqrt(pi)) */
2 r 116
#endif
117
 
3244 ihaka 118
#ifndef M_LN_SQRT_2PI
119
#define M_LN_SQRT_2PI	0.918938533204672741780329736406	/* log(sqrt(2*pi)) */
120
#endif
777 maechler 121
 
3244 ihaka 122
#ifndef M_LN_SQRT_PId2
123
#define M_LN_SQRT_PId2	0.225791352644727432363097614947	/* log(sqrt(pi/2)) */
124
#endif
125
 
126
 
3076 pd 127
#ifdef MATHLIB_IN_R/* Mathlib in R */
777 maechler 128
 
3076 pd 129
#include "Error.h"
130
# define MATHLIB_ERROR(fmt,x)		error(fmt,x);
131
# define MATHLIB_WARNING(fmt,x)		warning(fmt,x)
132
# define MATHLIB_WARNING2(fmt,x,x2)	warning(fmt,x,x2)
133
# define MATHLIB_WARNING3(fmt,x,x2,x3)	warning(fmt,x,x2,x3)
134
# define MATHLIB_WARNING4(fmt,x,x2,x3,x4) warning(fmt,x,x2,x3,x4)
2 r 135
 
3076 pd 136
#else/* Mathlib standalone */
137
 
138
#include <stdio.h>
139
# define MATHLIB_ERROR(fmt,x)   { printf(fmt,x); exit(1) }
140
# define MATHLIB_WARNING(fmt,x)		printf(fmt,x)
141
# define MATHLIB_WARNING2(fmt,x,x2)	printf(fmt,x,x2)
142
# define MATHLIB_WARNING3(fmt,x,x2,x3)	printf(fmt,x,x2,x3)
143
# define MATHLIB_WARNING4(fmt,x,x2,x3,x4) printf(fmt,x,x2,x3,x4)
144
#endif
145
 
571 ihaka 146
#define ME_NONE		0
147
#define ME_DOMAIN	1
148
#define ME_RANGE	2
149
#define ME_NOCONV	3
150
#define ME_PRECISION	4
151
#define ME_UNDERFLOW	5
152
 
153
#undef ML_PRECISION_WARNINGS
154
 
155
#ifdef IEEE_754
1001 maechler 156
#ifdef HAVE_IEEE754_H
1034 maechler 157
#include <ieee754.h> /* newer Linuxen */
1001 maechler 158
#else
995 ihaka 159
#ifdef HAVE_IEEEFP_H
1034 maechler 160
#include <ieeefp.h> /* others [Solaris 2.5.x], .. */
995 ihaka 161
#endif
1001 maechler 162
#endif
995 ihaka 163
 
571 ihaka 164
extern double m_zero;
165
extern double m_one;
166
extern double m_tiny;
167
#define ML_ERROR(x)	/* nothing */
168
#define ML_POSINF	(m_one / m_zero)
169
#define ML_NEGINF	((-m_one) / m_zero)
170
#define ML_NAN		(m_zero / m_zero)
171
#define ML_UNDERFLOW	(m_tiny * m_tiny)
777 maechler 172
#define ML_VALID(x)	(!isnan(x))
571 ihaka 173
#else
174
#define ML_ERROR(x)	ml_error(x)
175
#define ML_POSINF	DBL_MAX
176
#define ML_NEGINF	(-DBL_MAX)
177
#define ML_NAN		(-DBL_MAX)
178
#define ML_UNDERFLOW	0
777 maechler 179
#define ML_VALID(x)	(errno == 0)
2 r 180
#endif
181
 
571 ihaka 182
	/* Splus Compatibility */
2 r 183
 
571 ihaka 184
#define snorm	norm_rand
185
#define sunif	unif_rand
186
#define sexp	exp_rand
2 r 187
 
1394 ihaka 188
	/* Undo SGI Madness */
189
 
190
#ifdef ftrunc
191
#undef ftrunc
192
#endif
193
#ifdef qexp
194
#undef qexp
195
#endif
196
 
571 ihaka 197
	/* Name Hiding to Avoid Clashes with Fortran */
2 r 198
 
571 ihaka 199
#ifdef HIDE_NAMES
3076 pd 200
# define d1mach	c_d1mach
201
# define i1mach	c_i1mach
571 ihaka 202
#endif
2 r 203
 
571 ihaka 204
#define	rround	fround
205
#define	prec	fprec
3244 ihaka 206
#undef trunc
571 ihaka 207
#define	trunc	ftrunc
2 r 208
 
571 ihaka 209
	/* Machine Characteristics */
2 r 210
 
571 ihaka 211
double	d1mach(int);
212
double	d1mach_(int*);
213
int	i1mach(int);
214
int	i1mach_(int*);
2 r 215
 
571 ihaka 216
	/* General Support Functions */
2 r 217
 
571 ihaka 218
int	imax2(int, int);
219
int	imin2(int, int);
220
double	fmax2(double, double);
221
double	fmin2(double, double);
222
double	fmod(double, double);
223
double	fprec(double, double);
224
double	fround(double, double);
225
double	ftrunc(double);
3076 pd 226
double	sign(double);
571 ihaka 227
double	fsign(double, double);
228
double	fsquare(double);
229
double	fcube(double);
2 r 230
 
571 ihaka 231
	/* Random Number Generators */
2 r 232
 
571 ihaka 233
double	snorm(void);
234
double	sunif(void);
235
double	sexp(void);
2 r 236
 
571 ihaka 237
	/* Chebyshev Series */
2 r 238
 
571 ihaka 239
int	chebyshev_init(double*, int, double);
240
double	chebyshev_eval(double, double *, int);
2 r 241
 
571 ihaka 242
	/* Gamma and Related Functions */
2 r 243
 
571 ihaka 244
double	logrelerr(double);
245
void	gammalims(double*, double*);
246
double	lgammacor(double);
2278 maechler 247
double	gammafn(double);
2629 maechler 248
double	gamma_cody(double);
2278 maechler 249
double	lgammafn(double);
571 ihaka 250
void	dpsifn(double, int, int, int, double*, int*, int*);
251
double	digamma(double);
252
double	trigamma(double);
253
double	tetragamma(double);
254
double	pentagamma(double);
2 r 255
 
571 ihaka 256
double	choose(double, double);
257
double	lchoose(double, double);
258
double	fastchoose(double, double);
259
double	lfastchoose(double, double);
2 r 260
 
2629 maechler 261
	/* Bessel Functions of All Kinds */
262
 
263
double  bessel_i(double, double, double);
264
double  bessel_j(double, double);
265
double  bessel_k(double, double, double);
266
double  bessel_y(double, double);
267
void    I_bessel(double*, double*, long*, long*, double*, long*);
268
void    J_bessel(double*, double*, long*,        double*, long*);
269
void 	K_bessel(double*, double*, long*, long*, double*, long*);
270
void	Y_bessel(double*, double*, long*,        double*, long*);
271
 
571 ihaka 272
	/* Beta and Related Functions */
2 r 273
 
571 ihaka 274
double	beta(double, double);
275
double	lbeta(double, double);
2 r 276
 
571 ihaka 277
	/* Normal Distribution */
2 r 278
 
571 ihaka 279
double	dnorm(double, double, double);
280
double	pnorm(double, double, double);
281
double	qnorm(double, double, double);
282
double	rnorm(double, double);
2 r 283
 
571 ihaka 284
	/* Uniform Distribution */
2 r 285
 
571 ihaka 286
double	dunif(double, double, double);
287
double	punif(double, double, double);
288
double	qunif(double, double, double);
289
double	runif(double, double);
2 r 290
 
571 ihaka 291
	/* Gamma Distribution */
2 r 292
 
571 ihaka 293
double	dgamma(double, double, double);
294
double	pgamma(double, double, double);
295
double	qgamma(double, double, double);
296
double	rgamma(double, double);
2 r 297
 
571 ihaka 298
	/* Beta Distribution */
2 r 299
 
571 ihaka 300
double	dbeta(double, double, double);
301
double	pbeta(double, double, double);
302
double	pbeta_raw(double, double, double);
303
double	qbeta(double, double, double);
304
double	rbeta(double, double);
2 r 305
 
571 ihaka 306
	/* Lognormal Distribution */
2 r 307
 
571 ihaka 308
double	dlnorm(double, double, double);
309
double	plnorm(double, double, double);
310
double	qlnorm(double, double, double);
311
double	rlnorm(double, double);
2 r 312
 
571 ihaka 313
	/* Chi-squared Distribution */
2 r 314
 
571 ihaka 315
double	dchisq(double, double);
316
double	pchisq(double, double);
317
double	qchisq(double, double);
318
double	rchisq(double);
2 r 319
 
571 ihaka 320
	/* Non-central Chi-squared Distribution */
2 r 321
 
605 ihaka 322
double	dnchisq(double, double, double);
571 ihaka 323
double	pnchisq(double, double, double);
324
double	qnchisq(double, double, double);
605 ihaka 325
double	rnchisq(double, double);
571 ihaka 326
 
327
	/* F Distibution */
328
 
329
double	df(double, double, double);
330
double	pf(double, double, double);
331
double	qf(double, double, double);
332
double	rf(double, double);
333
 
334
	/* Student t Distibution */
335
 
336
double	dt(double, double);
337
double	pt(double, double);
338
double	qt(double, double);
339
double	rt(double);
340
 
341
	/* Binomial Distribution */
342
 
343
double	dbinom(double, double, double);
344
double	pbinom(double, double, double);
345
double	qbinom(double, double, double);
346
double	rbinom(double, double);
347
 
348
	/* Cauchy Distribution */
349
 
350
double	dcauchy(double, double, double);
351
double	pcauchy(double, double, double);
352
double	qcauchy(double, double, double);
353
double	rcauchy(double, double);
354
 
355
	/* Exponential Distribution */
356
 
357
double	dexp(double, double);
358
double	pexp(double, double);
359
double	qexp(double, double);
360
double	rexp(double);
361
 
362
	/* Geometric Distribution */
363
 
364
double	dgeom(double, double);
365
double	pgeom(double, double);
366
double	qgeom(double, double);
367
double	rgeom(double);
368
 
369
	/* Hypergeometric Distibution */
370
 
371
double	dhyper(double, double, double, double);
372
double	phyper(double, double, double, double);
373
double	qhyper(double, double, double, double);
374
double	rhyper(double, double, double);
375
 
376
	/* Negative Binomial Distribution */
377
 
378
double	dnbinom(double, double, double);
379
double	pnbinom(double, double, double);
380
double	qnbinom(double, double, double);
381
double	rnbinom(double, double);
382
 
383
	/* Poisson Distribution */
384
 
385
double	dpois(double, double);
386
double	ppois(double, double);
387
double	qpois(double, double);
388
double	rpois(double);
389
 
390
	/* Weibull Distribution */
391
 
392
double	dweibull(double, double, double);
393
double	pweibull(double, double, double);
394
double	qweibull(double, double, double);
395
double	rweibull(double, double);
396
 
397
	/* Logistic Distribution */
398
 
399
double	dlogis(double, double, double);
400
double	plogis(double, double, double);
401
double	qlogis(double, double, double);
402
double	rlogis(double, double);
403
 
602 ihaka 404
	/* Non-central Beta Distribution */
405
 
406
double	dnbeta(double, double, double, double);
407
double	pnbeta(double, double, double, double);
408
double	qnbeta(double, double, double, double);
409
double	rnbeta(double, double, double);
410
 
411
	/* Non-central F Distribution */
412
 
413
double	dnf(double, double, double, double);
414
double	pnf(double, double, double, double);
415
double	qnf(double, double, double, double);
416
double	rnf(double, double, double);
417
 
418
	/* Non-central Student t Distribution */
419
 
420
double	dnt(double, double, double);
421
double	pnt(double, double, double);
422
double	qnt(double, double, double);
423
double	rnt(double, double);
424
 
624 ihaka 425
	/* Studentized Range Distribution */
426
 
427
double	dtukey(double, double, double, double);
428
double	ptukey(double, double, double, double);
429
double	qtukey(double, double, double, double);
430
double	rtukey(double, double, double);
431
 
2235 hornik 432
/* Wilcoxon Rank Sum Distribution */
1276 hornik 433
 
434
#define WILCOX_MMAX 50
435
#define WILCOX_NMAX 50
436
double dwilcox(double, double, double);
437
double pwilcox(double, double, double);
438
double qwilcox(double, double, double);
439
double rwilcox(double, double);
440
 
2235 hornik 441
/* Wilcoxon Signed Rank Distribution */
442
 
443
#define SIGNRANK_NMAX 50
444
double dsignrank(double, double);
445
double psignrank(double, double);
446
double qsignrank(double, double);
447
double rsignrank(double);
448
 
2 r 449
#endif