3 * Natural logarithm of gamma function
9 * __float128 x, y, lgammal();
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.
23 * The positive domain is partitioned into numerous segments for approximation.
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)
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.
33 * The cosecant reflection formula is employed for negative arguments.
40 * arithmetic domain # trials peak rms
42 * IEEE 10, 30 100000 3.9e-34 9.8e-35
43 * IEEE 0, 10 100000 3.8e-34 5.3e-35
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
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.
55 /* Copyright 2001 by Stephen L. Moshier <moshier@na-net.ornl.gov>
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.
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.
67 You should have received a copy of the GNU Lesser General Public
68 License along with this library; if not, write to the Free Software
69 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
71 #include "quadmath-imp.h"
73 static const __float128 PIQ
= 3.1415926535897932384626433832795028841972E0Q
;
74 static const __float128 MAXLGM
= 1.0485738685148938358098967157129705071571E4928Q
;
75 static const __float128 one
= 1.0Q
;
76 static const __float128 zero
= 0.0Q
;
77 static const __float128 huge
= 1.0e4000Q
;
79 /* log gamma(x) = ( x - 0.5 ) * log(x) - x + LS2PI + 1/x P(1/x^2)
80 1/x <= 0.0741 (x >= 13.495...)
81 Peak relative error 1.5e-36 */
82 static const __float128 ls2pi
= 9.1893853320467274178032973640561763986140E-1Q
;
84 static const __float128 RASY
[NRASY
+ 1] =
86 8.333333333333333333333333333310437112111E-2Q
,
87 -2.777777777777777777777774789556228296902E-3Q
,
88 7.936507936507936507795933938448586499183E-4Q
,
89 -5.952380952380952041799269756378148574045E-4Q
,
90 8.417508417507928904209891117498524452523E-4Q
,
91 -1.917526917481263997778542329739806086290E-3Q
,
92 6.410256381217852504446848671499409919280E-3Q
,
93 -2.955064066900961649768101034477363301626E-2Q
,
94 1.796402955865634243663453415388336954675E-1Q
,
95 -1.391522089007758553455753477688592767741E0Q
,
96 1.326130089598399157988112385013829305510E1Q
,
97 -1.420412699593782497803472576479997819149E2Q
,
98 1.218058922427762808938869872528846787020E3Q
102 /* log gamma(x+13) = log gamma(13) + x P(x)/Q(x)
105 Peak relative error 1.1e-36 */
106 static const __float128 lgam13a
= 1.9987213134765625E1Q
;
107 static const __float128 lgam13b
= 1.3608962611495173623870550785125024484248E-6Q
;
109 static const __float128 RN13
[NRN13
+ 1] =
111 8.591478354823578150238226576156275285700E11Q
,
112 2.347931159756482741018258864137297157668E11Q
,
113 2.555408396679352028680662433943000804616E10Q
,
114 1.408581709264464345480765758902967123937E9Q
,
115 4.126759849752613822953004114044451046321E7Q
,
116 6.133298899622688505854211579222889943778E5Q
,
117 3.929248056293651597987893340755876578072E3Q
,
118 6.850783280018706668924952057996075215223E0Q
121 static const __float128 RD13
[NRD13
+ 1] =
123 3.401225382297342302296607039352935541669E11Q
,
124 8.756765276918037910363513243563234551784E10Q
,
125 8.873913342866613213078554180987647243903E9Q
,
126 4.483797255342763263361893016049310017973E8Q
,
127 1.178186288833066430952276702931512870676E7Q
,
128 1.519928623743264797939103740132278337476E5Q
,
129 7.989298844938119228411117593338850892311E2Q
134 /* log gamma(x+12) = log gamma(12) + x P(x)/Q(x)
137 Peak relative error 4.1e-36 */
138 static const __float128 lgam12a
= 1.75023040771484375E1Q
;
139 static const __float128 lgam12b
= 3.7687254483392876529072161996717039575982E-6Q
;
141 static const __float128 RN12
[NRN12
+ 1] =
143 4.709859662695606986110997348630997559137E11Q
,
144 1.398713878079497115037857470168777995230E11Q
,
145 1.654654931821564315970930093932954900867E10Q
,
146 9.916279414876676861193649489207282144036E8Q
,
147 3.159604070526036074112008954113411389879E7Q
,
148 5.109099197547205212294747623977502492861E5Q
,
149 3.563054878276102790183396740969279826988E3Q
,
150 6.769610657004672719224614163196946862747E0Q
153 static const __float128 RD12
[NRD12
+ 1] =
155 1.928167007860968063912467318985802726613E11Q
,
156 5.383198282277806237247492369072266389233E10Q
,
157 5.915693215338294477444809323037871058363E9Q
,
158 3.241438287570196713148310560147925781342E8Q
,
159 9.236680081763754597872713592701048455890E6Q
,
160 1.292246897881650919242713651166596478850E5Q
,
161 7.366532445427159272584194816076600211171E2Q
166 /* log gamma(x+11) = log gamma(11) + x P(x)/Q(x)
169 Peak relative error 1.8e-35 */
170 static const __float128 lgam11a
= 1.5104400634765625E1Q
;
171 static const __float128 lgam11b
= 1.1938309890295225709329251070371882250744E-5Q
;
173 static const __float128 RN11
[NRN11
+ 1] =
175 2.446960438029415837384622675816736622795E11Q
,
176 7.955444974446413315803799763901729640350E10Q
,
177 1.030555327949159293591618473447420338444E10Q
,
178 6.765022131195302709153994345470493334946E8Q
,
179 2.361892792609204855279723576041468347494E7Q
,
180 4.186623629779479136428005806072176490125E5Q
,
181 3.202506022088912768601325534149383594049E3Q
,
182 6.681356101133728289358838690666225691363E0Q
185 static const __float128 RD11
[NRD11
+ 1] =
187 1.040483786179428590683912396379079477432E11Q
,
188 3.172251138489229497223696648369823779729E10Q
,
189 3.806961885984850433709295832245848084614E9Q
,
190 2.278070344022934913730015420611609620171E8Q
,
191 7.089478198662651683977290023829391596481E6Q
,
192 1.083246385105903533237139380509590158658E5Q
,
193 6.744420991491385145885727942219463243597E2Q
198 /* log gamma(x+10) = log gamma(10) + x P(x)/Q(x)
201 Peak relative error 5.4e-37 */
202 static const __float128 lgam10a
= 1.280181884765625E1Q
;
203 static const __float128 lgam10b
= 8.6324252196112077178745667061642811492557E-6Q
;
205 static const __float128 RN10
[NRN10
+ 1] =
207 -1.239059737177249934158597996648808363783E14Q
,
208 -4.725899566371458992365624673357356908719E13Q
,
209 -7.283906268647083312042059082837754850808E12Q
,
210 -5.802855515464011422171165179767478794637E11Q
,
211 -2.532349691157548788382820303182745897298E10Q
,
212 -5.884260178023777312587193693477072061820E8Q
,
213 -6.437774864512125749845840472131829114906E6Q
,
214 -2.350975266781548931856017239843273049384E4Q
217 static const __float128 RD10
[NRD10
+ 1] =
219 -5.502645997581822567468347817182347679552E13Q
,
220 -1.970266640239849804162284805400136473801E13Q
,
221 -2.819677689615038489384974042561531409392E12Q
,
222 -2.056105863694742752589691183194061265094E11Q
,
223 -8.053670086493258693186307810815819662078E9Q
,
224 -1.632090155573373286153427982504851867131E8Q
,
225 -1.483575879240631280658077826889223634921E6Q
,
226 -4.002806669713232271615885826373550502510E3Q
231 /* log gamma(x+9) = log gamma(9) + x P(x)/Q(x)
234 Peak relative error 3.6e-36 */
235 static const __float128 lgam9a
= 1.06045989990234375E1Q
;
236 static const __float128 lgam9b
= 3.9037218127284172274007216547549861681400E-6Q
;
238 static const __float128 RN9
[NRN9
+ 1] =
240 -4.936332264202687973364500998984608306189E13Q
,
241 -2.101372682623700967335206138517766274855E13Q
,
242 -3.615893404644823888655732817505129444195E12Q
,
243 -3.217104993800878891194322691860075472926E11Q
,
244 -1.568465330337375725685439173603032921399E10Q
,
245 -4.073317518162025744377629219101510217761E8Q
,
246 -4.983232096406156139324846656819246974500E6Q
,
247 -2.036280038903695980912289722995505277253E4Q
250 static const __float128 RD9
[NRD9
+ 1] =
252 -2.306006080437656357167128541231915480393E13Q
,
253 -9.183606842453274924895648863832233799950E12Q
,
254 -1.461857965935942962087907301194381010380E12Q
,
255 -1.185728254682789754150068652663124298303E11Q
,
256 -5.166285094703468567389566085480783070037E9Q
,
257 -1.164573656694603024184768200787835094317E8Q
,
258 -1.177343939483908678474886454113163527909E6Q
,
259 -3.529391059783109732159524500029157638736E3Q
264 /* log gamma(x+8) = log gamma(8) + x P(x)/Q(x)
267 Peak relative error 2.4e-37 */
268 static const __float128 lgam8a
= 8.525146484375E0Q
;
269 static const __float128 lgam8b
= 1.4876690414300165531036347125050759667737E-5Q
;
271 static const __float128 RN8
[NRN8
+ 1] =
273 6.600775438203423546565361176829139703289E11Q
,
274 3.406361267593790705240802723914281025800E11Q
,
275 7.222460928505293914746983300555538432830E10Q
,
276 8.102984106025088123058747466840656458342E9Q
,
277 5.157620015986282905232150979772409345927E8Q
,
278 1.851445288272645829028129389609068641517E7Q
,
279 3.489261702223124354745894067468953756656E5Q
,
280 2.892095396706665774434217489775617756014E3Q
,
281 6.596977510622195827183948478627058738034E0Q
284 static const __float128 RD8
[NRD8
+ 1] =
286 3.274776546520735414638114828622673016920E11Q
,
287 1.581811207929065544043963828487733970107E11Q
,
288 3.108725655667825188135393076860104546416E10Q
,
289 3.193055010502912617128480163681842165730E9Q
,
290 1.830871482669835106357529710116211541839E8Q
,
291 5.790862854275238129848491555068073485086E6Q
,
292 9.305213264307921522842678835618803553589E4Q
,
293 6.216974105861848386918949336819572333622E2Q
298 /* log gamma(x+7) = log gamma(7) + x P(x)/Q(x)
301 Peak relative error 3.2e-36 */
302 static const __float128 lgam7a
= 6.5792388916015625E0Q
;
303 static const __float128 lgam7b
= 1.2320408538495060178292903945321122583007E-5Q
;
305 static const __float128 RN7
[NRN7
+ 1] =
307 2.065019306969459407636744543358209942213E11Q
,
308 1.226919919023736909889724951708796532847E11Q
,
309 2.996157990374348596472241776917953749106E10Q
,
310 3.873001919306801037344727168434909521030E9Q
,
311 2.841575255593761593270885753992732145094E8Q
,
312 1.176342515359431913664715324652399565551E7Q
,
313 2.558097039684188723597519300356028511547E5Q
,
314 2.448525238332609439023786244782810774702E3Q
,
315 6.460280377802030953041566617300902020435E0Q
318 static const __float128 RD7
[NRD7
+ 1] =
320 1.102646614598516998880874785339049304483E11Q
,
321 6.099297512712715445879759589407189290040E10Q
,
322 1.372898136289611312713283201112060238351E10Q
,
323 1.615306270420293159907951633566635172343E9Q
,
324 1.061114435798489135996614242842561967459E8Q
,
325 3.845638971184305248268608902030718674691E6Q
,
326 7.081730675423444975703917836972720495507E4Q
,
327 5.423122582741398226693137276201344096370E2Q
332 /* log gamma(x+6) = log gamma(6) + x P(x)/Q(x)
335 Peak relative error 6.2e-37 */
336 static const __float128 lgam6a
= 4.7874908447265625E0Q
;
337 static const __float128 lgam6b
= 8.9805548349424770093452324304839959231517E-7Q
;
339 static const __float128 RN6
[NRN6
+ 1] =
341 -3.538412754670746879119162116819571823643E13Q
,
342 -2.613432593406849155765698121483394257148E13Q
,
343 -8.020670732770461579558867891923784753062E12Q
,
344 -1.322227822931250045347591780332435433420E12Q
,
345 -1.262809382777272476572558806855377129513E11Q
,
346 -7.015006277027660872284922325741197022467E9Q
,
347 -2.149320689089020841076532186783055727299E8Q
,
348 -3.167210585700002703820077565539658995316E6Q
,
349 -1.576834867378554185210279285358586385266E4Q
352 static const __float128 RD6
[NRD6
+ 1] =
354 -2.073955870771283609792355579558899389085E13Q
,
355 -1.421592856111673959642750863283919318175E13Q
,
356 -4.012134994918353924219048850264207074949E12Q
,
357 -6.013361045800992316498238470888523722431E11Q
,
358 -5.145382510136622274784240527039643430628E10Q
,
359 -2.510575820013409711678540476918249524123E9Q
,
360 -6.564058379709759600836745035871373240904E7Q
,
361 -7.861511116647120540275354855221373571536E5Q
,
362 -2.821943442729620524365661338459579270561E3Q
367 /* log gamma(x+5) = log gamma(5) + x P(x)/Q(x)
370 Peak relative error 3.4e-37 */
371 static const __float128 lgam5a
= 3.17803955078125E0Q
;
372 static const __float128 lgam5b
= 1.4279566695619646941601297055408873990961E-5Q
;
374 static const __float128 RN5
[NRN5
+ 1] =
376 2.010952885441805899580403215533972172098E11Q
,
377 1.916132681242540921354921906708215338584E11Q
,
378 7.679102403710581712903937970163206882492E10Q
,
379 1.680514903671382470108010973615268125169E10Q
,
380 2.181011222911537259440775283277711588410E9Q
,
381 1.705361119398837808244780667539728356096E8Q
,
382 7.792391565652481864976147945997033946360E6Q
,
383 1.910741381027985291688667214472560023819E5Q
,
384 2.088138241893612679762260077783794329559E3Q
,
385 6.330318119566998299106803922739066556550E0Q
388 static const __float128 RD5
[NRD5
+ 1] =
390 1.335189758138651840605141370223112376176E11Q
,
391 1.174130445739492885895466097516530211283E11Q
,
392 4.308006619274572338118732154886328519910E10Q
,
393 8.547402888692578655814445003283720677468E9Q
,
394 9.934628078575618309542580800421370730906E8Q
,
395 6.847107420092173812998096295422311820672E7Q
,
396 2.698552646016599923609773122139463150403E6Q
,
397 5.526516251532464176412113632726150253215E4Q
,
398 4.772343321713697385780533022595450486932E2Q
403 /* log gamma(x+4) = log gamma(4) + x P(x)/Q(x)
406 Peak relative error 6.7e-37 */
407 static const __float128 lgam4a
= 1.791748046875E0Q
;
408 static const __float128 lgam4b
= 1.1422353055000812477358380702272722990692E-5Q
;
410 static const __float128 RN4
[NRN4
+ 1] =
412 -1.026583408246155508572442242188887829208E13Q
,
413 -1.306476685384622809290193031208776258809E13Q
,
414 -7.051088602207062164232806511992978915508E12Q
,
415 -2.100849457735620004967624442027793656108E12Q
,
416 -3.767473790774546963588549871673843260569E11Q
,
417 -4.156387497364909963498394522336575984206E10Q
,
418 -2.764021460668011732047778992419118757746E9Q
,
419 -1.036617204107109779944986471142938641399E8Q
,
420 -1.895730886640349026257780896972598305443E6Q
,
421 -1.180509051468390914200720003907727988201E4Q
424 static const __float128 RD4
[NRD4
+ 1] =
426 -8.172669122056002077809119378047536240889E12Q
,
427 -9.477592426087986751343695251801814226960E12Q
,
428 -4.629448850139318158743900253637212801682E12Q
,
429 -1.237965465892012573255370078308035272942E12Q
,
430 -1.971624313506929845158062177061297598956E11Q
,
431 -1.905434843346570533229942397763361493610E10Q
,
432 -1.089409357680461419743730978512856675984E9Q
,
433 -3.416703082301143192939774401370222822430E7Q
,
434 -4.981791914177103793218433195857635265295E5Q
,
435 -2.192507743896742751483055798411231453733E3Q
440 /* log gamma(x+3) = log gamma(3) + x P(x)/Q(x)
443 Peak relative error 6.0e-37 */
444 static const __float128 lgam3a
= 6.93145751953125E-1Q
;
445 static const __float128 lgam3b
= 1.4286068203094172321214581765680755001344E-6Q
;
448 static const __float128 RN3
[NRN3
+ 1] =
450 -4.813901815114776281494823863935820876670E11Q
,
451 -8.425592975288250400493910291066881992620E11Q
,
452 -6.228685507402467503655405482985516909157E11Q
,
453 -2.531972054436786351403749276956707260499E11Q
,
454 -6.170200796658926701311867484296426831687E10Q
,
455 -9.211477458528156048231908798456365081135E9Q
,
456 -8.251806236175037114064561038908691305583E8Q
,
457 -4.147886355917831049939930101151160447495E7Q
,
458 -1.010851868928346082547075956946476932162E6Q
,
459 -8.333374463411801009783402800801201603736E3Q
462 static const __float128 RD3
[NRD3
+ 1] =
464 -5.216713843111675050627304523368029262450E11Q
,
465 -8.014292925418308759369583419234079164391E11Q
,
466 -5.180106858220030014546267824392678611990E11Q
,
467 -1.830406975497439003897734969120997840011E11Q
,
468 -3.845274631904879621945745960119924118925E10Q
,
469 -4.891033385370523863288908070309417710903E9Q
,
470 -3.670172254411328640353855768698287474282E8Q
,
471 -1.505316381525727713026364396635522516989E7Q
,
472 -2.856327162923716881454613540575964890347E5Q
,
473 -1.622140448015769906847567212766206894547E3Q
478 /* log gamma(x+2.5) = log gamma(2.5) + x P(x)/Q(x)
480 2.375 <= x+2.5 <= 2.75 */
481 static const __float128 lgam2r5a
= 2.8466796875E-1Q
;
482 static const __float128 lgam2r5b
= 1.4901722919159632494669682701924320137696E-5Q
;
484 static const __float128 RN2r5
[NRN2r5
+ 1] =
486 -4.676454313888335499356699817678862233205E9Q
,
487 -9.361888347911187924389905984624216340639E9Q
,
488 -7.695353600835685037920815799526540237703E9Q
,
489 -3.364370100981509060441853085968900734521E9Q
,
490 -8.449902011848163568670361316804900559863E8Q
,
491 -1.225249050950801905108001246436783022179E8Q
,
492 -9.732972931077110161639900388121650470926E6Q
,
493 -3.695711763932153505623248207576425983573E5Q
,
494 -4.717341584067827676530426007495274711306E3Q
497 static const __float128 RD2r5
[NRD2r5
+ 1] =
499 -6.650657966618993679456019224416926875619E9Q
,
500 -1.099511409330635807899718829033488771623E10Q
,
501 -7.482546968307837168164311101447116903148E9Q
,
502 -2.702967190056506495988922973755870557217E9Q
,
503 -5.570008176482922704972943389590409280950E8Q
,
504 -6.536934032192792470926310043166993233231E7Q
,
505 -4.101991193844953082400035444146067511725E6Q
,
506 -1.174082735875715802334430481065526664020E5Q
,
507 -9.932840389994157592102947657277692978511E2Q
512 /* log gamma(x+2) = x P(x)/Q(x)
513 -0.125 <= x <= +0.375
514 1.875 <= x+2 <= 2.375
515 Peak relative error 4.6e-36 */
517 static const __float128 RN2
[NRN2
+ 1] =
519 -3.716661929737318153526921358113793421524E9Q
,
520 -1.138816715030710406922819131397532331321E10Q
,
521 -1.421017419363526524544402598734013569950E10Q
,
522 -9.510432842542519665483662502132010331451E9Q
,
523 -3.747528562099410197957514973274474767329E9Q
,
524 -8.923565763363912474488712255317033616626E8Q
,
525 -1.261396653700237624185350402781338231697E8Q
,
526 -9.918402520255661797735331317081425749014E6Q
,
527 -3.753996255897143855113273724233104768831E5Q
,
528 -4.778761333044147141559311805999540765612E3Q
531 static const __float128 RD2
[NRD2
+ 1] =
533 -8.790916836764308497770359421351673950111E9Q
,
534 -2.023108608053212516399197678553737477486E10Q
,
535 -1.958067901852022239294231785363504458367E10Q
,
536 -1.035515043621003101254252481625188704529E10Q
,
537 -3.253884432621336737640841276619272224476E9Q
,
538 -6.186383531162456814954947669274235815544E8Q
,
539 -6.932557847749518463038934953605969951466E7Q
,
540 -4.240731768287359608773351626528479703758E6Q
,
541 -1.197343995089189188078944689846348116630E5Q
,
542 -1.004622911670588064824904487064114090920E3Q
547 /* log gamma(x+1.75) = log gamma(1.75) + x P(x)/Q(x)
548 -0.125 <= x <= +0.125
549 1.625 <= x+1.75 <= 1.875
550 Peak relative error 9.2e-37 */
551 static const __float128 lgam1r75a
= -8.441162109375E-2Q
;
552 static const __float128 lgam1r75b
= 1.0500073264444042213965868602268256157604E-5Q
;
554 static const __float128 RN1r75
[NRN1r75
+ 1] =
556 -5.221061693929833937710891646275798251513E7Q
,
557 -2.052466337474314812817883030472496436993E8Q
,
558 -2.952718275974940270675670705084125640069E8Q
,
559 -2.132294039648116684922965964126389017840E8Q
,
560 -8.554103077186505960591321962207519908489E7Q
,
561 -1.940250901348870867323943119132071960050E7Q
,
562 -2.379394147112756860769336400290402208435E6Q
,
563 -1.384060879999526222029386539622255797389E5Q
,
564 -2.698453601378319296159355612094598695530E3Q
567 static const __float128 RD1r75
[NRD1r75
+ 1] =
569 -2.109754689501705828789976311354395393605E8Q
,
570 -5.036651829232895725959911504899241062286E8Q
,
571 -4.954234699418689764943486770327295098084E8Q
,
572 -2.589558042412676610775157783898195339410E8Q
,
573 -7.731476117252958268044969614034776883031E7Q
,
574 -1.316721702252481296030801191240867486965E7Q
,
575 -1.201296501404876774861190604303728810836E6Q
,
576 -5.007966406976106636109459072523610273928E4Q
,
577 -6.155817990560743422008969155276229018209E2Q
582 /* log gamma(x+x0) = y0 + x^2 P(x)/Q(x)
583 -0.0867 <= x <= +0.1634
584 1.374932... <= x+x0 <= 1.625032...
585 Peak relative error 4.0e-36 */
586 static const __float128 x0a
= 1.4616241455078125Q
;
587 static const __float128 x0b
= 7.9994605498412626595423257213002588621246E-6Q
;
588 static const __float128 y0a
= -1.21490478515625E-1Q
;
589 static const __float128 y0b
= 4.1879797753919044854428223084178486438269E-6Q
;
591 static const __float128 RN1r5
[NRN1r5
+ 1] =
593 6.827103657233705798067415468881313128066E5Q
,
594 1.910041815932269464714909706705242148108E6Q
,
595 2.194344176925978377083808566251427771951E6Q
,
596 1.332921400100891472195055269688876427962E6Q
,
597 4.589080973377307211815655093824787123508E5Q
,
598 8.900334161263456942727083580232613796141E4Q
,
599 9.053840838306019753209127312097612455236E3Q
,
600 4.053367147553353374151852319743594873771E2Q
,
601 5.040631576303952022968949605613514584950E0Q
604 static const __float128 RD1r5
[NRD1r5
+ 1] =
606 1.411036368843183477558773688484699813355E6Q
,
607 4.378121767236251950226362443134306184849E6Q
,
608 5.682322855631723455425929877581697918168E6Q
,
609 3.999065731556977782435009349967042222375E6Q
,
610 1.653651390456781293163585493620758410333E6Q
,
611 4.067774359067489605179546964969435858311E5Q
,
612 5.741463295366557346748361781768833633256E4Q
,
613 4.226404539738182992856094681115746692030E3Q
,
614 1.316980975410327975566999780608618774469E2Q
,
619 /* log gamma(x+1.25) = log gamma(1.25) + x P(x)/Q(x)
621 1.125 <= x+1.25 <= 1.375
622 Peak relative error = 4.9e-36 */
623 static const __float128 lgam1r25a
= -9.82818603515625E-2Q
;
624 static const __float128 lgam1r25b
= 1.0023929749338536146197303364159774377296E-5Q
;
626 static const __float128 RN1r25
[NRN1r25
+ 1] =
628 -9.054787275312026472896002240379580536760E4Q
,
629 -8.685076892989927640126560802094680794471E4Q
,
630 2.797898965448019916967849727279076547109E5Q
,
631 6.175520827134342734546868356396008898299E5Q
,
632 5.179626599589134831538516906517372619641E5Q
,
633 2.253076616239043944538380039205558242161E5Q
,
634 5.312653119599957228630544772499197307195E4Q
,
635 6.434329437514083776052669599834938898255E3Q
,
636 3.385414416983114598582554037612347549220E2Q
,
637 4.907821957946273805080625052510832015792E0Q
640 static const __float128 RD1r25
[NRD1r25
+ 1] =
642 3.980939377333448005389084785896660309000E5Q
,
643 1.429634893085231519692365775184490465542E6Q
,
644 2.145438946455476062850151428438668234336E6Q
,
645 1.743786661358280837020848127465970357893E6Q
,
646 8.316364251289743923178092656080441655273E5Q
,
647 2.355732939106812496699621491135458324294E5Q
,
648 3.822267399625696880571810137601310855419E4Q
,
649 3.228463206479133236028576845538387620856E3Q
,
650 1.152133170470059555646301189220117965514E2Q
655 /* log gamma(x + 1) = x P(x)/Q(x)
658 Peak relative error 1.1e-35 */
660 static const __float128 RN1
[NRN1
+ 1] =
662 -9.987560186094800756471055681088744738818E3Q
,
663 -2.506039379419574361949680225279376329742E4Q
,
664 -1.386770737662176516403363873617457652991E4Q
,
665 1.439445846078103202928677244188837130744E4Q
,
666 2.159612048879650471489449668295139990693E4Q
,
667 1.047439813638144485276023138173676047079E4Q
,
668 2.250316398054332592560412486630769139961E3Q
,
669 1.958510425467720733041971651126443864041E2Q
,
670 4.516830313569454663374271993200291219855E0Q
673 static const __float128 RD1
[NRD1
+ 1] =
675 1.730299573175751778863269333703788214547E4Q
,
676 6.807080914851328611903744668028014678148E4Q
,
677 1.090071629101496938655806063184092302439E5Q
,
678 9.124354356415154289343303999616003884080E4Q
,
679 4.262071638655772404431164427024003253954E4Q
,
680 1.096981664067373953673982635805821283581E4Q
,
681 1.431229503796575892151252708527595787588E3Q
,
682 7.734110684303689320830401788262295992921E1Q
687 /* log gamma(x + 1) = x P(x)/Q(x)
690 Peak relative error 7.0e-37 */
692 static const __float128 RNr9
[NRNr9
+ 1] =
694 4.441379198241760069548832023257571176884E5Q
,
695 1.273072988367176540909122090089580368732E6Q
,
696 9.732422305818501557502584486510048387724E5Q
,
697 -5.040539994443998275271644292272870348684E5Q
,
698 -1.208719055525609446357448132109723786736E6Q
,
699 -7.434275365370936547146540554419058907156E5Q
,
700 -2.075642969983377738209203358199008185741E5Q
,
701 -2.565534860781128618589288075109372218042E4Q
,
702 -1.032901669542994124131223797515913955938E3Q
,
705 static const __float128 RDr9
[NRDr9
+ 1] =
707 -7.694488331323118759486182246005193998007E5Q
,
708 -3.301918855321234414232308938454112213751E6Q
,
709 -5.856830900232338906742924836032279404702E6Q
,
710 -5.540672519616151584486240871424021377540E6Q
,
711 -3.006530901041386626148342989181721176919E6Q
,
712 -9.350378280513062139466966374330795935163E5Q
,
713 -1.566179100031063346901755685375732739511E5Q
,
714 -1.205016539620260779274902967231510804992E4Q
,
715 -2.724583156305709733221564484006088794284E2Q
720 /* Evaluate P[n] x^n + P[n-1] x^(n-1) + ... + P[0] */
723 neval (__float128 x
, const __float128
*p
, int n
)
738 /* Evaluate x^n+1 + P[n] x^(n) + P[n-1] x^(n-1) + ... + P[0] */
741 deval (__float128 x
, const __float128
*p
, int n
)
757 lgammaq (__float128 x
)
759 __float128 p
, q
, w
, z
, nx
;
778 return (one
/ (p
- p
));
790 z
= q
* sinq (PIQ
* z
);
792 return (sign
* huge
* huge
);
794 z
= logq (PIQ
/ z
) - w
;
801 nx
= floorq (x
+ 0.5Q
);
806 /* log gamma (x + 1) = log(x) + log gamma(x) */
809 p
= x
* neval (x
, RN1
, NRN1
) / deval (x
, RD1
, NRD1
);
814 p
= z
* neval (z
, RN1r25
, NRN1r25
) / deval (z
, RD1r25
, NRD1r25
);
820 z
= x
+ (1.0Q
- x0a
);
822 p
= neval (z
, RN1r5
, NRN1r5
) / deval (z
, RD1r5
, NRD1r5
);
830 p
= z
* neval (z
, RN1r75
, NRN1r75
) / deval (z
, RD1r75
, NRD1r75
);
837 p
= z
* neval (z
, RN2
, NRN2
) / deval (z
, RD2
, NRD2
);
847 z
= x
+ (1.0Q
- x0a
);
849 p
= neval (z
, RN1r5
, NRN1r5
) / deval (z
, RD1r5
, NRD1r5
);
857 p
= z
* neval (z
, RN1r75
, NRN1r75
)
858 / deval (z
, RD1r75
, NRD1r75
);
865 p
= z
* neval (z
, RN2
, NRN2
) / deval (z
, RD2
, NRD2
);
872 p
= z
* neval (z
, RNr9
, NRNr9
) / deval (z
, RDr9
, NRDr9
);
876 else if (x
<= 1.125Q
)
879 p
= z
* neval (z
, RN1
, NRN1
) / deval (z
, RD1
, NRD1
);
884 p
= z
* neval (z
, RN1r25
, NRN1r25
) / deval (z
, RD1r25
, NRD1r25
);
890 /* 1.375 <= x+x0 <= 1.625 */
893 p
= neval (z
, RN1r5
, NRN1r5
) / deval (z
, RD1r5
, NRD1r5
);
905 p
= neval (z
, RN1r5
, NRN1r5
) / deval (z
, RD1r5
, NRD1r5
);
913 p
= z
* neval (z
, RN1r75
, NRN1r75
) / deval (z
, RD1r75
, NRD1r75
);
922 p
= z
* neval (z
, RN2
, NRN2
) / deval (z
, RD2
, NRD2
);
927 p
= z
* neval (z
, RN2r5
, NRN2r5
) / deval (z
, RD2r5
, NRD2r5
);
937 p
= z
* neval (z
, RN2r5
, NRN2r5
) / deval (z
, RD2r5
, NRD2r5
);
944 p
= z
* neval (z
, RN3
, NRN3
) / deval (z
, RD3
, NRD3
);
952 p
= z
* neval (z
, RN4
, NRN4
) / deval (z
, RD4
, NRD4
);
959 p
= z
* neval (z
, RN5
, NRN5
) / deval (z
, RD5
, NRD5
);
966 p
= z
* neval (z
, RN6
, NRN6
) / deval (z
, RD6
, NRD6
);
973 p
= z
* neval (z
, RN7
, NRN7
) / deval (z
, RD7
, NRD7
);
980 p
= z
* neval (z
, RN8
, NRN8
) / deval (z
, RD8
, NRD8
);
987 p
= z
* neval (z
, RN9
, NRN9
) / deval (z
, RD9
, NRD9
);
994 p
= z
* neval (z
, RN10
, NRN10
) / deval (z
, RD10
, NRD10
);
1001 p
= z
* neval (z
, RN11
, NRN11
) / deval (z
, RD11
, NRD11
);
1008 p
= z
* neval (z
, RN12
, NRN12
) / deval (z
, RD12
, NRD12
);
1015 p
= z
* neval (z
, RN13
, NRN13
) / deval (z
, RD13
, NRD13
);
1024 return (sign
* huge
* huge
);
1027 q
= (x
- 0.5Q
) * logq (x
) + q
;
1032 q
+= neval (p
, RASY
, NRASY
) / x
;