wpa_supplicant: Adjust master for the 2.9 upgrade.
[dragonfly.git] / contrib / mpfr / src / lngamma.c
blobc400bd8d3af02c899513b60beccc5af6ad809cfb
1 /* mpfr_lngamma -- lngamma function
3 Copyright 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 Free Software Foundation, Inc.
4 Contributed by the AriC and Caramel projects, INRIA.
6 This file is part of the GNU MPFR Library.
8 The GNU MPFR Library is free software; you can redistribute it and/or modify
9 it under the terms of the GNU Lesser General Public License as published by
10 the Free Software Foundation; either version 3 of the License, or (at your
11 option) any later version.
13 The GNU MPFR Library is distributed in the hope that it will be useful, but
14 WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
15 or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
16 License for more details.
18 You should have received a copy of the GNU Lesser General Public License
19 along with the GNU MPFR Library; see the file COPYING.LESSER. If not, see
20 http://www.gnu.org/licenses/ or write to the Free Software Foundation, Inc.,
21 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. */
23 #define MPFR_NEED_LONGLONG_H
24 #include "mpfr-impl.h"
26 /* given a precision p, return alpha, such that the argument reduction
27 will use k = alpha*p*log(2).
29 Warning: we should always have alpha >= log(2)/(2Pi) ~ 0.11,
30 and the smallest value of alpha multiplied by the smallest working
31 precision should be >= 4.
33 static void
34 mpfr_gamma_alpha (mpfr_t s, mpfr_prec_t p)
36 if (p <= 100)
37 mpfr_set_ui_2exp (s, 614, -10, MPFR_RNDN); /* about 0.6 */
38 else if (p <= 500)
39 mpfr_set_ui_2exp (s, 819, -10, MPFR_RNDN); /* about 0.8 */
40 else if (p <= 1000)
41 mpfr_set_ui_2exp (s, 1331, -10, MPFR_RNDN); /* about 1.3 */
42 else if (p <= 2000)
43 mpfr_set_ui_2exp (s, 1741, -10, MPFR_RNDN); /* about 1.7 */
44 else if (p <= 5000)
45 mpfr_set_ui_2exp (s, 2253, -10, MPFR_RNDN); /* about 2.2 */
46 else if (p <= 10000)
47 mpfr_set_ui_2exp (s, 3482, -10, MPFR_RNDN); /* about 3.4 */
48 else
49 mpfr_set_ui_2exp (s, 9, -1, MPFR_RNDN); /* 4.5 */
52 #ifdef IS_GAMMA
54 /* This function is called in case of intermediate overflow/underflow.
55 The s1 and s2 arguments are temporary MPFR numbers, having the
56 working precision. If the result could be determined, then the
57 flags are updated via pexpo, y is set to the result, and the
58 (non-zero) ternary value is returned. Otherwise 0 is returned
59 in order to perform the next Ziv iteration. */
60 static int
61 mpfr_explgamma (mpfr_ptr y, mpfr_srcptr x, mpfr_save_expo_t *pexpo,
62 mpfr_ptr s1, mpfr_ptr s2, mpfr_rnd_t rnd)
64 mpfr_t t1, t2;
65 int inex1, inex2, sign;
66 MPFR_BLOCK_DECL (flags1);
67 MPFR_BLOCK_DECL (flags2);
68 MPFR_GROUP_DECL (group);
70 MPFR_BLOCK (flags1, inex1 = mpfr_lgamma (s1, &sign, x, MPFR_RNDD));
71 MPFR_ASSERTN (inex1 != 0);
72 /* s1 = RNDD(lngamma(x)), inexact */
73 if (MPFR_UNLIKELY (MPFR_OVERFLOW (flags1)))
75 if (MPFR_SIGN (s1) > 0)
77 MPFR_SAVE_EXPO_UPDATE_FLAGS (*pexpo, MPFR_FLAGS_OVERFLOW);
78 return mpfr_overflow (y, rnd, sign);
80 else
82 MPFR_SAVE_EXPO_UPDATE_FLAGS (*pexpo, MPFR_FLAGS_UNDERFLOW);
83 return mpfr_underflow (y, rnd == MPFR_RNDN ? MPFR_RNDZ : rnd, sign);
87 mpfr_set (s2, s1, MPFR_RNDN); /* exact */
88 mpfr_nextabove (s2); /* v = RNDU(lngamma(z0)) */
90 if (sign < 0)
91 rnd = MPFR_INVERT_RND (rnd); /* since the result with be negated */
92 MPFR_GROUP_INIT_2 (group, MPFR_PREC (y), t1, t2);
93 MPFR_BLOCK (flags1, inex1 = mpfr_exp (t1, s1, rnd));
94 MPFR_BLOCK (flags2, inex2 = mpfr_exp (t2, s2, rnd));
95 /* t1 is the rounding with mode 'rnd' of a lower bound on |Gamma(x)|,
96 t2 is the rounding with mode 'rnd' of an upper bound, thus if both
97 are equal, so is the wanted result. If t1 and t2 differ or the flags
98 differ, at some point of Ziv's loop they should agree. */
99 if (mpfr_equal_p (t1, t2) && flags1 == flags2)
101 MPFR_ASSERTN ((inex1 > 0 && inex2 > 0) || (inex1 < 0 && inex2 < 0));
102 mpfr_set4 (y, t1, MPFR_RNDN, sign); /* exact */
103 if (sign < 0)
104 inex1 = - inex1;
105 MPFR_SAVE_EXPO_UPDATE_FLAGS (*pexpo, flags1);
107 else
108 inex1 = 0; /* couldn't determine the result */
109 MPFR_GROUP_CLEAR (group);
111 return inex1;
114 #else
116 static int
117 unit_bit (mpfr_srcptr x)
119 mpfr_exp_t expo;
120 mpfr_prec_t prec;
121 mp_limb_t x0;
123 expo = MPFR_GET_EXP (x);
124 if (expo <= 0)
125 return 0; /* |x| < 1 */
127 prec = MPFR_PREC (x);
128 if (expo > prec)
129 return 0; /* y is a multiple of 2^(expo-prec), thus an even integer */
131 /* Now, the unit bit is represented. */
133 prec = MPFR_PREC2LIMBS (prec) * GMP_NUMB_BITS - expo;
134 /* number of represented fractional bits (including the trailing 0's) */
136 x0 = *(MPFR_MANT (x) + prec / GMP_NUMB_BITS);
137 /* limb containing the unit bit */
139 return (x0 >> (prec % GMP_NUMB_BITS)) & 1;
142 #endif
144 /* lngamma(x) = log(gamma(x)).
145 We use formula [6.1.40] from Abramowitz&Stegun:
146 lngamma(z) = (z-1/2)*log(z) - z + 1/2*log(2*Pi)
147 + sum (Bernoulli[2m]/(2m)/(2m-1)/z^(2m-1),m=1..infinity)
148 According to [6.1.42], if the sum is truncated after m=n, the error
149 R_n(z) is bounded by |B[2n+2]|*K(z)/(2n+1)/(2n+2)/|z|^(2n+1)
150 where K(z) = max (z^2/(u^2+z^2)) for u >= 0.
151 For z real, |K(z)| <= 1 thus R_n(z) is bounded by the first neglected term.
153 #ifdef IS_GAMMA
154 #define GAMMA_FUNC mpfr_gamma_aux
155 #else
156 #define GAMMA_FUNC mpfr_lngamma_aux
157 #endif
159 static int
160 GAMMA_FUNC (mpfr_ptr y, mpfr_srcptr z0, mpfr_rnd_t rnd)
162 mpfr_prec_t precy, w; /* working precision */
163 mpfr_t s, t, u, v, z;
164 unsigned long m, k, maxm;
165 mpz_t *INITIALIZED(B); /* variable B declared as initialized */
166 int compared;
167 int inexact = 0; /* 0 means: result y not set yet */
168 mpfr_exp_t err_s, err_t;
169 unsigned long Bm = 0; /* number of allocated B[] */
170 unsigned long oldBm;
171 double d;
172 MPFR_SAVE_EXPO_DECL (expo);
173 MPFR_ZIV_DECL (loop);
175 compared = mpfr_cmp_ui (z0, 1);
177 MPFR_SAVE_EXPO_MARK (expo);
179 #ifndef IS_GAMMA /* lngamma or lgamma */
180 if (compared == 0 || (compared > 0 && mpfr_cmp_ui (z0, 2) == 0))
182 MPFR_SAVE_EXPO_FREE (expo);
183 return mpfr_set_ui (y, 0, MPFR_RNDN); /* lngamma(1 or 2) = +0 */
186 /* Deal here with tiny inputs. We have for -0.3 <= x <= 0.3:
187 - log|x| - gamma*x <= log|gamma(x)| <= - log|x| - gamma*x + x^2 */
188 if (MPFR_EXP(z0) <= - (mpfr_exp_t) MPFR_PREC(y))
190 mpfr_t l, h, g;
191 int ok, inex1, inex2;
192 mpfr_prec_t prec = MPFR_PREC(y) + 14;
193 MPFR_ZIV_DECL (loop);
195 MPFR_ZIV_INIT (loop, prec);
198 mpfr_init2 (l, prec);
199 if (MPFR_IS_POS(z0))
201 mpfr_log (l, z0, MPFR_RNDU); /* upper bound for log(z0) */
202 mpfr_init2 (h, MPFR_PREC(l));
204 else
206 mpfr_init2 (h, MPFR_PREC(z0));
207 mpfr_neg (h, z0, MPFR_RNDN); /* exact */
208 mpfr_log (l, h, MPFR_RNDU); /* upper bound for log(-z0) */
209 mpfr_set_prec (h, MPFR_PREC(l));
211 mpfr_neg (l, l, MPFR_RNDD); /* lower bound for -log(|z0|) */
212 mpfr_set (h, l, MPFR_RNDD); /* exact */
213 mpfr_nextabove (h); /* upper bound for -log(|z0|), avoids two calls
214 to mpfr_log */
215 mpfr_init2 (g, MPFR_PREC(l));
216 /* if z0>0, we need an upper approximation of Euler's constant
217 for the left bound */
218 mpfr_const_euler (g, MPFR_IS_POS(z0) ? MPFR_RNDU : MPFR_RNDD);
219 mpfr_mul (g, g, z0, MPFR_RNDD);
220 mpfr_sub (l, l, g, MPFR_RNDD);
221 mpfr_const_euler (g, MPFR_IS_POS(z0) ? MPFR_RNDD : MPFR_RNDU); /* cached */
222 mpfr_mul (g, g, z0, MPFR_RNDU);
223 mpfr_sub (h, h, g, MPFR_RNDD);
224 mpfr_mul (g, z0, z0, MPFR_RNDU);
225 mpfr_add (h, h, g, MPFR_RNDU);
226 inex1 = mpfr_prec_round (l, MPFR_PREC(y), rnd);
227 inex2 = mpfr_prec_round (h, MPFR_PREC(y), rnd);
228 /* Caution: we not only need l = h, but both inexact flags should
229 agree. Indeed, one of the inexact flags might be zero. In that
230 case if we assume lngamma(z0) cannot be exact, the other flag
231 should be correct. We are conservative here and request that both
232 inexact flags agree. */
233 ok = SAME_SIGN (inex1, inex2) && mpfr_cmp (l, h) == 0;
234 if (ok)
235 mpfr_set (y, h, rnd); /* exact */
236 mpfr_clear (l);
237 mpfr_clear (h);
238 mpfr_clear (g);
239 if (ok)
241 MPFR_ZIV_FREE (loop);
242 MPFR_SAVE_EXPO_FREE (expo);
243 return mpfr_check_range (y, inex1, rnd);
245 /* since we have log|gamma(x)| = - log|x| - gamma*x + O(x^2),
246 if x ~ 2^(-n), then we have a n-bit approximation, thus
247 we can try again with a working precision of n bits,
248 especially when n >> PREC(y).
249 Otherwise we would use the reflection formula evaluating x-1,
250 which would need precision n. */
251 MPFR_ZIV_NEXT (loop, prec);
253 while (prec <= -MPFR_EXP(z0));
254 MPFR_ZIV_FREE (loop);
256 #endif
258 precy = MPFR_PREC(y);
260 mpfr_init2 (s, MPFR_PREC_MIN);
261 mpfr_init2 (t, MPFR_PREC_MIN);
262 mpfr_init2 (u, MPFR_PREC_MIN);
263 mpfr_init2 (v, MPFR_PREC_MIN);
264 mpfr_init2 (z, MPFR_PREC_MIN);
266 if (compared < 0)
268 mpfr_exp_t err_u;
270 /* use reflection formula:
271 gamma(x) = Pi*(x-1)/sin(Pi*(2-x))/gamma(2-x)
272 thus lngamma(x) = log(Pi*(x-1)/sin(Pi*(2-x))) - lngamma(2-x) */
274 w = precy + MPFR_INT_CEIL_LOG2 (precy);
275 w += MPFR_INT_CEIL_LOG2 (w) + 14;
276 MPFR_ZIV_INIT (loop, w);
277 while (1)
279 MPFR_ASSERTD(w >= 3);
280 mpfr_set_prec (s, w);
281 mpfr_set_prec (t, w);
282 mpfr_set_prec (u, w);
283 mpfr_set_prec (v, w);
284 /* In the following, we write r for a real of absolute value
285 at most 2^(-w). Different instances of r may represent different
286 values. */
287 mpfr_ui_sub (s, 2, z0, MPFR_RNDD); /* s = (2-z0) * (1+2r) >= 1 */
288 mpfr_const_pi (t, MPFR_RNDN); /* t = Pi * (1+r) */
289 mpfr_lngamma (u, s, MPFR_RNDN); /* lngamma(2-x) */
290 /* Let s = (2-z0) + h. By construction, -(2-z0)*2^(1-w) <= h <= 0.
291 We have lngamma(s) = lngamma(2-z0) + h*Psi(z), z in [2-z0+h,2-z0].
292 Since 2-z0+h = s >= 1 and |Psi(x)| <= max(1,log(x)) for x >= 1,
293 the error on u is bounded by
294 ulp(u)/2 + (2-z0)*max(1,log(2-z0))*2^(1-w)
295 = (1/2 + (2-z0)*max(1,log(2-z0))*2^(1-E(u))) ulp(u) */
296 d = (double) MPFR_GET_EXP(s) * 0.694; /* upper bound for log(2-z0) */
297 err_u = MPFR_GET_EXP(s) + __gmpfr_ceil_log2 (d) + 1 - MPFR_GET_EXP(u);
298 err_u = (err_u >= 0) ? err_u + 1 : 0;
299 /* now the error on u is bounded by 2^err_u ulps */
301 mpfr_mul (s, s, t, MPFR_RNDN); /* Pi*(2-x) * (1+r)^4 */
302 err_s = MPFR_GET_EXP(s); /* 2-x <= 2^err_s */
303 mpfr_sin (s, s, MPFR_RNDN); /* sin(Pi*(2-x)) */
304 /* the error on s is bounded by 1/2*ulp(s) + [(1+2^(-w))^4-1]*(2-x)
305 <= 1/2*ulp(s) + 5*2^(-w)*(2-x) for w >= 3
306 <= (1/2 + 5 * 2^(-E(s)) * (2-x)) ulp(s) */
307 err_s += 3 - MPFR_GET_EXP(s);
308 err_s = (err_s >= 0) ? err_s + 1 : 0;
309 /* the error on s is bounded by 2^err_s ulp(s), thus by
310 2^(err_s+1)*2^(-w)*|s| since ulp(s) <= 2^(1-w)*|s|.
311 Now n*2^(-w) can always be written |(1+r)^n-1| for some
312 |r|<=2^(-w), thus taking n=2^(err_s+1) we see that
313 |S - s| <= |(1+r)^(2^(err_s+1))-1| * |s|, where S is the
314 true value.
315 In fact if ulp(s) <= ulp(S) the same inequality holds for
316 |S| instead of |s| in the right hand side, i.e., we can
317 write s = (1+r)^(2^(err_s+1)) * S.
318 But if ulp(S) < ulp(s), we need to add one ``bit'' to the error,
319 to get s = (1+r)^(2^(err_s+2)) * S. This is true since with
320 E = n*2^(-w) we have |s - S| <= E * |s|, thus
321 |s - S| <= E/(1-E) * |S|.
322 Now E/(1-E) is bounded by 2E as long as E<=1/2,
323 and 2E can be written (1+r)^(2n)-1 as above.
325 err_s += 2; /* exponent of relative error */
327 mpfr_sub_ui (v, z0, 1, MPFR_RNDN); /* v = (x-1) * (1+r) */
328 mpfr_mul (v, v, t, MPFR_RNDN); /* v = Pi*(x-1) * (1+r)^3 */
329 mpfr_div (v, v, s, MPFR_RNDN); /* Pi*(x-1)/sin(Pi*(2-x)) */
330 mpfr_abs (v, v, MPFR_RNDN);
331 /* (1+r)^(3+2^err_s+1) */
332 err_s = (err_s <= 1) ? 3 : err_s + 1;
333 /* now (1+r)^M with M <= 2^err_s */
334 mpfr_log (v, v, MPFR_RNDN);
335 /* log(v*(1+e)) = log(v)+log(1+e) where |e| <= 2^(err_s-w).
336 Since |log(1+e)| <= 2*e for |e| <= 1/4, the error on v is
337 bounded by ulp(v)/2 + 2^(err_s+1-w). */
338 if (err_s + 2 > w)
340 w += err_s + 2;
342 else
344 err_s += 1 - MPFR_GET_EXP(v);
345 err_s = (err_s >= 0) ? err_s + 1 : 0;
346 /* the error on v is bounded by 2^err_s ulps */
347 err_u += MPFR_GET_EXP(u); /* absolute error on u */
348 err_s += MPFR_GET_EXP(v); /* absolute error on v */
349 mpfr_sub (s, v, u, MPFR_RNDN);
350 /* the total error on s is bounded by ulp(s)/2 + 2^(err_u-w)
351 + 2^(err_s-w) <= ulp(s)/2 + 2^(max(err_u,err_s)+1-w) */
352 err_s = (err_s >= err_u) ? err_s : err_u;
353 err_s += 1 - MPFR_GET_EXP(s); /* error is 2^err_s ulp(s) */
354 err_s = (err_s >= 0) ? err_s + 1 : 0;
355 if (mpfr_can_round (s, w - err_s, MPFR_RNDN, MPFR_RNDZ, precy
356 + (rnd == MPFR_RNDN)))
357 goto end;
359 MPFR_ZIV_NEXT (loop, w);
361 MPFR_ZIV_FREE (loop);
364 /* now z0 > 1 */
366 MPFR_ASSERTD (compared > 0);
368 /* since k is O(w), the value of log(z0*...*(z0+k-1)) is about w*log(w),
369 so there is a cancellation of ~log(w) in the argument reconstruction */
370 w = precy + MPFR_INT_CEIL_LOG2 (precy);
371 w += MPFR_INT_CEIL_LOG2 (w) + 13;
372 MPFR_ZIV_INIT (loop, w);
373 while (1)
375 MPFR_ASSERTD (w >= 3);
377 /* argument reduction: we compute gamma(z0 + k), where the series
378 has error term B_{2n}/(z0+k)^(2n) ~ (n/(Pi*e*(z0+k)))^(2n)
379 and we need k steps of argument reconstruction. Assuming k is large
380 with respect to z0, and k = n, we get 1/(Pi*e)^(2n) ~ 2^(-w), i.e.,
381 k ~ w*log(2)/2/log(Pi*e) ~ 0.1616 * w.
382 However, since the series is more expensive to compute, the optimal
383 value seems to be k ~ 4.5 * w experimentally. */
384 mpfr_set_prec (s, 53);
385 mpfr_gamma_alpha (s, w);
386 mpfr_set_ui_2exp (s, 9, -1, MPFR_RNDU);
387 mpfr_mul_ui (s, s, w, MPFR_RNDU);
388 if (mpfr_cmp (z0, s) < 0)
390 mpfr_sub (s, s, z0, MPFR_RNDU);
391 k = mpfr_get_ui (s, MPFR_RNDU);
392 if (k < 3)
393 k = 3;
395 else
396 k = 3;
398 mpfr_set_prec (s, w);
399 mpfr_set_prec (t, w);
400 mpfr_set_prec (u, w);
401 mpfr_set_prec (v, w);
402 mpfr_set_prec (z, w);
404 mpfr_add_ui (z, z0, k, MPFR_RNDN);
405 /* z = (z0+k)*(1+t1) with |t1| <= 2^(-w) */
407 /* z >= 4 ensures the relative error on log(z) is small,
408 and also (z-1/2)*log(z)-z >= 0 */
409 MPFR_ASSERTD (mpfr_cmp_ui (z, 4) >= 0);
411 mpfr_log (s, z, MPFR_RNDN); /* log(z) */
412 /* we have s = log((z0+k)*(1+t1))*(1+t2) with |t1|, |t2| <= 2^(-w).
413 Since w >= 2 and z0+k >= 4, we can write log((z0+k)*(1+t1))
414 = log(z0+k) * (1+t3) with |t3| <= 2^(-w), thus we have
415 s = log(z0+k) * (1+t4)^2 with |t4| <= 2^(-w) */
416 mpfr_mul_2ui (t, z, 1, MPFR_RNDN); /* t = 2z * (1+t5) */
417 mpfr_sub_ui (t, t, 1, MPFR_RNDN); /* t = 2z-1 * (1+t6)^3 */
418 /* since we can write 2z*(1+t5) = (2z-1)*(1+t5') with
419 t5' = 2z/(2z-1) * t5, thus |t5'| <= 8/7 * t5 */
420 mpfr_mul (s, s, t, MPFR_RNDN); /* (2z-1)*log(z) * (1+t7)^6 */
421 mpfr_div_2ui (s, s, 1, MPFR_RNDN); /* (z-1/2)*log(z) * (1+t7)^6 */
422 mpfr_sub (s, s, z, MPFR_RNDN); /* (z-1/2)*log(z)-z */
423 /* s = [(z-1/2)*log(z)-z]*(1+u)^14, s >= 1/2 */
425 mpfr_ui_div (u, 1, z, MPFR_RNDN); /* 1/z * (1+u), u <= 1/4 since z >= 4 */
427 /* the first term is B[2]/2/z = 1/12/z: t=1/12/z, C[2]=1 */
428 mpfr_div_ui (t, u, 12, MPFR_RNDN); /* 1/(12z) * (1+u)^2, t <= 3/128 */
429 mpfr_set (v, t, MPFR_RNDN); /* (1+u)^2, v < 2^(-5) */
430 mpfr_add (s, s, v, MPFR_RNDN); /* (1+u)^15 */
432 mpfr_mul (u, u, u, MPFR_RNDN); /* 1/z^2 * (1+u)^3 */
434 if (Bm == 0)
436 B = mpfr_bernoulli_internal ((mpz_t *) 0, 0);
437 B = mpfr_bernoulli_internal (B, 1);
438 Bm = 2;
441 /* m <= maxm ensures that 2*m*(2*m+1) <= ULONG_MAX */
442 maxm = 1UL << (GMP_NUMB_BITS / 2 - 1);
444 /* s:(1+u)^15, t:(1+u)^2, t <= 3/128 */
446 for (m = 2; MPFR_GET_EXP(v) + (mpfr_exp_t) w >= MPFR_GET_EXP(s); m++)
448 mpfr_mul (t, t, u, MPFR_RNDN); /* (1+u)^(10m-14) */
449 if (m <= maxm)
451 mpfr_mul_ui (t, t, 2*(m-1)*(2*m-3), MPFR_RNDN);
452 mpfr_div_ui (t, t, 2*m*(2*m-1), MPFR_RNDN);
453 mpfr_div_ui (t, t, 2*m*(2*m+1), MPFR_RNDN);
455 else
457 mpfr_mul_ui (t, t, 2*(m-1), MPFR_RNDN);
458 mpfr_mul_ui (t, t, 2*m-3, MPFR_RNDN);
459 mpfr_div_ui (t, t, 2*m, MPFR_RNDN);
460 mpfr_div_ui (t, t, 2*m-1, MPFR_RNDN);
461 mpfr_div_ui (t, t, 2*m, MPFR_RNDN);
462 mpfr_div_ui (t, t, 2*m+1, MPFR_RNDN);
464 /* (1+u)^(10m-8) */
465 /* invariant: t=1/(2m)/(2m-1)/z^(2m-1)/(2m+1)! */
466 if (Bm <= m)
468 B = mpfr_bernoulli_internal (B, m); /* B[2m]*(2m+1)!, exact */
469 Bm ++;
471 mpfr_mul_z (v, t, B[m], MPFR_RNDN); /* (1+u)^(10m-7) */
472 MPFR_ASSERTD(MPFR_GET_EXP(v) <= - (2 * m + 3));
473 mpfr_add (s, s, v, MPFR_RNDN);
475 /* m <= 1/2*Pi*e*z ensures that |v[m]| < 1/2^(2m+3) */
476 MPFR_ASSERTD ((double) m <= 4.26 * mpfr_get_d (z, MPFR_RNDZ));
478 /* We have sum([(1+u)^(10m-7)-1]*1/2^(2m+3), m=2..infinity)
479 <= 1.46*u for u <= 2^(-3).
480 We have 0 < lngamma(z) - [(z - 1/2) ln(z) - z + 1/2 ln(2 Pi)] < 0.021
481 for z >= 4, thus since the initial s >= 0.85, the different values of
482 s differ by at most one binade, and the total rounding error on s
483 in the for-loop is bounded by 2*(m-1)*ulp(final_s).
484 The error coming from the v's is bounded by
485 1.46*2^(-w) <= 2*ulp(final_s).
486 Thus the total error so far is bounded by [(1+u)^15-1]*s+2m*ulp(s)
487 <= (2m+47)*ulp(s).
488 Taking into account the truncation error (which is bounded by the last
489 term v[] according to 6.1.42 in A&S), the bound is (2m+48)*ulp(s).
492 /* add 1/2*log(2*Pi) and subtract log(z0*(z0+1)*...*(z0+k-1)) */
493 mpfr_const_pi (v, MPFR_RNDN); /* v = Pi*(1+u) */
494 mpfr_mul_2ui (v, v, 1, MPFR_RNDN); /* v = 2*Pi * (1+u) */
495 if (k)
497 unsigned long l;
498 mpfr_set (t, z0, MPFR_RNDN); /* t = z0*(1+u) */
499 for (l = 1; l < k; l++)
501 mpfr_add_ui (u, z0, l, MPFR_RNDN); /* u = (z0+l)*(1+u) */
502 mpfr_mul (t, t, u, MPFR_RNDN); /* (1+u)^(2l+1) */
504 /* now t: (1+u)^(2k-1) */
505 /* instead of computing log(sqrt(2*Pi)/t), we compute
506 1/2*log(2*Pi/t^2), which trades a square root for a square */
507 mpfr_mul (t, t, t, MPFR_RNDN); /* (z0*...*(z0+k-1))^2, (1+u)^(4k-1) */
508 mpfr_div (v, v, t, MPFR_RNDN);
509 /* 2*Pi/(z0*...*(z0+k-1))^2 (1+u)^(4k+1) */
511 #ifdef IS_GAMMA
512 err_s = MPFR_GET_EXP(s);
513 mpfr_exp (s, s, MPFR_RNDN);
514 /* If s is +Inf, we compute exp(lngamma(z0)). */
515 if (mpfr_inf_p (s))
517 inexact = mpfr_explgamma (y, z0, &expo, s, t, rnd);
518 if (inexact)
519 goto end0;
520 else
521 goto ziv_next;
523 /* before the exponential, we have s = s0 + h where
524 |h| <= (2m+48)*ulp(s), thus exp(s0) = exp(s) * exp(-h).
525 For |h| <= 1/4, we have |exp(h)-1| <= 1.2*|h| thus
526 |exp(s) - exp(s0)| <= 1.2 * exp(s) * (2m+48)* 2^(EXP(s)-w). */
527 d = 1.2 * (2.0 * (double) m + 48.0);
528 /* the error on s is bounded by d*2^err_s * 2^(-w) */
529 mpfr_sqrt (t, v, MPFR_RNDN);
530 /* let v0 be the exact value of v. We have v = v0*(1+u)^(4k+1),
531 thus t = sqrt(v0)*(1+u)^(2k+3/2). */
532 mpfr_mul (s, s, t, MPFR_RNDN);
533 /* the error on input s is bounded by (1+u)^(d*2^err_s),
534 and that on t is (1+u)^(2k+3/2), thus the
535 total error is (1+u)^(d*2^err_s+2k+5/2) */
536 err_s += __gmpfr_ceil_log2 (d);
537 err_t = __gmpfr_ceil_log2 (2.0 * (double) k + 2.5);
538 err_s = (err_s >= err_t) ? err_s + 1 : err_t + 1;
539 #else
540 mpfr_log (t, v, MPFR_RNDN);
541 /* let v0 be the exact value of v. We have v = v0*(1+u)^(4k+1),
542 thus log(v) = log(v0) + (4k+1)*log(1+u). Since |log(1+u)/u| <= 1.07
543 for |u| <= 2^(-3), the absolute error on log(v) is bounded by
544 1.07*(4k+1)*u, and the rounding error by ulp(t). */
545 mpfr_div_2ui (t, t, 1, MPFR_RNDN);
546 /* the error on t is now bounded by ulp(t) + 0.54*(4k+1)*2^(-w).
547 We have sqrt(2*Pi)/(z0*(z0+1)*...*(z0+k-1)) <= sqrt(2*Pi)/k! <= 0.5
548 since k>=3, thus t <= -0.5 and ulp(t) >= 2^(-w).
549 Thus the error on t is bounded by (2.16*k+1.54)*ulp(t). */
550 err_t = MPFR_GET_EXP(t) + (mpfr_exp_t)
551 __gmpfr_ceil_log2 (2.2 * (double) k + 1.6);
552 err_s = MPFR_GET_EXP(s) + (mpfr_exp_t)
553 __gmpfr_ceil_log2 (2.0 * (double) m + 48.0);
554 mpfr_add (s, s, t, MPFR_RNDN); /* this is a subtraction in fact */
555 /* the final error in ulp(s) is
556 <= 1 + 2^(err_t-EXP(s)) + 2^(err_s-EXP(s))
557 <= 2^(1+max(err_t,err_s)-EXP(s)) if err_t <> err_s
558 <= 2^(2+max(err_t,err_s)-EXP(s)) if err_t = err_s */
559 err_s = (err_t == err_s) ? 1 + err_s : ((err_t > err_s) ? err_t : err_s);
560 err_s += 1 - MPFR_GET_EXP(s);
561 #endif
562 if (MPFR_LIKELY (MPFR_CAN_ROUND (s, w - err_s, precy, rnd)))
563 break;
564 #ifdef IS_GAMMA
565 ziv_next:
566 #endif
567 MPFR_ZIV_NEXT (loop, w);
570 #ifdef IS_GAMMA
571 end0:
572 #endif
573 oldBm = Bm;
574 while (Bm--)
575 mpz_clear (B[Bm]);
576 (*__gmp_free_func) (B, oldBm * sizeof (mpz_t));
578 end:
579 if (inexact == 0)
580 inexact = mpfr_set (y, s, rnd);
581 MPFR_ZIV_FREE (loop);
583 mpfr_clear (s);
584 mpfr_clear (t);
585 mpfr_clear (u);
586 mpfr_clear (v);
587 mpfr_clear (z);
589 MPFR_SAVE_EXPO_FREE (expo);
590 return mpfr_check_range (y, inexact, rnd);
593 #ifndef IS_GAMMA
596 mpfr_lngamma (mpfr_ptr y, mpfr_srcptr x, mpfr_rnd_t rnd)
598 int inex;
600 MPFR_LOG_FUNC
601 (("x[%Pu]=%.*Rg rnd=%d", mpfr_get_prec (x), mpfr_log_prec, x, rnd),
602 ("y[%Pu]=%.*Rg inexact=%d",
603 mpfr_get_prec (y), mpfr_log_prec, y, inex));
605 /* special cases */
606 if (MPFR_UNLIKELY (MPFR_IS_SINGULAR (x)))
608 if (MPFR_IS_NAN (x) || MPFR_IS_NEG (x))
610 MPFR_SET_NAN (y);
611 MPFR_RET_NAN;
613 else /* lngamma(+Inf) = lngamma(+0) = +Inf */
615 if (MPFR_IS_ZERO (x))
616 mpfr_set_divby0 ();
617 MPFR_SET_INF (y);
618 MPFR_SET_POS (y);
619 MPFR_RET (0); /* exact */
623 /* if x < 0 and -2k-1 <= x <= -2k, then lngamma(x) = NaN */
624 if (MPFR_IS_NEG (x) && (unit_bit (x) == 0 || mpfr_integer_p (x)))
626 MPFR_SET_NAN (y);
627 MPFR_RET_NAN;
630 inex = mpfr_lngamma_aux (y, x, rnd);
631 return inex;
635 mpfr_lgamma (mpfr_ptr y, int *signp, mpfr_srcptr x, mpfr_rnd_t rnd)
637 int inex;
639 MPFR_LOG_FUNC
640 (("x[%Pu]=%.*Rg rnd=%d", mpfr_get_prec (x), mpfr_log_prec, x, rnd),
641 ("y[%Pu]=%.*Rg signp=%d inexact=%d",
642 mpfr_get_prec (y), mpfr_log_prec, y, *signp, inex));
644 *signp = 1; /* most common case */
646 if (MPFR_UNLIKELY (MPFR_IS_SINGULAR (x)))
648 if (MPFR_IS_NAN (x))
650 MPFR_SET_NAN (y);
651 MPFR_RET_NAN;
653 else
655 if (MPFR_IS_ZERO (x))
656 mpfr_set_divby0 ();
657 *signp = MPFR_INT_SIGN (x);
658 MPFR_SET_INF (y);
659 MPFR_SET_POS (y);
660 MPFR_RET (0);
664 if (MPFR_IS_NEG (x))
666 if (mpfr_integer_p (x))
668 MPFR_SET_INF (y);
669 MPFR_SET_POS (y);
670 mpfr_set_divby0 ();
671 MPFR_RET (0);
674 if (unit_bit (x) == 0)
675 *signp = -1;
677 /* For tiny negative x, we have gamma(x) = 1/x - euler + O(x),
678 thus |gamma(x)| = -1/x + euler + O(x), and
679 log |gamma(x)| = -log(-x) - euler*x + O(x^2).
680 More precisely we have for -0.4 <= x < 0:
681 -log(-x) <= log |gamma(x)| <= -log(-x) - x.
682 Since log(x) is not representable, we may have an instance of the
683 Table Maker Dilemma. The only way to ensure correct rounding is to
684 compute an interval [l,h] such that l <= -log(-x) and
685 -log(-x) - x <= h, and check whether l and h round to the same number
686 for the target precision and rounding modes. */
687 if (MPFR_EXP(x) + 1 <= - (mpfr_exp_t) MPFR_PREC(y))
688 /* since PREC(y) >= 1, this ensures EXP(x) <= -2,
689 thus |x| <= 0.25 < 0.4 */
691 mpfr_t l, h;
692 int ok, inex2;
693 mpfr_prec_t w = MPFR_PREC (y) + 14;
694 mpfr_exp_t expl;
696 while (1)
698 mpfr_init2 (l, w);
699 mpfr_init2 (h, w);
700 /* we want a lower bound on -log(-x), thus an upper bound
701 on log(-x), thus an upper bound on -x. */
702 mpfr_neg (l, x, MPFR_RNDU); /* upper bound on -x */
703 mpfr_log (l, l, MPFR_RNDU); /* upper bound for log(-x) */
704 mpfr_neg (l, l, MPFR_RNDD); /* lower bound for -log(-x) */
705 mpfr_neg (h, x, MPFR_RNDD); /* lower bound on -x */
706 mpfr_log (h, h, MPFR_RNDD); /* lower bound on log(-x) */
707 mpfr_neg (h, h, MPFR_RNDU); /* upper bound for -log(-x) */
708 mpfr_sub (h, h, x, MPFR_RNDU); /* upper bound for -log(-x) - x */
709 inex = mpfr_prec_round (l, MPFR_PREC (y), rnd);
710 inex2 = mpfr_prec_round (h, MPFR_PREC (y), rnd);
711 /* Caution: we not only need l = h, but both inexact flags
712 should agree. Indeed, one of the inexact flags might be
713 zero. In that case if we assume ln|gamma(x)| cannot be
714 exact, the other flag should be correct. We are conservative
715 here and request that both inexact flags agree. */
716 ok = SAME_SIGN (inex, inex2) && mpfr_equal_p (l, h);
717 if (ok)
718 mpfr_set (y, h, rnd); /* exact */
719 else
720 expl = MPFR_EXP (l);
721 mpfr_clear (l);
722 mpfr_clear (h);
723 if (ok)
724 return inex;
725 /* if ulp(log(-x)) <= |x| there is no reason to loop,
726 since the width of [l, h] will be at least |x| */
727 if (expl < MPFR_EXP(x) + (mpfr_exp_t) w)
728 break;
729 w += MPFR_INT_CEIL_LOG2(w) + 3;
734 inex = mpfr_lngamma_aux (y, x, rnd);
735 return inex;
738 #endif