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