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