|
12 | 12 |
|
13 | 13 | #ifdef __IS_COMPLEX__ |
14 | 14 |
|
15 | | -// This is accelerated by Kummer's transformation up to the 1/k^8 term. |
16 | 15 | EXTRAMATH_FUNDEF(lgamma, (__TYPENAME__ __z)) { |
17 | | - // TODO: This series is terrible. Find a faster way to compute this. |
18 | | - // Can't handle negative integers or zero. |
19 | | - if(__FNAMESRC__(imag)(__z) == 0 && __FNAMESRC__(real)(__z) <= 0 && |
20 | | - __FNAMESRC_SCAL__(fmod)(__FNAMESRC__(real)(__z), 1) == 0) { |
21 | | - return NAN; |
22 | | - } else { |
23 | | - __TYPENAME__ sum1 = 0, sum2 = 1; |
24 | | - __TYPENAME__ zet2 = 1.6449340668482264365 / 2 * __z * __z, |
25 | | - zet3 = 1.2020569031595942854 / 3 * __z * __z * __z, |
26 | | - zet4 = 1.0823232337111381915 / 4 * __z * __z * __z * __z, |
27 | | - zet5 = 1.0369277551433699263 / 5 * __z * __z * __z * __z * __z, |
28 | | - zet6 = 1.0173430619844491397 / 6 * __z * __z * __z * __z * __z * __z, |
29 | | - zet7 = 1.0083492773819228268 / 7 * __z * __z * __z * __z * __z * __z * __z, |
30 | | - zet8 = 1.0040773561979443394 / 8 * __z * __z * __z * __z * __z * __z * __z * __z; |
31 | | - for(int i = 1; !__FNAMESRC__(absconv)(sum1, __FNAMESRC_PREF__(abs)(sum1 - sum2)); i++) { |
32 | | - sum2 = sum1; |
33 | | - sum1 += -__FNAMESRC__(log)(1 + __z / i) + __z / i |
34 | | - - __z * __z / (2 * i * i) |
35 | | - + __z * __z * __z / (3 * i * i * i) |
36 | | - - __z * __z * __z * __z / (4 * i * i * i * i) |
37 | | - + __z * __z * __z * __z * __z / (5 * i * i * i * i * i) |
38 | | - - __z * __z * __z * __z * __z * __z / (6 * i * i * i * i * i * i) |
39 | | - + __z * __z * __z * __z * __z * __z * __z / (7 * i * i * i * i * i * i * i) |
40 | | - - __z * __z * __z * __z * __z * __z * __z * __z / (8 * i * i * i * i * i * i * i * i); |
41 | | - } |
42 | | - return sum1 - MASCHERONI * __z - __FNAMESRC__(log)(__z) + zet2 - zet3 + zet4 - zet5 + zet6 - zet7 + zet8; |
43 | | - } |
44 | | -} |
45 | 16 |
|
| 17 | +} |
46 | 18 |
|
| 19 | +// Use Lanczos approximation. |
47 | 20 | EXTRAMATH_FUNDEF(tgamma, (__TYPENAME__ __z)) { |
48 | | - return __FNAMESRC__(exp)(__FNAMESRC__(lgamma)(__z)); |
| 21 | + |
| 22 | + |
49 | 23 | } |
50 | 24 |
|
51 | 25 | #endif |
|
0 commit comments