LifeV
gamma.cpp
Go to the documentation of this file.
1 // gamma.cpp -- computation of gamma function.
2 // Algorithms and coefficient values from "Computation of Special
3 // Functions", Zhang and Jin, John Wiley and Sons, 1996.
4 //
5 // (C) 2003, C. Bond. All rights reserved.
6 //
7 // Returns gamma function of argument 'x'.
8 //
9 // NOTE: Returns 1e308 if argument is a negative integer or 0,
10 // or if argument exceeds 171.
11 //
12 #include <cmath>
13 namespace bessel
14 {
15 double gamma (double x)
16 {
17  int i, k, m;
18  double ga, gr, r (0), z;
19 
20  static double g[] =
21  {
22  1.0,
23  0.5772156649015329,
24  -0.6558780715202538,
25  -0.420026350340952e-1,
26  0.1665386113822915,
27  -0.421977345555443e-1,
28  -0.9621971527877e-2,
29  0.7218943246663e-2,
30  -0.11651675918591e-2,
31  -0.2152416741149e-3,
32  0.1280502823882e-3,
33  -0.201348547807e-4,
34  -0.12504934821e-5,
35  0.1133027232e-5,
36  -0.2056338417e-6,
37  0.6116095e-8,
38  0.50020075e-8,
39  -0.11812746e-8,
40  0.1043427e-9,
41  0.77823e-11,
42  -0.36968e-11,
43  0.51e-12,
44  -0.206e-13,
45  -0.54e-14,
46  0.14e-14
47  };
48 
49  if (x > 171.0)
50  {
51  return 1e308; // This value is an overflow flag.
52  }
53  if (x == (int) x)
54  {
55  if (x > 0.0)
56  {
57  ga = 1.0; // use factorial
58  for (i = 2; i < x; i++)
59  {
60  ga *= i;
61  }
62  }
63  else
64  {
65  ga = 1e308;
66  }
67  }
68  else
69  {
70  if (std::fabs (x) > 1.0)
71  {
72  z = std::fabs (x);
73  m = (int) z;
74  r = 1.0;
75  for (k = 1; k <= m; k++)
76  {
77  r *= (z - k);
78  }
79  z -= m;
80  }
81  else
82  {
83  z = x;
84  }
85  gr = g[24];
86  for (k = 23; k >= 0; k--)
87  {
88  gr = gr * z + g[k];
89  }
90  ga = 1.0 / (gr * z);
91  if (std::fabs (x) > 1.0)
92  {
93  ga *= r;
94  if (x < 0.0)
95  {
96  ga = -M_PI / (x * ga * std::sin (M_PI * x) );
97  }
98  }
99  }
100  return ga;
101 }
102 }
Definition: bessik.cpp:9
#define M_PI
Definition: winmath.h:20
double gamma(double x)
Definition: gamma.cpp:15