1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
|
/* facf.c
*
* Factorial function
*
*
*
* SYNOPSIS:
*
* float y, facf();
* int i;
*
* y = facf( i );
*
*
*
* DESCRIPTION:
*
* Returns factorial of i = 1 * 2 * 3 * ... * i.
* fac(0) = 1.0.
*
* Due to machine arithmetic bounds the largest value of
* i accepted is 33 in single precision arithmetic.
* Greater values, or negative ones,
* produce an error message and return MAXNUM.
*
*
*
* ACCURACY:
*
* For i < 34 the values are simply tabulated, and have
* full machine accuracy.
*
*/
/*
Cephes Math Library Release 2.0: April, 1987
Copyright 1984, 1987 by Stephen L. Moshier
Direct inquiries to 30 Frost Street, Cambridge, MA 02140
*/
#include <math.h>
/* Factorials of integers from 0 through 33 */
static float factbl[] = {
1.00000000000000000000E0,
1.00000000000000000000E0,
2.00000000000000000000E0,
6.00000000000000000000E0,
2.40000000000000000000E1,
1.20000000000000000000E2,
7.20000000000000000000E2,
5.04000000000000000000E3,
4.03200000000000000000E4,
3.62880000000000000000E5,
3.62880000000000000000E6,
3.99168000000000000000E7,
4.79001600000000000000E8,
6.22702080000000000000E9,
8.71782912000000000000E10,
1.30767436800000000000E12,
2.09227898880000000000E13,
3.55687428096000000000E14,
6.40237370572800000000E15,
1.21645100408832000000E17,
2.43290200817664000000E18,
5.10909421717094400000E19,
1.12400072777760768000E21,
2.58520167388849766400E22,
6.20448401733239439360E23,
1.55112100433309859840E25,
4.03291461126605635584E26,
1.0888869450418352160768E28,
3.04888344611713860501504E29,
8.841761993739701954543616E30,
2.6525285981219105863630848E32,
8.22283865417792281772556288E33,
2.6313083693369353016721801216E35,
8.68331761881188649551819440128E36
};
#define MAXFACF 33
extern float MAXNUMF;
#ifdef ANSIC
float facf( int i )
#else
float facf(i)
int i;
#endif
{
if( i < 0 )
{
mtherr( "facf", SING );
return( MAXNUMF );
}
if( i > MAXFACF )
{
mtherr( "facf", OVERFLOW );
return( MAXNUMF );
}
/* Get answer from table for small i. */
return( factbl[i] );
}
|