]> git.ipfire.org Git - thirdparty/glibc.git/blame - sysdeps/ieee754/ldbl-128/e_lgammal_r.c
To fix BZ #18675, use __fstatvfs64 in __fpathconf.
[thirdparty/glibc.git] / sysdeps / ieee754 / ldbl-128 / e_lgammal_r.c
CommitLineData
a3c937ce
AJ
1/* lgammal
2 *
3 * Natural logarithm of gamma function
4 *
5 *
6 *
7 * SYNOPSIS:
8 *
9 * long double x, y, lgammal();
10 * extern int sgngam;
11 *
12 * y = lgammal(x);
13 *
14 *
15 *
16 * DESCRIPTION:
17 *
18 * Returns the base e (2.718...) logarithm of the absolute
19 * value of the gamma function of the argument.
20 * The sign (+1 or -1) of the gamma function is returned in a
21 * global (extern) variable named sgngam.
22 *
23 * The positive domain is partitioned into numerous segments for approximation.
24 * For x > 10,
25 * log gamma(x) = (x - 0.5) log(x) - x + log sqrt(2 pi) + 1/x R(1/x^2)
26 * Near the minimum at x = x0 = 1.46... the approximation is
27 * log gamma(x0 + z) = log gamma(x0) + z^2 P(z)/Q(z)
28 * for small z.
29 * Elsewhere between 0 and 10,
30 * log gamma(n + z) = log gamma(n) + z P(z)/Q(z)
31 * for various selected n and small z.
32 *
33 * The cosecant reflection formula is employed for negative arguments.
34 *
35 *
36 *
37 * ACCURACY:
38 *
39 *
40 * arithmetic domain # trials peak rms
41 * Relative error:
42 * IEEE 10, 30 100000 3.9e-34 9.8e-35
43 * IEEE 0, 10 100000 3.8e-34 5.3e-35
44 * Absolute error:
45 * IEEE -10, 0 100000 8.0e-34 8.0e-35
46 * IEEE -30, -10 100000 4.4e-34 1.0e-34
47 * IEEE -100, 100 100000 1.0e-34
48 *
49 * The absolute error criterion is the same as relative error
50 * when the function magnitude is greater than one but it is absolute
51 * when the magnitude is less than one.
52 *
53 */
54
cc7375ce
RM
55/* Copyright 2001 by Stephen L. Moshier <moshier@na-net.ornl.gov>
56
57 This library is free software; you can redistribute it and/or
58 modify it under the terms of the GNU Lesser General Public
59 License as published by the Free Software Foundation; either
60 version 2.1 of the License, or (at your option) any later version.
61
62 This library is distributed in the hope that it will be useful,
63 but WITHOUT ANY WARRANTY; without even the implied warranty of
64 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
65 Lesser General Public License for more details.
66
67 You should have received a copy of the GNU Lesser General Public
59ba27a6
PE
68 License along with this library; if not, see
69 <http://www.gnu.org/licenses/>. */
a3c937ce 70
1ed0291c
RH
71#include <math.h>
72#include <math_private.h>
9d969099
AZ
73#include <libc-internal.h>
74#include <float.h>
a3c937ce 75
9d969099
AZ
76/* BZ#16347: ldbl-128ibm uses this file as is, however the MAXLGM
77 definition overflows for IBM long double. This directive prevents the
78 overflow warnings until IBM long double version is fixed. */
1f5649f8 79static const long double PIL = 3.1415926535897932384626433832795028841972E0L;
9d969099
AZ
80DIAG_PUSH_NEEDS_COMMENT;
81DIAG_IGNORE_NEEDS_COMMENT (4.6, "-Woverflow");
1f5649f8 82static const long double MAXLGM = 1.0485738685148938358098967157129705071571E4928L;
9d969099 83DIAG_POP_NEEDS_COMMENT;
1f5649f8
UD
84static const long double one = 1.0L;
85static const long double zero = 0.0L;
9d969099 86static const long double huge = LDBL_MAX;
a3c937ce
AJ
87
88/* log gamma(x) = ( x - 0.5 ) * log(x) - x + LS2PI + 1/x P(1/x^2)
89 1/x <= 0.0741 (x >= 13.495...)
90 Peak relative error 1.5e-36 */
1f5649f8 91static const long double ls2pi = 9.1893853320467274178032973640561763986140E-1L;
a3c937ce 92#define NRASY 12
1f5649f8 93static const long double RASY[NRASY + 1] =
a3c937ce
AJ
94{
95 8.333333333333333333333333333310437112111E-2L,
96 -2.777777777777777777777774789556228296902E-3L,
97 7.936507936507936507795933938448586499183E-4L,
98 -5.952380952380952041799269756378148574045E-4L,
99 8.417508417507928904209891117498524452523E-4L,
100 -1.917526917481263997778542329739806086290E-3L,
101 6.410256381217852504446848671499409919280E-3L,
102 -2.955064066900961649768101034477363301626E-2L,
103 1.796402955865634243663453415388336954675E-1L,
104 -1.391522089007758553455753477688592767741E0L,
105 1.326130089598399157988112385013829305510E1L,
106 -1.420412699593782497803472576479997819149E2L,
107 1.218058922427762808938869872528846787020E3L
108};
109
110
111/* log gamma(x+13) = log gamma(13) + x P(x)/Q(x)
112 -0.5 <= x <= 0.5
113 12.5 <= x+13 <= 13.5
114 Peak relative error 1.1e-36 */
1f5649f8
UD
115static const long double lgam13a = 1.9987213134765625E1L;
116static const long double lgam13b = 1.3608962611495173623870550785125024484248E-6L;
a3c937ce 117#define NRN13 7
1f5649f8 118static const long double RN13[NRN13 + 1] =
a3c937ce
AJ
119{
120 8.591478354823578150238226576156275285700E11L,
121 2.347931159756482741018258864137297157668E11L,
122 2.555408396679352028680662433943000804616E10L,
123 1.408581709264464345480765758902967123937E9L,
124 4.126759849752613822953004114044451046321E7L,
125 6.133298899622688505854211579222889943778E5L,
126 3.929248056293651597987893340755876578072E3L,
127 6.850783280018706668924952057996075215223E0L
128};
129#define NRD13 6
1f5649f8 130static const long double RD13[NRD13 + 1] =
a3c937ce
AJ
131{
132 3.401225382297342302296607039352935541669E11L,
133 8.756765276918037910363513243563234551784E10L,
134 8.873913342866613213078554180987647243903E9L,
135 4.483797255342763263361893016049310017973E8L,
136 1.178186288833066430952276702931512870676E7L,
137 1.519928623743264797939103740132278337476E5L,
138 7.989298844938119228411117593338850892311E2L
139 /* 1.0E0L */
140};
141
142
143/* log gamma(x+12) = log gamma(12) + x P(x)/Q(x)
144 -0.5 <= x <= 0.5
145 11.5 <= x+12 <= 12.5
146 Peak relative error 4.1e-36 */
1f5649f8
UD
147static const long double lgam12a = 1.75023040771484375E1L;
148static const long double lgam12b = 3.7687254483392876529072161996717039575982E-6L;
a3c937ce 149#define NRN12 7
1f5649f8 150static const long double RN12[NRN12 + 1] =
a3c937ce
AJ
151{
152 4.709859662695606986110997348630997559137E11L,
153 1.398713878079497115037857470168777995230E11L,
154 1.654654931821564315970930093932954900867E10L,
155 9.916279414876676861193649489207282144036E8L,
156 3.159604070526036074112008954113411389879E7L,
157 5.109099197547205212294747623977502492861E5L,
158 3.563054878276102790183396740969279826988E3L,
159 6.769610657004672719224614163196946862747E0L
160};
161#define NRD12 6
1f5649f8 162static const long double RD12[NRD12 + 1] =
a3c937ce
AJ
163{
164 1.928167007860968063912467318985802726613E11L,
165 5.383198282277806237247492369072266389233E10L,
166 5.915693215338294477444809323037871058363E9L,
167 3.241438287570196713148310560147925781342E8L,
168 9.236680081763754597872713592701048455890E6L,
169 1.292246897881650919242713651166596478850E5L,
170 7.366532445427159272584194816076600211171E2L
171 /* 1.0E0L */
172};
173
174
175/* log gamma(x+11) = log gamma(11) + x P(x)/Q(x)
176 -0.5 <= x <= 0.5
177 10.5 <= x+11 <= 11.5
178 Peak relative error 1.8e-35 */
1f5649f8
UD
179static const long double lgam11a = 1.5104400634765625E1L;
180static const long double lgam11b = 1.1938309890295225709329251070371882250744E-5L;
a3c937ce 181#define NRN11 7
1f5649f8 182static const long double RN11[NRN11 + 1] =
a3c937ce
AJ
183{
184 2.446960438029415837384622675816736622795E11L,
185 7.955444974446413315803799763901729640350E10L,
186 1.030555327949159293591618473447420338444E10L,
187 6.765022131195302709153994345470493334946E8L,
188 2.361892792609204855279723576041468347494E7L,
189 4.186623629779479136428005806072176490125E5L,
190 3.202506022088912768601325534149383594049E3L,
191 6.681356101133728289358838690666225691363E0L
192};
193#define NRD11 6
1f5649f8 194static const long double RD11[NRD11 + 1] =
a3c937ce
AJ
195{
196 1.040483786179428590683912396379079477432E11L,
197 3.172251138489229497223696648369823779729E10L,
198 3.806961885984850433709295832245848084614E9L,
199 2.278070344022934913730015420611609620171E8L,
200 7.089478198662651683977290023829391596481E6L,
201 1.083246385105903533237139380509590158658E5L,
202 6.744420991491385145885727942219463243597E2L
203 /* 1.0E0L */
204};
205
206
207/* log gamma(x+10) = log gamma(10) + x P(x)/Q(x)
208 -0.5 <= x <= 0.5
209 9.5 <= x+10 <= 10.5
210 Peak relative error 5.4e-37 */
1f5649f8
UD
211static const long double lgam10a = 1.280181884765625E1L;
212static const long double lgam10b = 8.6324252196112077178745667061642811492557E-6L;
a3c937ce 213#define NRN10 7
1f5649f8 214static const long double RN10[NRN10 + 1] =
a3c937ce
AJ
215{
216 -1.239059737177249934158597996648808363783E14L,
217 -4.725899566371458992365624673357356908719E13L,
218 -7.283906268647083312042059082837754850808E12L,
219 -5.802855515464011422171165179767478794637E11L,
220 -2.532349691157548788382820303182745897298E10L,
221 -5.884260178023777312587193693477072061820E8L,
222 -6.437774864512125749845840472131829114906E6L,
223 -2.350975266781548931856017239843273049384E4L
224};
225#define NRD10 7
1f5649f8 226static const long double RD10[NRD10 + 1] =
a3c937ce
AJ
227{
228 -5.502645997581822567468347817182347679552E13L,
229 -1.970266640239849804162284805400136473801E13L,
230 -2.819677689615038489384974042561531409392E12L,
231 -2.056105863694742752589691183194061265094E11L,
232 -8.053670086493258693186307810815819662078E9L,
233 -1.632090155573373286153427982504851867131E8L,
234 -1.483575879240631280658077826889223634921E6L,
235 -4.002806669713232271615885826373550502510E3L
236 /* 1.0E0L */
237};
238
239
240/* log gamma(x+9) = log gamma(9) + x P(x)/Q(x)
241 -0.5 <= x <= 0.5
242 8.5 <= x+9 <= 9.5
243 Peak relative error 3.6e-36 */
1f5649f8
UD
244static const long double lgam9a = 1.06045989990234375E1L;
245static const long double lgam9b = 3.9037218127284172274007216547549861681400E-6L;
a3c937ce 246#define NRN9 7
1f5649f8 247static const long double RN9[NRN9 + 1] =
a3c937ce
AJ
248{
249 -4.936332264202687973364500998984608306189E13L,
250 -2.101372682623700967335206138517766274855E13L,
251 -3.615893404644823888655732817505129444195E12L,
252 -3.217104993800878891194322691860075472926E11L,
253 -1.568465330337375725685439173603032921399E10L,
254 -4.073317518162025744377629219101510217761E8L,
255 -4.983232096406156139324846656819246974500E6L,
256 -2.036280038903695980912289722995505277253E4L
257};
258#define NRD9 7
1f5649f8 259static const long double RD9[NRD9 + 1] =
a3c937ce
AJ
260{
261 -2.306006080437656357167128541231915480393E13L,
262 -9.183606842453274924895648863832233799950E12L,
263 -1.461857965935942962087907301194381010380E12L,
264 -1.185728254682789754150068652663124298303E11L,
265 -5.166285094703468567389566085480783070037E9L,
266 -1.164573656694603024184768200787835094317E8L,
267 -1.177343939483908678474886454113163527909E6L,
268 -3.529391059783109732159524500029157638736E3L
269 /* 1.0E0L */
270};
271
272
273/* log gamma(x+8) = log gamma(8) + x P(x)/Q(x)
274 -0.5 <= x <= 0.5
275 7.5 <= x+8 <= 8.5
276 Peak relative error 2.4e-37 */
1f5649f8
UD
277static const long double lgam8a = 8.525146484375E0L;
278static const long double lgam8b = 1.4876690414300165531036347125050759667737E-5L;
a3c937ce 279#define NRN8 8
1f5649f8 280static const long double RN8[NRN8 + 1] =
a3c937ce
AJ
281{
282 6.600775438203423546565361176829139703289E11L,
283 3.406361267593790705240802723914281025800E11L,
284 7.222460928505293914746983300555538432830E10L,
285 8.102984106025088123058747466840656458342E9L,
286 5.157620015986282905232150979772409345927E8L,
287 1.851445288272645829028129389609068641517E7L,
288 3.489261702223124354745894067468953756656E5L,
289 2.892095396706665774434217489775617756014E3L,
290 6.596977510622195827183948478627058738034E0L
291};
292#define NRD8 7
1f5649f8 293static const long double RD8[NRD8 + 1] =
a3c937ce
AJ
294{
295 3.274776546520735414638114828622673016920E11L,
296 1.581811207929065544043963828487733970107E11L,
297 3.108725655667825188135393076860104546416E10L,
298 3.193055010502912617128480163681842165730E9L,
299 1.830871482669835106357529710116211541839E8L,
300 5.790862854275238129848491555068073485086E6L,
301 9.305213264307921522842678835618803553589E4L,
302 6.216974105861848386918949336819572333622E2L
303 /* 1.0E0L */
304};
305
306
307/* log gamma(x+7) = log gamma(7) + x P(x)/Q(x)
308 -0.5 <= x <= 0.5
309 6.5 <= x+7 <= 7.5
310 Peak relative error 3.2e-36 */
1f5649f8
UD
311static const long double lgam7a = 6.5792388916015625E0L;
312static const long double lgam7b = 1.2320408538495060178292903945321122583007E-5L;
a3c937ce 313#define NRN7 8
1f5649f8 314static const long double RN7[NRN7 + 1] =
a3c937ce
AJ
315{
316 2.065019306969459407636744543358209942213E11L,
317 1.226919919023736909889724951708796532847E11L,
318 2.996157990374348596472241776917953749106E10L,
319 3.873001919306801037344727168434909521030E9L,
320 2.841575255593761593270885753992732145094E8L,
321 1.176342515359431913664715324652399565551E7L,
322 2.558097039684188723597519300356028511547E5L,
323 2.448525238332609439023786244782810774702E3L,
324 6.460280377802030953041566617300902020435E0L
325};
326#define NRD7 7
1f5649f8 327static const long double RD7[NRD7 + 1] =
a3c937ce
AJ
328{
329 1.102646614598516998880874785339049304483E11L,
330 6.099297512712715445879759589407189290040E10L,
331 1.372898136289611312713283201112060238351E10L,
332 1.615306270420293159907951633566635172343E9L,
333 1.061114435798489135996614242842561967459E8L,
334 3.845638971184305248268608902030718674691E6L,
335 7.081730675423444975703917836972720495507E4L,
336 5.423122582741398226693137276201344096370E2L
337 /* 1.0E0L */
338};
339
340
341/* log gamma(x+6) = log gamma(6) + x P(x)/Q(x)
342 -0.5 <= x <= 0.5
343 5.5 <= x+6 <= 6.5
344 Peak relative error 6.2e-37 */
1f5649f8
UD
345static const long double lgam6a = 4.7874908447265625E0L;
346static const long double lgam6b = 8.9805548349424770093452324304839959231517E-7L;
a3c937ce 347#define NRN6 8
1f5649f8 348static const long double RN6[NRN6 + 1] =
a3c937ce
AJ
349{
350 -3.538412754670746879119162116819571823643E13L,
351 -2.613432593406849155765698121483394257148E13L,
352 -8.020670732770461579558867891923784753062E12L,
353 -1.322227822931250045347591780332435433420E12L,
354 -1.262809382777272476572558806855377129513E11L,
355 -7.015006277027660872284922325741197022467E9L,
356 -2.149320689089020841076532186783055727299E8L,
357 -3.167210585700002703820077565539658995316E6L,
358 -1.576834867378554185210279285358586385266E4L
359};
360#define NRD6 8
1f5649f8 361static const long double RD6[NRD6 + 1] =
a3c937ce
AJ
362{
363 -2.073955870771283609792355579558899389085E13L,
364 -1.421592856111673959642750863283919318175E13L,
365 -4.012134994918353924219048850264207074949E12L,
366 -6.013361045800992316498238470888523722431E11L,
367 -5.145382510136622274784240527039643430628E10L,
368 -2.510575820013409711678540476918249524123E9L,
369 -6.564058379709759600836745035871373240904E7L,
370 -7.861511116647120540275354855221373571536E5L,
371 -2.821943442729620524365661338459579270561E3L
372 /* 1.0E0L */
373};
374
375
376/* log gamma(x+5) = log gamma(5) + x P(x)/Q(x)
377 -0.5 <= x <= 0.5
378 4.5 <= x+5 <= 5.5
379 Peak relative error 3.4e-37 */
1f5649f8
UD
380static const long double lgam5a = 3.17803955078125E0L;
381static const long double lgam5b = 1.4279566695619646941601297055408873990961E-5L;
a3c937ce 382#define NRN5 9
1f5649f8 383static const long double RN5[NRN5 + 1] =
a3c937ce
AJ
384{
385 2.010952885441805899580403215533972172098E11L,
386 1.916132681242540921354921906708215338584E11L,
387 7.679102403710581712903937970163206882492E10L,
388 1.680514903671382470108010973615268125169E10L,
389 2.181011222911537259440775283277711588410E9L,
390 1.705361119398837808244780667539728356096E8L,
391 7.792391565652481864976147945997033946360E6L,
392 1.910741381027985291688667214472560023819E5L,
393 2.088138241893612679762260077783794329559E3L,
394 6.330318119566998299106803922739066556550E0L
395};
396#define NRD5 8
1f5649f8 397static const long double RD5[NRD5 + 1] =
a3c937ce
AJ
398{
399 1.335189758138651840605141370223112376176E11L,
400 1.174130445739492885895466097516530211283E11L,
401 4.308006619274572338118732154886328519910E10L,
402 8.547402888692578655814445003283720677468E9L,
403 9.934628078575618309542580800421370730906E8L,
404 6.847107420092173812998096295422311820672E7L,
405 2.698552646016599923609773122139463150403E6L,
406 5.526516251532464176412113632726150253215E4L,
407 4.772343321713697385780533022595450486932E2L
408 /* 1.0E0L */
409};
410
411
412/* log gamma(x+4) = log gamma(4) + x P(x)/Q(x)
413 -0.5 <= x <= 0.5
414 3.5 <= x+4 <= 4.5
415 Peak relative error 6.7e-37 */
1f5649f8
UD
416static const long double lgam4a = 1.791748046875E0L;
417static const long double lgam4b = 1.1422353055000812477358380702272722990692E-5L;
a3c937ce 418#define NRN4 9
1f5649f8 419static const long double RN4[NRN4 + 1] =
a3c937ce
AJ
420{
421 -1.026583408246155508572442242188887829208E13L,
422 -1.306476685384622809290193031208776258809E13L,
423 -7.051088602207062164232806511992978915508E12L,
424 -2.100849457735620004967624442027793656108E12L,
425 -3.767473790774546963588549871673843260569E11L,
426 -4.156387497364909963498394522336575984206E10L,
427 -2.764021460668011732047778992419118757746E9L,
428 -1.036617204107109779944986471142938641399E8L,
429 -1.895730886640349026257780896972598305443E6L,
430 -1.180509051468390914200720003907727988201E4L
431};
432#define NRD4 9
1f5649f8 433static const long double RD4[NRD4 + 1] =
a3c937ce
AJ
434{
435 -8.172669122056002077809119378047536240889E12L,
436 -9.477592426087986751343695251801814226960E12L,
437 -4.629448850139318158743900253637212801682E12L,
438 -1.237965465892012573255370078308035272942E12L,
439 -1.971624313506929845158062177061297598956E11L,
440 -1.905434843346570533229942397763361493610E10L,
441 -1.089409357680461419743730978512856675984E9L,
442 -3.416703082301143192939774401370222822430E7L,
443 -4.981791914177103793218433195857635265295E5L,
444 -2.192507743896742751483055798411231453733E3L
445 /* 1.0E0L */
446};
447
448
449/* log gamma(x+3) = log gamma(3) + x P(x)/Q(x)
450 -0.25 <= x <= 0.5
451 2.75 <= x+3 <= 3.5
452 Peak relative error 6.0e-37 */
1f5649f8
UD
453static const long double lgam3a = 6.93145751953125E-1L;
454static const long double lgam3b = 1.4286068203094172321214581765680755001344E-6L;
a3c937ce
AJ
455
456#define NRN3 9
1f5649f8 457static const long double RN3[NRN3 + 1] =
a3c937ce
AJ
458{
459 -4.813901815114776281494823863935820876670E11L,
460 -8.425592975288250400493910291066881992620E11L,
461 -6.228685507402467503655405482985516909157E11L,
462 -2.531972054436786351403749276956707260499E11L,
463 -6.170200796658926701311867484296426831687E10L,
464 -9.211477458528156048231908798456365081135E9L,
465 -8.251806236175037114064561038908691305583E8L,
466 -4.147886355917831049939930101151160447495E7L,
467 -1.010851868928346082547075956946476932162E6L,
468 -8.333374463411801009783402800801201603736E3L
469};
470#define NRD3 9
1f5649f8 471static const long double RD3[NRD3 + 1] =
a3c937ce
AJ
472{
473 -5.216713843111675050627304523368029262450E11L,
474 -8.014292925418308759369583419234079164391E11L,
475 -5.180106858220030014546267824392678611990E11L,
476 -1.830406975497439003897734969120997840011E11L,
477 -3.845274631904879621945745960119924118925E10L,
478 -4.891033385370523863288908070309417710903E9L,
479 -3.670172254411328640353855768698287474282E8L,
480 -1.505316381525727713026364396635522516989E7L,
481 -2.856327162923716881454613540575964890347E5L,
482 -1.622140448015769906847567212766206894547E3L
483 /* 1.0E0L */
484};
485
486
487/* log gamma(x+2.5) = log gamma(2.5) + x P(x)/Q(x)
488 -0.125 <= x <= 0.25
489 2.375 <= x+2.5 <= 2.75 */
1f5649f8
UD
490static const long double lgam2r5a = 2.8466796875E-1L;
491static const long double lgam2r5b = 1.4901722919159632494669682701924320137696E-5L;
a3c937ce 492#define NRN2r5 8
1f5649f8 493static const long double RN2r5[NRN2r5 + 1] =
a3c937ce
AJ
494{
495 -4.676454313888335499356699817678862233205E9L,
496 -9.361888347911187924389905984624216340639E9L,
497 -7.695353600835685037920815799526540237703E9L,
498 -3.364370100981509060441853085968900734521E9L,
499 -8.449902011848163568670361316804900559863E8L,
500 -1.225249050950801905108001246436783022179E8L,
501 -9.732972931077110161639900388121650470926E6L,
502 -3.695711763932153505623248207576425983573E5L,
503 -4.717341584067827676530426007495274711306E3L
504};
505#define NRD2r5 8
1f5649f8 506static const long double RD2r5[NRD2r5 + 1] =
a3c937ce
AJ
507{
508 -6.650657966618993679456019224416926875619E9L,
509 -1.099511409330635807899718829033488771623E10L,
510 -7.482546968307837168164311101447116903148E9L,
511 -2.702967190056506495988922973755870557217E9L,
512 -5.570008176482922704972943389590409280950E8L,
513 -6.536934032192792470926310043166993233231E7L,
514 -4.101991193844953082400035444146067511725E6L,
515 -1.174082735875715802334430481065526664020E5L,
516 -9.932840389994157592102947657277692978511E2L
517 /* 1.0E0L */
518};
519
520
521/* log gamma(x+2) = x P(x)/Q(x)
522 -0.125 <= x <= +0.375
523 1.875 <= x+2 <= 2.375
524 Peak relative error 4.6e-36 */
525#define NRN2 9
1f5649f8 526static const long double RN2[NRN2 + 1] =
a3c937ce
AJ
527{
528 -3.716661929737318153526921358113793421524E9L,
529 -1.138816715030710406922819131397532331321E10L,
530 -1.421017419363526524544402598734013569950E10L,
531 -9.510432842542519665483662502132010331451E9L,
532 -3.747528562099410197957514973274474767329E9L,
533 -8.923565763363912474488712255317033616626E8L,
534 -1.261396653700237624185350402781338231697E8L,
535 -9.918402520255661797735331317081425749014E6L,
536 -3.753996255897143855113273724233104768831E5L,
537 -4.778761333044147141559311805999540765612E3L
538};
539#define NRD2 9
1f5649f8 540static const long double RD2[NRD2 + 1] =
a3c937ce
AJ
541{
542 -8.790916836764308497770359421351673950111E9L,
543 -2.023108608053212516399197678553737477486E10L,
544 -1.958067901852022239294231785363504458367E10L,
545 -1.035515043621003101254252481625188704529E10L,
546 -3.253884432621336737640841276619272224476E9L,
547 -6.186383531162456814954947669274235815544E8L,
548 -6.932557847749518463038934953605969951466E7L,
549 -4.240731768287359608773351626528479703758E6L,
550 -1.197343995089189188078944689846348116630E5L,
551 -1.004622911670588064824904487064114090920E3L
552/* 1.0E0 */
553};
554
555
556/* log gamma(x+1.75) = log gamma(1.75) + x P(x)/Q(x)
557 -0.125 <= x <= +0.125
558 1.625 <= x+1.75 <= 1.875
559 Peak relative error 9.2e-37 */
1f5649f8
UD
560static const long double lgam1r75a = -8.441162109375E-2L;
561static const long double lgam1r75b = 1.0500073264444042213965868602268256157604E-5L;
a3c937ce 562#define NRN1r75 8
1f5649f8 563static const long double RN1r75[NRN1r75 + 1] =
a3c937ce
AJ
564{
565 -5.221061693929833937710891646275798251513E7L,
566 -2.052466337474314812817883030472496436993E8L,
567 -2.952718275974940270675670705084125640069E8L,
568 -2.132294039648116684922965964126389017840E8L,
569 -8.554103077186505960591321962207519908489E7L,
570 -1.940250901348870867323943119132071960050E7L,
571 -2.379394147112756860769336400290402208435E6L,
572 -1.384060879999526222029386539622255797389E5L,
573 -2.698453601378319296159355612094598695530E3L
574};
575#define NRD1r75 8
1f5649f8 576static const long double RD1r75[NRD1r75 + 1] =
a3c937ce
AJ
577{
578 -2.109754689501705828789976311354395393605E8L,
579 -5.036651829232895725959911504899241062286E8L,
580 -4.954234699418689764943486770327295098084E8L,
581 -2.589558042412676610775157783898195339410E8L,
582 -7.731476117252958268044969614034776883031E7L,
583 -1.316721702252481296030801191240867486965E7L,
584 -1.201296501404876774861190604303728810836E6L,
585 -5.007966406976106636109459072523610273928E4L,
586 -6.155817990560743422008969155276229018209E2L
587 /* 1.0E0L */
588};
589
590
591/* log gamma(x+x0) = y0 + x^2 P(x)/Q(x)
592 -0.0867 <= x <= +0.1634
593 1.374932... <= x+x0 <= 1.625032...
594 Peak relative error 4.0e-36 */
1f5649f8
UD
595static const long double x0a = 1.4616241455078125L;
596static const long double x0b = 7.9994605498412626595423257213002588621246E-6L;
597static const long double y0a = -1.21490478515625E-1L;
598static const long double y0b = 4.1879797753919044854428223084178486438269E-6L;
a3c937ce 599#define NRN1r5 8
1f5649f8 600static const long double RN1r5[NRN1r5 + 1] =
a3c937ce
AJ
601{
602 6.827103657233705798067415468881313128066E5L,
603 1.910041815932269464714909706705242148108E6L,
604 2.194344176925978377083808566251427771951E6L,
605 1.332921400100891472195055269688876427962E6L,
606 4.589080973377307211815655093824787123508E5L,
607 8.900334161263456942727083580232613796141E4L,
608 9.053840838306019753209127312097612455236E3L,
609 4.053367147553353374151852319743594873771E2L,
610 5.040631576303952022968949605613514584950E0L
611};
612#define NRD1r5 8
1f5649f8 613static const long double RD1r5[NRD1r5 + 1] =
a3c937ce
AJ
614{
615 1.411036368843183477558773688484699813355E6L,
616 4.378121767236251950226362443134306184849E6L,
617 5.682322855631723455425929877581697918168E6L,
618 3.999065731556977782435009349967042222375E6L,
619 1.653651390456781293163585493620758410333E6L,
620 4.067774359067489605179546964969435858311E5L,
621 5.741463295366557346748361781768833633256E4L,
622 4.226404539738182992856094681115746692030E3L,
623 1.316980975410327975566999780608618774469E2L,
624 /* 1.0E0L */
625};
626
627
628/* log gamma(x+1.25) = log gamma(1.25) + x P(x)/Q(x)
629 -.125 <= x <= +.125
630 1.125 <= x+1.25 <= 1.375
631 Peak relative error = 4.9e-36 */
1f5649f8
UD
632static const long double lgam1r25a = -9.82818603515625E-2L;
633static const long double lgam1r25b = 1.0023929749338536146197303364159774377296E-5L;
a3c937ce 634#define NRN1r25 9
1f5649f8 635static const long double RN1r25[NRN1r25 + 1] =
a3c937ce
AJ
636{
637 -9.054787275312026472896002240379580536760E4L,
638 -8.685076892989927640126560802094680794471E4L,
639 2.797898965448019916967849727279076547109E5L,
640 6.175520827134342734546868356396008898299E5L,
641 5.179626599589134831538516906517372619641E5L,
642 2.253076616239043944538380039205558242161E5L,
643 5.312653119599957228630544772499197307195E4L,
644 6.434329437514083776052669599834938898255E3L,
645 3.385414416983114598582554037612347549220E2L,
646 4.907821957946273805080625052510832015792E0L
647};
648#define NRD1r25 8
1f5649f8 649static const long double RD1r25[NRD1r25 + 1] =
a3c937ce
AJ
650{
651 3.980939377333448005389084785896660309000E5L,
652 1.429634893085231519692365775184490465542E6L,
653 2.145438946455476062850151428438668234336E6L,
654 1.743786661358280837020848127465970357893E6L,
655 8.316364251289743923178092656080441655273E5L,
656 2.355732939106812496699621491135458324294E5L,
657 3.822267399625696880571810137601310855419E4L,
658 3.228463206479133236028576845538387620856E3L,
659 1.152133170470059555646301189220117965514E2L
660 /* 1.0E0L */
661};
662
663
664/* log gamma(x + 1) = x P(x)/Q(x)
665 0.0 <= x <= +0.125
666 1.0 <= x+1 <= 1.125
667 Peak relative error 1.1e-35 */
668#define NRN1 8
1f5649f8 669static const long double RN1[NRN1 + 1] =
a3c937ce
AJ
670{
671 -9.987560186094800756471055681088744738818E3L,
672 -2.506039379419574361949680225279376329742E4L,
673 -1.386770737662176516403363873617457652991E4L,
674 1.439445846078103202928677244188837130744E4L,
675 2.159612048879650471489449668295139990693E4L,
676 1.047439813638144485276023138173676047079E4L,
677 2.250316398054332592560412486630769139961E3L,
678 1.958510425467720733041971651126443864041E2L,
679 4.516830313569454663374271993200291219855E0L
680};
681#define NRD1 7
1f5649f8 682static const long double RD1[NRD1 + 1] =
a3c937ce
AJ
683{
684 1.730299573175751778863269333703788214547E4L,
685 6.807080914851328611903744668028014678148E4L,
686 1.090071629101496938655806063184092302439E5L,
687 9.124354356415154289343303999616003884080E4L,
688 4.262071638655772404431164427024003253954E4L,
689 1.096981664067373953673982635805821283581E4L,
690 1.431229503796575892151252708527595787588E3L,
691 7.734110684303689320830401788262295992921E1L
692 /* 1.0E0 */
693};
694
695
696/* log gamma(x + 1) = x P(x)/Q(x)
697 -0.125 <= x <= 0
698 0.875 <= x+1 <= 1.0
699 Peak relative error 7.0e-37 */
700#define NRNr9 8
1f5649f8 701static const long double RNr9[NRNr9 + 1] =
a3c937ce
AJ
702{
703 4.441379198241760069548832023257571176884E5L,
704 1.273072988367176540909122090089580368732E6L,
705 9.732422305818501557502584486510048387724E5L,
706 -5.040539994443998275271644292272870348684E5L,
707 -1.208719055525609446357448132109723786736E6L,
708 -7.434275365370936547146540554419058907156E5L,
709 -2.075642969983377738209203358199008185741E5L,
710 -2.565534860781128618589288075109372218042E4L,
711 -1.032901669542994124131223797515913955938E3L,
712};
713#define NRDr9 8
1f5649f8 714static const long double RDr9[NRDr9 + 1] =
a3c937ce
AJ
715{
716 -7.694488331323118759486182246005193998007E5L,
717 -3.301918855321234414232308938454112213751E6L,
718 -5.856830900232338906742924836032279404702E6L,
719 -5.540672519616151584486240871424021377540E6L,
720 -3.006530901041386626148342989181721176919E6L,
721 -9.350378280513062139466966374330795935163E5L,
722 -1.566179100031063346901755685375732739511E5L,
723 -1.205016539620260779274902967231510804992E4L,
724 -2.724583156305709733221564484006088794284E2L
725/* 1.0E0 */
726};
727
728
729/* Evaluate P[n] x^n + P[n-1] x^(n-1) + ... + P[0] */
730
731static long double
60a06b7c 732neval (long double x, const long double *p, int n)
a3c937ce
AJ
733{
734 long double y;
735
736 p += n;
737 y = *p--;
738 do
739 {
740 y = y * x + *p--;
741 }
742 while (--n > 0);
743 return y;
744}
745
746
747/* Evaluate x^n+1 + P[n] x^(n) + P[n-1] x^(n-1) + ... + P[0] */
748
749static long double
60a06b7c 750deval (long double x, const long double *p, int n)
a3c937ce
AJ
751{
752 long double y;
753
754 p += n;
755 y = x + *p--;
756 do
757 {
758 y = y * x + *p--;
759 }
760 while (--n > 0);
761 return y;
762}
763
764
a3c937ce
AJ
765long double
766__ieee754_lgammal_r (long double x, int *signgamp)
a3c937ce
AJ
767{
768 long double p, q, w, z, nx;
769 int i, nn;
770
771 *signgamp = 1;
772
d81f90cc 773 if (! isfinite (x))
a3c937ce
AJ
774 return x * x;
775
facd1d8e
UD
776 if (x == 0.0L)
777 {
d81f90cc 778 if (signbit (x))
0ac5ae23 779 *signgamp = -1;
facd1d8e
UD
780 }
781
a3c937ce
AJ
782 if (x < 0.0L)
783 {
784 q = -x;
a3c937ce
AJ
785 p = __floorl (q);
786 if (p == q)
52e1b618 787 return (one / (p - p));
a3c937ce
AJ
788 i = p;
789 if ((i & 1) == 0)
790 *signgamp = -1;
791 else
792 *signgamp = 1;
4f40e4b3
JM
793 if (q < 0x1p-120L)
794 return -__logl (q);
a3c937ce
AJ
795 z = q - p;
796 if (z > 0.5L)
797 {
798 p += 1.0L;
799 z = p - q;
800 }
801 z = q * __sinl (PIL * z);
52e1b618 802 w = __ieee754_lgammal_r (q, &i);
a3c937ce
AJ
803 z = __logl (PIL / z) - w;
804 return (z);
805 }
806
807 if (x < 13.5L)
808 {
809 p = 0.0L;
810 nx = __floorl (x + 0.5L);
811 nn = nx;
812 switch (nn)
813 {
814 case 0:
815 /* log gamma (x + 1) = log(x) + log gamma(x) */
eb3fc44b
JM
816 if (x < 0x1p-120L)
817 return -__logl (x);
818 else if (x <= 0.125)
a3c937ce
AJ
819 {
820 p = x * neval (x, RN1, NRN1) / deval (x, RD1, NRD1);
821 }
822 else if (x <= 0.375)
823 {
824 z = x - 0.25L;
825 p = z * neval (z, RN1r25, NRN1r25) / deval (z, RD1r25, NRD1r25);
826 p += lgam1r25b;
827 p += lgam1r25a;
828 }
829 else if (x <= 0.625)
830 {
831 z = x + (1.0L - x0a);
832 z = z - x0b;
833 p = neval (z, RN1r5, NRN1r5) / deval (z, RD1r5, NRD1r5);
834 p = p * z * z;
835 p = p + y0b;
836 p = p + y0a;
837 }
838 else if (x <= 0.875)
839 {
840 z = x - 0.75L;
841 p = z * neval (z, RN1r75, NRN1r75) / deval (z, RD1r75, NRD1r75);
842 p += lgam1r75b;
843 p += lgam1r75a;
844 }
845 else
846 {
847 z = x - 1.0L;
848 p = z * neval (z, RN2, NRN2) / deval (z, RD2, NRD2);
849 }
850 p = p - __logl (x);
851 break;
852
853 case 1:
854 if (x < 0.875L)
855 {
856 if (x <= 0.625)
857 {
858 z = x + (1.0L - x0a);
859 z = z - x0b;
860 p = neval (z, RN1r5, NRN1r5) / deval (z, RD1r5, NRD1r5);
861 p = p * z * z;
862 p = p + y0b;
863 p = p + y0a;
864 }
865 else if (x <= 0.875)
866 {
867 z = x - 0.75L;
868 p = z * neval (z, RN1r75, NRN1r75)
0ac5ae23 869 / deval (z, RD1r75, NRD1r75);
a3c937ce
AJ
870 p += lgam1r75b;
871 p += lgam1r75a;
872 }
873 else
874 {
875 z = x - 1.0L;
876 p = z * neval (z, RN2, NRN2) / deval (z, RD2, NRD2);
877 }
878 p = p - __logl (x);
879 }
880 else if (x < 1.0L)
881 {
882 z = x - 1.0L;
883 p = z * neval (z, RNr9, NRNr9) / deval (z, RDr9, NRDr9);
884 }
52e1b618
UD
885 else if (x == 1.0L)
886 p = 0.0L;
a3c937ce
AJ
887 else if (x <= 1.125L)
888 {
889 z = x - 1.0L;
890 p = z * neval (z, RN1, NRN1) / deval (z, RD1, NRD1);
891 }
892 else if (x <= 1.375)
893 {
894 z = x - 1.25L;
895 p = z * neval (z, RN1r25, NRN1r25) / deval (z, RD1r25, NRD1r25);
896 p += lgam1r25b;
897 p += lgam1r25a;
898 }
899 else
900 {
901 /* 1.375 <= x+x0 <= 1.625 */
902 z = x - x0a;
903 z = z - x0b;
904 p = neval (z, RN1r5, NRN1r5) / deval (z, RD1r5, NRD1r5);
905 p = p * z * z;
906 p = p + y0b;
907 p = p + y0a;
908 }
909 break;
910
911 case 2:
912 if (x < 1.625L)
913 {
914 z = x - x0a;
915 z = z - x0b;
916 p = neval (z, RN1r5, NRN1r5) / deval (z, RD1r5, NRD1r5);
917 p = p * z * z;
918 p = p + y0b;
919 p = p + y0a;
920 }
921 else if (x < 1.875L)
922 {
923 z = x - 1.75L;
924 p = z * neval (z, RN1r75, NRN1r75) / deval (z, RD1r75, NRD1r75);
925 p += lgam1r75b;
926 p += lgam1r75a;
927 }
52e1b618
UD
928 else if (x == 2.0L)
929 p = 0.0L;
a3c937ce
AJ
930 else if (x < 2.375L)
931 {
932 z = x - 2.0L;
933 p = z * neval (z, RN2, NRN2) / deval (z, RD2, NRD2);
934 }
935 else
936 {
937 z = x - 2.5L;
938 p = z * neval (z, RN2r5, NRN2r5) / deval (z, RD2r5, NRD2r5);
939 p += lgam2r5b;
940 p += lgam2r5a;
941 }
942 break;
943
944 case 3:
945 if (x < 2.75)
946 {
947 z = x - 2.5L;
948 p = z * neval (z, RN2r5, NRN2r5) / deval (z, RD2r5, NRD2r5);
949 p += lgam2r5b;
950 p += lgam2r5a;
951 }
952 else
953 {
954 z = x - 3.0L;
955 p = z * neval (z, RN3, NRN3) / deval (z, RD3, NRD3);
956 p += lgam3b;
957 p += lgam3a;
958 }
959 break;
960
961 case 4:
962 z = x - 4.0L;
963 p = z * neval (z, RN4, NRN4) / deval (z, RD4, NRD4);
964 p += lgam4b;
965 p += lgam4a;
966 break;
967
968 case 5:
969 z = x - 5.0L;
970 p = z * neval (z, RN5, NRN5) / deval (z, RD5, NRD5);
971 p += lgam5b;
972 p += lgam5a;
973 break;
974
975 case 6:
976 z = x - 6.0L;
977 p = z * neval (z, RN6, NRN6) / deval (z, RD6, NRD6);
978 p += lgam6b;
979 p += lgam6a;
980 break;
981
982 case 7:
983 z = x - 7.0L;
984 p = z * neval (z, RN7, NRN7) / deval (z, RD7, NRD7);
985 p += lgam7b;
986 p += lgam7a;
987 break;
988
989 case 8:
990 z = x - 8.0L;
991 p = z * neval (z, RN8, NRN8) / deval (z, RD8, NRD8);
992 p += lgam8b;
993 p += lgam8a;
994 break;
995
996 case 9:
997 z = x - 9.0L;
998 p = z * neval (z, RN9, NRN9) / deval (z, RD9, NRD9);
999 p += lgam9b;
1000 p += lgam9a;
1001 break;
1002
1003 case 10:
1004 z = x - 10.0L;
1005 p = z * neval (z, RN10, NRN10) / deval (z, RD10, NRD10);
1006 p += lgam10b;
1007 p += lgam10a;
1008 break;
1009
1010 case 11:
1011 z = x - 11.0L;
1012 p = z * neval (z, RN11, NRN11) / deval (z, RD11, NRD11);
1013 p += lgam11b;
1014 p += lgam11a;
1015 break;
1016
1017 case 12:
1018 z = x - 12.0L;
1019 p = z * neval (z, RN12, NRN12) / deval (z, RD12, NRD12);
1020 p += lgam12b;
1021 p += lgam12a;
1022 break;
1023
1024 case 13:
1025 z = x - 13.0L;
1026 p = z * neval (z, RN13, NRN13) / deval (z, RD13, NRD13);
1027 p += lgam13b;
1028 p += lgam13a;
1029 break;
1030 }
1031 return p;
1032 }
1033
1034 if (x > MAXLGM)
1035 return (*signgamp * huge * huge);
1036
1037 q = ls2pi - x;
1038 q = (x - 0.5L) * __logl (x) + q;
1039 if (x > 1.0e18L)
1040 return (q);
1041
1042 p = 1.0L / (x * x);
1043 q += neval (p, RASY, NRASY) / x;
1044 return (q);
1045}
0ac5ae23 1046strong_alias (__ieee754_lgammal_r, __lgammal_r_finite)