/* lgammal
*
* Natural logarithm of gamma function
*
*
*
* SYNOPSIS :
*
* long double x , y , lgammal ( ) ;
* extern int sgngam ;
*
* y = lgammal ( x ) ;
*
*
*
* DESCRIPTION :
*
* Returns the base e ( 2 . 718 . . . ) logarithm of the absolute
* value of the gamma function of the argument .
* The sign ( + 1 or - 1 ) of the gamma function is returned in a
* global ( extern ) variable named sgngam .
*
* The positive domain is partitioned into numerous segments for approximation .
* For x > 10 ,
* log gamma ( x ) = ( x - 0 . 5 ) log ( x ) - x + log sqrt ( 2 pi ) + 1 / x R ( 1 / x ^ 2 )
* Near the minimum at x = x0 = 1 . 46 . . . the approximation is
* log gamma ( x0 + z ) = log gamma ( x0 ) + z ^ 2 P ( z ) / Q ( z )
* for small z .
* Elsewhere between 0 and 10 ,
* log gamma ( n + z ) = log gamma ( n ) + z P ( z ) / Q ( z )
* for various selected n and small z .
*
* The cosecant reflection formula is employed for negative arguments .
*
*
* ACCURACY :
*
*
* arithmetic domain # trials peak rms
* Relative error :
* IEEE 10 , 30 100000 3 . 9 e - 34 9 . 8 e - 35
* IEEE 0 , 10 100000 3 . 8 e - 34 5 . 3 e - 35
* Absolute error :
* IEEE - 10 , 0 100000 8 . 0 e - 34 8 . 0 e - 35
* IEEE - 30 , - 10 100000 4 . 4 e - 34 1 . 0 e - 34
* IEEE - 100 , 100 100000 1 . 0 e - 34
*
* The absolute error criterion is the same as relative error
* when the function magnitude is greater than one but it is absolute
* when the magnitude is less than one .
*
*/
/* Copyright 2001 by Stephen L. Moshier <moshier@na-net.ornl.gov> */
#include "mconf.h"
static long double PIL = 3 .1415926535897932384626433832795028841972 E0L;
static long double MAXLGM = 1 .0485738685148938358098967157129705071571 E4928L;
static long double one = 1 .0 L;
static long double zero = 0 .0 L;
static long double huge = 1 .0 e4000L;
extern long double sinl (long double );
extern int isnanl (long double );
extern int isfinitel (long double );
extern long double floorl (long double );
extern long double logl (long double );
extern long double MAXNUML;
int sgngaml;
/* log gamma(x) = ( x - 0.5 ) * log(x) - x + LS2PI + 1/x P(1/x^2)
1 / x < = 0 . 0741 ( x > = 13 . 495 . . . )
Peak relative error 1.5e-36 */
static long double ls2pi = 9 .1893853320467274178032973640561763986140 E-1 L;
#define NRASY 12
static long double RASY[NRASY + 1 ] =
{
8 .333333333333333333333333333310437112111 E-2 L,
-2 .777777777777777777777774789556228296902 E-3 L,
7 .936507936507936507795933938448586499183 E-4 L,
-5 .952380952380952041799269756378148574045 E-4 L,
8 .417508417507928904209891117498524452523 E-4 L,
-1 .917526917481263997778542329739806086290 E-3 L,
6 .410256381217852504446848671499409919280 E-3 L,
-2 .955064066900961649768101034477363301626 E-2 L,
1 .796402955865634243663453415388336954675 E-1 L,
-1 .391522089007758553455753477688592767741 E0L,
1 .326130089598399157988112385013829305510 E1L,
-1 .420412699593782497803472576479997819149 E2L,
1 .218058922427762808938869872528846787020 E3L
};
/* log gamma(x+13) = log gamma(13) + x P(x)/Q(x)
- 0 . 5 < = x < = 0 . 5
12 . 5 < = x + 13 < = 13 . 5
Peak relative error 1.1e-36 */
static long double lgam13a = 1 .9987213134765625 E1L;
static long double lgam13b = 1 .3608962611495173623870550785125024484248 E-6 L;
#define NRN13 7
static long double RN13[NRN13 + 1 ] =
{
8 .591478354823578150238226576156275285700 E11L,
2 .347931159756482741018258864137297157668 E11L,
2 .555408396679352028680662433943000804616 E10L,
1 .408581709264464345480765758902967123937 E9L,
4 .126759849752613822953004114044451046321 E7L,
6 .133298899622688505854211579222889943778 E5L,
3 .929248056293651597987893340755876578072 E3L,
6 .850783280018706668924952057996075215223 E0L
};
#define NRD13 6
static long double RD13[NRD13 + 1 ] =
{
3 .401225382297342302296607039352935541669 E11L,
8 .756765276918037910363513243563234551784 E10L,
8 .873913342866613213078554180987647243903 E9L,
4 .483797255342763263361893016049310017973 E8L,
1 .178186288833066430952276702931512870676 E7L,
1 .519928623743264797939103740132278337476 E5L,
7 .989298844938119228411117593338850892311 E2L
/* 1.0E0L */
};
/* log gamma(x+12) = log gamma(12) + x P(x)/Q(x)
- 0 . 5 < = x < = 0 . 5
11 . 5 < = x + 12 < = 12 . 5
Peak relative error 4.1e-36 */
static long double lgam12a = 1 .75023040771484375 E1L;
static long double lgam12b = 3 .7687254483392876529072161996717039575982 E-6 L;
#define NRN12 7
static long double RN12[NRN12 + 1 ] =
{
4 .709859662695606986110997348630997559137 E11L,
1 .398713878079497115037857470168777995230 E11L,
1 .654654931821564315970930093932954900867 E10L,
9 .916279414876676861193649489207282144036 E8L,
3 .159604070526036074112008954113411389879 E7L,
5 .109099197547205212294747623977502492861 E5L,
3 .563054878276102790183396740969279826988 E3L,
6 .769610657004672719224614163196946862747 E0L
};
#define NRD12 6
static long double RD12[NRD12 + 1 ] =
{
1 .928167007860968063912467318985802726613 E11L,
5 .383198282277806237247492369072266389233 E10L,
5 .915693215338294477444809323037871058363 E9L,
3 .241438287570196713148310560147925781342 E8L,
9 .236680081763754597872713592701048455890 E6L,
1 .292246897881650919242713651166596478850 E5L,
7 .366532445427159272584194816076600211171 E2L
/* 1.0E0L */
};
/* log gamma(x+11) = log gamma(11) + x P(x)/Q(x)
- 0 . 5 < = x < = 0 . 5
10 . 5 < = x + 11 < = 11 . 5
Peak relative error 1.8e-35 */
static long double lgam11a = 1 .5104400634765625 E1L;
static long double lgam11b = 1 .1938309890295225709329251070371882250744 E-5 L;
#define NRN11 7
static long double RN11[NRN11 + 1 ] =
{
2 .446960438029415837384622675816736622795 E11L,
7 .955444974446413315803799763901729640350 E10L,
1 .030555327949159293591618473447420338444 E10L,
6 .765022131195302709153994345470493334946 E8L,
2 .361892792609204855279723576041468347494 E7L,
4 .186623629779479136428005806072176490125 E5L,
3 .202506022088912768601325534149383594049 E3L,
6 .681356101133728289358838690666225691363 E0L
};
#define NRD11 6
static long double RD11[NRD11 + 1 ] =
{
1 .040483786179428590683912396379079477432 E11L,
3 .172251138489229497223696648369823779729 E10L,
3 .806961885984850433709295832245848084614 E9L,
2 .278070344022934913730015420611609620171 E8L,
7 .089478198662651683977290023829391596481 E6L,
1 .083246385105903533237139380509590158658 E5L,
6 .744420991491385145885727942219463243597 E2L
/* 1.0E0L */
};
/* log gamma(x+10) = log gamma(10) + x P(x)/Q(x)
- 0 . 5 < = x < = 0 . 5
9 . 5 < = x + 10 < = 10 . 5
Peak relative error 5.4e-37 */
static long double lgam10a = 1 .280181884765625 E1L;
static long double lgam10b = 8 .6324252196112077178745667061642811492557 E-6 L;
#define NRN10 7
static long double RN10[NRN10 + 1 ] =
{
-1 .239059737177249934158597996648808363783 E14L,
-4 .725899566371458992365624673357356908719 E13L,
-7 .283906268647083312042059082837754850808 E12L,
-5 .802855515464011422171165179767478794637 E11L,
-2 .532349691157548788382820303182745897298 E10L,
-5 .884260178023777312587193693477072061820 E8L,
-6 .437774864512125749845840472131829114906 E6L,
-2 .350975266781548931856017239843273049384 E4L
};
#define NRD10 7
static long double RD10[NRD10 + 1 ] =
{
-5 .502645997581822567468347817182347679552 E13L,
-1 .970266640239849804162284805400136473801 E13L,
-2 .819677689615038489384974042561531409392 E12L,
-2 .056105863694742752589691183194061265094 E11L,
-8 .053670086493258693186307810815819662078 E9L,
-1 .632090155573373286153427982504851867131 E8L,
-1 .483575879240631280658077826889223634921 E6L,
-4 .002806669713232271615885826373550502510 E3L
/* 1.0E0L */
};
/* log gamma(x+9) = log gamma(9) + x P(x)/Q(x)
- 0 . 5 < = x < = 0 . 5
8 . 5 < = x + 9 < = 9 . 5
Peak relative error 3.6e-36 */
static long double lgam9a = 1 .06045989990234375 E1L;
static long double lgam9b = 3 .9037218127284172274007216547549861681400 E-6 L;
#define NRN9 7
static long double RN9[NRN9 + 1 ] =
{
-4 .936332264202687973364500998984608306189 E13L,
-2 .101372682623700967335206138517766274855 E13L,
-3 .615893404644823888655732817505129444195 E12L,
-3 .217104993800878891194322691860075472926 E11L,
-1 .568465330337375725685439173603032921399 E10L,
-4 .073317518162025744377629219101510217761 E8L,
-4 .983232096406156139324846656819246974500 E6L,
-2 .036280038903695980912289722995505277253 E4L
};
#define NRD9 7
static long double RD9[NRD9 + 1 ] =
{
-2 .306006080437656357167128541231915480393 E13L,
-9 .183606842453274924895648863832233799950 E12L,
-1 .461857965935942962087907301194381010380 E12L,
-1 .185728254682789754150068652663124298303 E11L,
-5 .166285094703468567389566085480783070037 E9L,
-1 .164573656694603024184768200787835094317 E8L,
-1 .177343939483908678474886454113163527909 E6L,
-3 .529391059783109732159524500029157638736 E3L
/* 1.0E0L */
};
/* log gamma(x+8) = log gamma(8) + x P(x)/Q(x)
- 0 . 5 < = x < = 0 . 5
7 . 5 < = x + 8 < = 8 . 5
Peak relative error 2.4e-37 */
static long double lgam8a = 8 .525146484375 E0L;
static long double lgam8b = 1 .4876690414300165531036347125050759667737 E-5 L;
#define NRN8 8
static long double RN8[NRN8 + 1 ] =
{
6 .600775438203423546565361176829139703289 E11L,
3 .406361267593790705240802723914281025800 E11L,
7 .222460928505293914746983300555538432830 E10L,
8 .102984106025088123058747466840656458342 E9L,
5 .157620015986282905232150979772409345927 E8L,
1 .851445288272645829028129389609068641517 E7L,
3 .489261702223124354745894067468953756656 E5L,
2 .892095396706665774434217489775617756014 E3L,
6 .596977510622195827183948478627058738034 E0L
};
#define NRD8 7
static long double RD8[NRD8 + 1 ] =
{
3 .274776546520735414638114828622673016920 E11L,
1 .581811207929065544043963828487733970107 E11L,
3 .108725655667825188135393076860104546416 E10L,
3 .193055010502912617128480163681842165730 E9L,
1 .830871482669835106357529710116211541839 E8L,
5 .790862854275238129848491555068073485086 E6L,
9 .305213264307921522842678835618803553589 E4L,
6 .216974105861848386918949336819572333622 E2L
/* 1.0E0L */
};
/* log gamma(x+7) = log gamma(7) + x P(x)/Q(x)
- 0 . 5 < = x < = 0 . 5
6 . 5 < = x + 7 < = 7 . 5
Peak relative error 3.2e-36 */
static long double lgam7a = 6 .5792388916015625 E0L;
static long double lgam7b = 1 .2320408538495060178292903945321122583007 E-5 L;
#define NRN7 8
static long double RN7[NRN7 + 1 ] =
{
2 .065019306969459407636744543358209942213 E11L,
1 .226919919023736909889724951708796532847 E11L,
2 .996157990374348596472241776917953749106 E10L,
3 .873001919306801037344727168434909521030 E9L,
2 .841575255593761593270885753992732145094 E8L,
1 .176342515359431913664715324652399565551 E7L,
2 .558097039684188723597519300356028511547 E5L,
2 .448525238332609439023786244782810774702 E3L,
6 .460280377802030953041566617300902020435 E0L
};
#define NRD7 7
static long double RD7[NRD7 + 1 ] =
{
1 .102646614598516998880874785339049304483 E11L,
6 .099297512712715445879759589407189290040 E10L,
1 .372898136289611312713283201112060238351 E10L,
1 .615306270420293159907951633566635172343 E9L,
1 .061114435798489135996614242842561967459 E8L,
3 .845638971184305248268608902030718674691 E6L,
7 .081730675423444975703917836972720495507 E4L,
5 .423122582741398226693137276201344096370 E2L
/* 1.0E0L */
};
/* log gamma(x+6) = log gamma(6) + x P(x)/Q(x)
- 0 . 5 < = x < = 0 . 5
5 . 5 < = x + 6 < = 6 . 5
Peak relative error 6.2e-37 */
static long double lgam6a = 4 .7874908447265625 E0L;
static long double lgam6b = 8 .9805548349424770093452324304839959231517 E-7 L;
#define NRN6 8
static long double RN6[NRN6 + 1 ] =
{
-3 .538412754670746879119162116819571823643 E13L,
-2 .613432593406849155765698121483394257148 E13L,
-8 .020670732770461579558867891923784753062 E12L,
-1 .322227822931250045347591780332435433420 E12L,
-1 .262809382777272476572558806855377129513 E11L,
-7 .015006277027660872284922325741197022467 E9L,
-2 .149320689089020841076532186783055727299 E8L,
-3 .167210585700002703820077565539658995316 E6L,
-1 .576834867378554185210279285358586385266 E4L
};
#define NRD6 8
static long double RD6[NRD6 + 1 ] =
{
-2 .073955870771283609792355579558899389085 E13L,
-1 .421592856111673959642750863283919318175 E13L,
-4 .012134994918353924219048850264207074949 E12L,
-6 .013361045800992316498238470888523722431 E11L,
-5 .145382510136622274784240527039643430628 E10L,
-2 .510575820013409711678540476918249524123 E9L,
-6 .564058379709759600836745035871373240904 E7L,
-7 .861511116647120540275354855221373571536 E5L,
-2 .821943442729620524365661338459579270561 E3L
/* 1.0E0L */
};
/* log gamma(x+5) = log gamma(5) + x P(x)/Q(x)
- 0 . 5 < = x < = 0 . 5
4 . 5 < = x + 5 < = 5 . 5
Peak relative error 3.4e-37 */
static long double lgam5a = 3 .17803955078125 E0L;
static long double lgam5b = 1 .4279566695619646941601297055408873990961 E-5 L;
#define NRN5 9
static long double RN5[NRN5 + 1 ] =
{
2 .010952885441805899580403215533972172098 E11L,
1 .916132681242540921354921906708215338584 E11L,
7 .679102403710581712903937970163206882492 E10L,
1 .680514903671382470108010973615268125169 E10L,
2 .181011222911537259440775283277711588410 E9L,
1 .705361119398837808244780667539728356096 E8L,
7 .792391565652481864976147945997033946360 E6L,
1 .910741381027985291688667214472560023819 E5L,
2 .088138241893612679762260077783794329559 E3L,
6 .330318119566998299106803922739066556550 E0L
};
#define NRD5 8
static long double RD5[NRD5 + 1 ] =
{
1 .335189758138651840605141370223112376176 E11L,
1 .174130445739492885895466097516530211283 E11L,
4 .308006619274572338118732154886328519910 E10L,
8 .547402888692578655814445003283720677468 E9L,
9 .934628078575618309542580800421370730906 E8L,
6 .847107420092173812998096295422311820672 E7L,
2 .698552646016599923609773122139463150403 E6L,
5 .526516251532464176412113632726150253215 E4L,
4 .772343321713697385780533022595450486932 E2L
/* 1.0E0L */
};
/* log gamma(x+4) = log gamma(4) + x P(x)/Q(x)
- 0 . 5 < = x < = 0 . 5
3 . 5 < = x + 4 < = 4 . 5
Peak relative error 6.7e-37 */
static long double lgam4a = 1 .791748046875 E0L;
static long double lgam4b = 1 .1422353055000812477358380702272722990692 E-5 L;
#define NRN4 9
static long double RN4[NRN4 + 1 ] =
{
-1 .026583408246155508572442242188887829208 E13L,
-1 .306476685384622809290193031208776258809 E13L,
-7 .051088602207062164232806511992978915508 E12L,
-2 .100849457735620004967624442027793656108 E12L,
-3 .767473790774546963588549871673843260569 E11L,
-4 .156387497364909963498394522336575984206 E10L,
-2 .764021460668011732047778992419118757746 E9L,
-1 .036617204107109779944986471142938641399 E8L,
-1 .895730886640349026257780896972598305443 E6L,
-1 .180509051468390914200720003907727988201 E4L
};
#define NRD4 9
static long double RD4[NRD4 + 1 ] =
{
-8 .172669122056002077809119378047536240889 E12L,
-9 .477592426087986751343695251801814226960 E12L,
-4 .629448850139318158743900253637212801682 E12L,
-1 .237965465892012573255370078308035272942 E12L,
-1 .971624313506929845158062177061297598956 E11L,
-1 .905434843346570533229942397763361493610 E10L,
-1 .089409357680461419743730978512856675984 E9L,
-3 .416703082301143192939774401370222822430 E7L,
-4 .981791914177103793218433195857635265295 E5L,
-2 .192507743896742751483055798411231453733 E3L
/* 1.0E0L */
};
/* log gamma(x+3) = log gamma(3) + x P(x)/Q(x)
- 0 . 25 < = x < = 0 . 5
2 . 75 < = x + 3 < = 3 . 5
Peak relative error 6.0e-37 */
static long double lgam3a = 6 .93145751953125 E-1 L;
static long double lgam3b = 1 .4286068203094172321214581765680755001344 E-6 L;
#define NRN3 9
static long double RN3[NRN3 + 1 ] =
{
-4 .813901815114776281494823863935820876670 E11L,
-8 .425592975288250400493910291066881992620 E11L,
-6 .228685507402467503655405482985516909157 E11L,
-2 .531972054436786351403749276956707260499 E11L,
-6 .170200796658926701311867484296426831687 E10L,
-9 .211477458528156048231908798456365081135 E9L,
-8 .251806236175037114064561038908691305583 E8L,
-4 .147886355917831049939930101151160447495 E7L,
-1 .010851868928346082547075956946476932162 E6L,
-8 .333374463411801009783402800801201603736 E3L
};
#define NRD3 9
static long double RD3[NRD3 + 1 ] =
{
-5 .216713843111675050627304523368029262450 E11L,
-8 .014292925418308759369583419234079164391 E11L,
-5 .180106858220030014546267824392678611990 E11L,
-1 .830406975497439003897734969120997840011 E11L,
-3 .845274631904879621945745960119924118925 E10L,
-4 .891033385370523863288908070309417710903 E9L,
-3 .670172254411328640353855768698287474282 E8L,
-1 .505316381525727713026364396635522516989 E7L,
-2 .856327162923716881454613540575964890347 E5L,
-1 .622140448015769906847567212766206894547 E3L
/* 1.0E0L */
};
/* log gamma(x+2.5) = log gamma(2.5) + x P(x)/Q(x)
- 0 . 125 < = x < = 0 . 25
2 . 375 < = x + 2 . 5 < = 2 . 75
gamma(2.5) = 3 sqrt(pi) / 4 */
static long double lgam2r5a = 2 .8466796875 E-1 L;
static long double lgam2r5b = 1 .4901722919159632494669682701924320137696 E-5 L;
#define NRN2r5 8
static long double RN2r5[NRN2r5 + 1 ] =
{
-4 .676454313888335499356699817678862233205 E9L,
-9 .361888347911187924389905984624216340639 E9L,
-7 .695353600835685037920815799526540237703 E9L,
-3 .364370100981509060441853085968900734521 E9L,
-8 .449902011848163568670361316804900559863 E8L,
-1 .225249050950801905108001246436783022179 E8L,
-9 .732972931077110161639900388121650470926 E6L,
-3 .695711763932153505623248207576425983573 E5L,
-4 .717341584067827676530426007495274711306 E3L
};
#define NRD2r5 8
static long double RD2r5[NRD2r5 + 1 ] =
{
-6 .650657966618993679456019224416926875619 E9L,
-1 .099511409330635807899718829033488771623 E10L,
-7 .482546968307837168164311101447116903148 E9L,
-2 .702967190056506495988922973755870557217 E9L,
-5 .570008176482922704972943389590409280950 E8L,
-6 .536934032192792470926310043166993233231 E7L,
-4 .101991193844953082400035444146067511725 E6L,
-1 .174082735875715802334430481065526664020 E5L,
-9 .932840389994157592102947657277692978511 E2L
/* 1.0E0L */
};
/* log gamma(x+2) = x P(x)/Q(x)
- 0 . 125 < = x < = + 0 . 375
1 . 875 < = x + 2 < = 2 . 375
Peak relative error 4.6e-36 */
#define NRN2 9
static long double RN2[NRN2 + 1 ] =
{
-3 .716661929737318153526921358113793421524 E9L,
-1 .138816715030710406922819131397532331321 E10L,
-1 .421017419363526524544402598734013569950 E10L,
-9 .510432842542519665483662502132010331451 E9L,
-3 .747528562099410197957514973274474767329 E9L,
-8 .923565763363912474488712255317033616626 E8L,
-1 .261396653700237624185350402781338231697 E8L,
-9 .918402520255661797735331317081425749014 E6L,
-3 .753996255897143855113273724233104768831 E5L,
-4 .778761333044147141559311805999540765612 E3L
};
#define NRD2 9
static long double RD2[NRD2 + 1 ] =
{
-8 .790916836764308497770359421351673950111 E9L,
-2 .023108608053212516399197678553737477486 E10L,
-1 .958067901852022239294231785363504458367 E10L,
-1 .035515043621003101254252481625188704529 E10L,
-3 .253884432621336737640841276619272224476 E9L,
-6 .186383531162456814954947669274235815544 E8L,
-6 .932557847749518463038934953605969951466 E7L,
-4 .240731768287359608773351626528479703758 E6L,
-1 .197343995089189188078944689846348116630 E5L,
-1 .004622911670588064824904487064114090920 E3L
/* 1.0E0 */
};
/* log gamma(x+1.75) = log gamma(1.75) + x P(x)/Q(x)
- 0 . 125 < = x < = + 0 . 125
1 . 625 < = x + 1 . 75 < = 1 . 875
Peak relative error 9.2e-37 */
static long double lgam1r75a = -8 .441162109375 E-2 L;
static long double lgam1r75b = 1 .0500073264444042213965868602268256157604 E-5 L;
#define NRN1r75 8
static long double RN1r75[NRN1r75 + 1 ] =
{
-5 .221061693929833937710891646275798251513 E7L,
-2 .052466337474314812817883030472496436993 E8L,
-2 .952718275974940270675670705084125640069 E8L,
-2 .132294039648116684922965964126389017840 E8L,
-8 .554103077186505960591321962207519908489 E7L,
-1 .940250901348870867323943119132071960050 E7L,
-2 .379394147112756860769336400290402208435 E6L,
-1 .384060879999526222029386539622255797389 E5L,
-2 .698453601378319296159355612094598695530 E3L
};
#define NRD1r75 8
static long double RD1r75[NRD1r75 + 1 ] =
{
-2 .109754689501705828789976311354395393605 E8L,
-5 .036651829232895725959911504899241062286 E8L,
-4 .954234699418689764943486770327295098084 E8L,
-2 .589558042412676610775157783898195339410 E8L,
-7 .731476117252958268044969614034776883031 E7L,
-1 .316721702252481296030801191240867486965 E7L,
-1 .201296501404876774861190604303728810836 E6L,
-5 .007966406976106636109459072523610273928 E4L,
-6 .155817990560743422008969155276229018209 E2L
/* 1.0E0L */
};
/* log gamma(x+x0) = y0 + x^2 P(x)/Q(x)
- 0 . 0867 < = x < = + 0 . 1634
1 . 374932 . . . < = x + x0 < = 1 . 625032 . . .
Peak relative error 4.0e-36 */
static long double x0a = 1 .4616241455078125 L;
static long double x0b = 7 .9994605498412626595423257213002588621246 E-6 L;
static long double y0a = -1 .21490478515625 E-1 L;
static long double y0b = 4 .1879797753919044854428223084178486438269 E-6 L;
#define NRN1r5 8
static long double RN1r5[NRN1r5 + 1 ] =
{
6 .827103657233705798067415468881313128066 E5L,
1 .910041815932269464714909706705242148108 E6L,
2 .194344176925978377083808566251427771951 E6L,
1 .332921400100891472195055269688876427962 E6L,
4 .589080973377307211815655093824787123508 E5L,
8 .900334161263456942727083580232613796141 E4L,
9 .053840838306019753209127312097612455236 E3L,
4 .053367147553353374151852319743594873771 E2L,
5 .040631576303952022968949605613514584950 E0L
};
#define NRD1r5 8
static long double RD1r5[NRD1r5 + 1 ] =
{
1 .411036368843183477558773688484699813355 E6L,
4 .378121767236251950226362443134306184849 E6L,
5 .682322855631723455425929877581697918168 E6L,
3 .999065731556977782435009349967042222375 E6L,
1 .653651390456781293163585493620758410333 E6L,
4 .067774359067489605179546964969435858311 E5L,
5 .741463295366557346748361781768833633256 E4L,
4 .226404539738182992856094681115746692030 E3L,
1 .316980975410327975566999780608618774469 E2L,
/* 1.0E0L */
};
/* log gamma(x+1.25) = log gamma(1.25) + x P(x)/Q(x)
- . 125 < = x < = + . 125
1 . 125 < = x + 1 . 25 < = 1 . 375
Peak relative error = 4.9e-36 */
static long double lgam1r25a = -9 .82818603515625 E-2 L;
static long double lgam1r25b = 1 .0023929749338536146197303364159774377296 E-5 L;
#define NRN1r25 9
static long double RN1r25[NRN1r25 + 1 ] =
{
-9 .054787275312026472896002240379580536760 E4L,
-8 .685076892989927640126560802094680794471 E4L,
2 .797898965448019916967849727279076547109 E5L,
6 .175520827134342734546868356396008898299 E5L,
5 .179626599589134831538516906517372619641 E5L,
2 .253076616239043944538380039205558242161 E5L,
5 .312653119599957228630544772499197307195 E4L,
6 .434329437514083776052669599834938898255 E3L,
3 .385414416983114598582554037612347549220 E2L,
4 .907821957946273805080625052510832015792 E0L
};
#define NRD1r25 8
static long double RD1r25[NRD1r25 + 1 ] =
{
3 .980939377333448005389084785896660309000 E5L,
1 .429634893085231519692365775184490465542 E6L,
2 .145438946455476062850151428438668234336 E6L,
1 .743786661358280837020848127465970357893 E6L,
8 .316364251289743923178092656080441655273 E5L,
2 .355732939106812496699621491135458324294 E5L,
3 .822267399625696880571810137601310855419 E4L,
3 .228463206479133236028576845538387620856 E3L,
1 .152133170470059555646301189220117965514 E2L
/* 1.0E0L */
};
/* log gamma(x + 1) = x P(x)/Q(x)
0 . 0 < = x < = + 0 . 125
1 . 0 < = x + 1 < = 1 . 125
Peak relative error 1.1e-35 */
#define NRN1 8
static long double RN1[NRN1 + 1 ] =
{
-9 .987560186094800756471055681088744738818 E3L,
-2 .506039379419574361949680225279376329742 E4L,
-1 .386770737662176516403363873617457652991 E4L,
1 .439445846078103202928677244188837130744 E4L,
2 .159612048879650471489449668295139990693 E4L,
1 .047439813638144485276023138173676047079 E4L,
2 .250316398054332592560412486630769139961 E3L,
1 .958510425467720733041971651126443864041 E2L,
4 .516830313569454663374271993200291219855 E0L
};
#define NRD1 7
static long double RD1[NRD1 + 1 ] =
{
1 .730299573175751778863269333703788214547 E4L,
6 .807080914851328611903744668028014678148 E4L,
1 .090071629101496938655806063184092302439 E5L,
9 .124354356415154289343303999616003884080 E4L,
4 .262071638655772404431164427024003253954 E4L,
1 .096981664067373953673982635805821283581 E4L,
1 .431229503796575892151252708527595787588 E3L,
7 .734110684303689320830401788262295992921 E1L
/* 1.000000000000000000000000000000000000000E0 */
};
/* log gamma(x + 1) = x P(x)/Q(x)
- 0 . 125 < = x < = 0
0 . 875 < = x + 1 < = 1 . 0
Peak relative error 7.0e-37 */
#define NRNr9 8
static long double RNr9[NRNr9 + 1 ] =
{
4 .441379198241760069548832023257571176884 E5L,
1 .273072988367176540909122090089580368732 E6L,
9 .732422305818501557502584486510048387724 E5L,
-5 .040539994443998275271644292272870348684 E5L,
-1 .208719055525609446357448132109723786736 E6L,
-7 .434275365370936547146540554419058907156 E5L,
-2 .075642969983377738209203358199008185741 E5L,
-2 .565534860781128618589288075109372218042 E4L,
-1 .032901669542994124131223797515913955938 E3L,
};
#define NRDr9 8
static long double RDr9[NRDr9 + 1 ] =
{
-7 .694488331323118759486182246005193998007 E5L,
-3 .301918855321234414232308938454112213751 E6L,
-5 .856830900232338906742924836032279404702 E6L,
-5 .540672519616151584486240871424021377540 E6L,
-3 .006530901041386626148342989181721176919 E6L,
-9 .350378280513062139466966374330795935163 E5L,
-1 .566179100031063346901755685375732739511 E5L,
-1 .205016539620260779274902967231510804992 E4L,
-2 .724583156305709733221564484006088794284 E2L
/* 1.000000000000000000000000000000000000000E0 */
};
/* Evaluate P[n] x^n + P[n-1] x^(n-1) + ... + P[0] */
static long double
neval (long double x, long double *p, int n)
{
long double y;
p += n;
y = *p--;
do
{
y = y * x + *p--;
}
while (--n > 0 );
return y;
}
/* Evaluate x^n+1 + P[n] x^(n) + P[n-1] x^(n-1) + ... + P[0] */
static long double
deval (long double x, long double *p, int n)
{
long double y;
p += n;
y = x + *p--;
do
{
y = y * x + *p--;
}
while (--n > 0 );
return y;
}
long double
lgammal (x)
long double x;
{
long double p, q, w, z, nx;
int i, nn;
sgngaml = 1 ;
#ifdef NANS
if (isnanl (x))
return (zero / zero);
#endif
#ifdef INFINITIES
if (!isfinitel (x))
return (one / zero);
#endif
if (x < 0 .0 L)
{
q = -x;
w = lgammal (q); /* note this modifies sgngam! */
p = floorl (q);
if (p == q)
{
#ifdef INFINITIES
return (one / zero);
#else
mtherr ("lgammal" , SING);
goto loverf;
#endif
}
i = p;
if ((i & 1 ) == 0 )
sgngaml = -1 ;
else
sgngaml = 1 ;
z = q - p;
if (z > 0 .5 L)
{
p += 1 .0 L;
z = p - q;
}
z = q * sinl (PIL * z);
if (z == 0 .0 L)
goto loverf;
z = logl (PIL / z) - w;
return (z);
}
if (x < 13 .5 L)
{
p = 0 .0 L;
nx = floorl (x + 0 .5 L);
nn = nx;
switch (nn)
{
case 0 :
/* log gamma (x + 1) = log(x) + log gamma(x) */
if (x <= 0 .125 )
{
p = x * neval (x, RN1, NRN1) / deval (x, RD1, NRD1);
}
else if (x <= 0 .375 )
{
z = x - 0 .25 L;
p = z * neval (z, RN1r25, NRN1r25) / deval (z, RD1r25, NRD1r25);
p += lgam1r25b;
p += lgam1r25a;
}
else if (x <= 0 .625 )
{
z = x + (1 .0 L - x0a);
z = z - x0b;
p = neval (z, RN1r5, NRN1r5) / deval (z, RD1r5, NRD1r5);
p = p * z * z;
p = p + y0b;
p = p + y0a;
}
else if (x <= 0 .875 )
{
z = x - 0 .75 L;
p = z * neval (z, RN1r75, NRN1r75) / deval (z, RD1r75, NRD1r75);
p += lgam1r75b;
p += lgam1r75a;
}
else
{
z = x - 1 .0 L;
p = z * neval (z, RN2, NRN2) / deval (z, RD2, NRD2);
}
p = p - logl (x);
break ;
case 1 :
if (x < 0 .875 L)
{
if (x <= 0 .625 )
{
z = x + (1 .0 L - x0a);
z = z - x0b;
p = neval (z, RN1r5, NRN1r5) / deval (z, RD1r5, NRD1r5);
p = p * z * z;
p = p + y0b;
p = p + y0a;
}
else if (x <= 0 .875 )
{
z = x - 0 .75 L;
p = z * neval (z, RN1r75, NRN1r75)
/ deval (z, RD1r75, NRD1r75);
p += lgam1r75b;
p += lgam1r75a;
}
else
{
z = x - 1 .0 L;
p = z * neval (z, RN2, NRN2) / deval (z, RD2, NRD2);
}
p = p - logl (x);
}
else if (x < 1 .0 L)
{
z = x - 1 .0 L;
p = z * neval (z, RNr9, NRNr9) / deval (z, RDr9, NRDr9);
}
else if (x <= 1 .125 L)
{
z = x - 1 .0 L;
p = z * neval (z, RN1, NRN1) / deval (z, RD1, NRD1);
}
else if (x <= 1 .375 )
{
z = x - 1 .25 L;
p = z * neval (z, RN1r25, NRN1r25) / deval (z, RD1r25, NRD1r25);
p += lgam1r25b;
p += lgam1r25a;
}
else
{
/* 1.375 <= x+x0 <= 1.625 */
z = x - x0a;
z = z - x0b;
p = neval (z, RN1r5, NRN1r5) / deval (z, RD1r5, NRD1r5);
p = p * z * z;
p = p + y0b;
p = p + y0a;
}
break ;
case 2 :
if (x < 1 .625 L)
{
z = x - x0a;
z = z - x0b;
p = neval (z, RN1r5, NRN1r5) / deval (z, RD1r5, NRD1r5);
p = p * z * z;
p = p + y0b;
p = p + y0a;
}
else if (x < 1 .875 L)
{
z = x - 1 .75 L;
p = z * neval (z, RN1r75, NRN1r75) / deval (z, RD1r75, NRD1r75);
p += lgam1r75b;
p += lgam1r75a;
}
else if (x < 2 .375 L)
{
z = x - 2 .0 L;
p = z * neval (z, RN2, NRN2) / deval (z, RD2, NRD2);
}
else
{
z = x - 2 .5 L;
p = z * neval (z, RN2r5, NRN2r5) / deval (z, RD2r5, NRD2r5);
p += lgam2r5b;
p += lgam2r5a;
}
break ;
case 3 :
if (x < 2 .75 )
{
z = x - 2 .5 L;
p = z * neval (z, RN2r5, NRN2r5) / deval (z, RD2r5, NRD2r5);
p += lgam2r5b;
p += lgam2r5a;
}
else
{
z = x - 3 .0 L;
p = z * neval (z, RN3, NRN3) / deval (z, RD3, NRD3);
p += lgam3b;
p += lgam3a;
}
break ;
case 4 :
z = x - 4 .0 L;
p = z * neval (z, RN4, NRN4) / deval (z, RD4, NRD4);
p += lgam4b;
p += lgam4a;
break ;
case 5 :
z = x - 5 .0 L;
p = z * neval (z, RN5, NRN5) / deval (z, RD5, NRD5);
p += lgam5b;
p += lgam5a;
break ;
case 6 :
z = x - 6 .0 L;
p = z * neval (z, RN6, NRN6) / deval (z, RD6, NRD6);
p += lgam6b;
p += lgam6a;
break ;
case 7 :
z = x - 7 .0 L;
p = z * neval (z, RN7, NRN7) / deval (z, RD7, NRD7);
p += lgam7b;
p += lgam7a;
break ;
case 8 :
z = x - 8 .0 L;
p = z * neval (z, RN8, NRN8) / deval (z, RD8, NRD8);
p += lgam8b;
p += lgam8a;
break ;
case 9 :
z = x - 9 .0 L;
p = z * neval (z, RN9, NRN9) / deval (z, RD9, NRD9);
p += lgam9b;
p += lgam9a;
break ;
case 10 :
z = x - 10 .0 L;
p = z * neval (z, RN10, NRN10) / deval (z, RD10, NRD10);
p += lgam10b;
p += lgam10a;
break ;
case 11 :
z = x - 11 .0 L;
p = z * neval (z, RN11, NRN11) / deval (z, RD11, NRD11);
p += lgam11b;
p += lgam11a;
break ;
case 12 :
z = x - 12 .0 L;
p = z * neval (z, RN12, NRN12) / deval (z, RD12, NRD12);
p += lgam12b;
p += lgam12a;
break ;
case 13 :
z = x - 13 .0 L;
p = z * neval (z, RN13, NRN13) / deval (z, RD13, NRD13);
p += lgam13b;
p += lgam13a;
break ;
}
return p;
}
if (x > MAXLGM)
{
loverf:
#ifdef INFINITIES
return (sgngaml * huge * huge);
#else
mtherr ("lgammal" , OVERFLOW);
return (sgngaml * MAXNUML);
#endif
}
q = ls2pi - x;
q = (x - 0 .5 L) * logl (x) + q;
if (x > 1 .0 e18L)
return (q);
p = 1 .0 L / (x * x);
q += neval (p, RASY, NRASY) / x;
return (q);
}
Messung V0.5 in Prozent C=96 H=97 G=96
¤ Dauer der Verarbeitung: 0.21 Sekunden
(vorverarbeitet am 2026-06-15)
¤
*© Formatika GbR, Deutschland