Home | History | Annotate | Line # | Download | only in ld128
      1  1.1  christos /* @(#)e_lgamma_r.c 1.3 95/01/18 */
      2  1.1  christos /*
      3  1.1  christos  * ====================================================
      4  1.1  christos  * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
      5  1.1  christos  *
      6  1.1  christos  * Developed at SunSoft, a Sun Microsystems, Inc. business.
      7  1.1  christos  * Permission to use, copy, modify, and distribute this
      8  1.1  christos  * software is freely granted, provided that this notice
      9  1.1  christos  * is preserved.
     10  1.1  christos  * ====================================================
     11  1.1  christos  */
     12  1.1  christos 
     13  1.1  christos #include <sys/cdefs.h>
     14  1.1  christos /*
     15  1.1  christos  * See e_lgamma_r.c for complete comments.
     16  1.1  christos  *
     17  1.1  christos  * Converted to long double by Steven G. Kargl.
     18  1.1  christos  */
     19  1.1  christos 
     20  1.1  christos #include "math.h"
     21  1.1  christos #include "math_private.h"
     22  1.1  christos 
     23  1.1  christos static const volatile double vzero = 0;
     24  1.1  christos 
     25  1.1  christos static const double
     26  1.1  christos zero=  0,
     27  1.1  christos half=  0.5,
     28  1.1  christos one =  1;
     29  1.1  christos 
     30  1.1  christos static const long double
     31  1.1  christos pi  =  3.14159265358979323846264338327950288e+00L;
     32  1.1  christos /*
     33  1.1  christos  * Domain y in [0x1p-119, 0.28], range ~[-1.4065e-36, 1.4065e-36]:
     34  1.1  christos  * |(lgamma(2 - y) + y / 2) / y - a(y)| < 2**-119.1
     35  1.1  christos  */
     36  1.1  christos static const long double
     37  1.1  christos a0  =  7.72156649015328606065120900824024296e-02L,
     38  1.1  christos a1  =  3.22467033424113218236207583323018498e-01L,
     39  1.1  christos a2  =  6.73523010531980951332460538330282217e-02L,
     40  1.1  christos a3  =  2.05808084277845478790009252803463129e-02L,
     41  1.1  christos a4  =  7.38555102867398526627292839296001626e-03L,
     42  1.1  christos a5  =  2.89051033074152328576829509522483468e-03L,
     43  1.1  christos a6  =  1.19275391170326097618357349881842913e-03L,
     44  1.1  christos a7  =  5.09669524743042462515256340206203019e-04L,
     45  1.1  christos a8  =  2.23154758453578096143609255559576017e-04L,
     46  1.1  christos a9  =  9.94575127818397632126978731542755129e-05L,
     47  1.1  christos a10 =  4.49262367375420471287545895027098145e-05L,
     48  1.1  christos a11 =  2.05072127845117995426519671481628849e-05L,
     49  1.1  christos a12 =  9.43948816959096748454087141447939513e-06L,
     50  1.1  christos a13 =  4.37486780697359330303852050718287419e-06L,
     51  1.1  christos a14 =  2.03920783892362558276037363847651809e-06L,
     52  1.1  christos a15 =  9.55191070057967287877923073200324649e-07L,
     53  1.1  christos a16 =  4.48993286185740853170657139487620560e-07L,
     54  1.1  christos a17 =  2.13107543597620911675316728179563522e-07L,
     55  1.1  christos a18 =  9.70745379855304499867546549551023473e-08L,
     56  1.1  christos a19 =  5.61889970390290257926487734695402075e-08L,
     57  1.1  christos a20 =  6.42739653024130071866684358960960951e-09L,
     58  1.1  christos a21 =  3.34491062143649291746195612991870119e-08L,
     59  1.1  christos a22 = -1.57068547394315223934653011440641472e-08L,
     60  1.1  christos a23 =  1.30812825422415841213733487745200632e-08L;
     61  1.1  christos /*
     62  1.1  christos  * Domain x in [tc-0.24, tc+0.28], range ~[-6.3201e-37, 6.3201e-37]:
     63  1.1  christos  * |(lgamma(x) - tf) - t(x - tc)| < 2**-120.3.
     64  1.1  christos  */
     65  1.1  christos static const long double
     66  1.1  christos tc  =  1.46163214496836234126265954232572133e+00L,
     67  1.1  christos tf  = -1.21486290535849608095514557177691584e-01L,
     68  1.1  christos tt  =  1.57061739945077675484237837992951704e-36L,
     69  1.1  christos t0  = -1.99238329499314692728655623767019240e-36L,
     70  1.1  christos t1  = -6.08453430711711404116887457663281416e-35L,
     71  1.1  christos t2  =  4.83836122723810585213722380854828904e-01L,
     72  1.1  christos t3  = -1.47587722994530702030955093950668275e-01L,
     73  1.1  christos t4  =  6.46249402389127526561003464202671923e-02L,
     74  1.1  christos t5  = -3.27885410884813055008502586863748063e-02L,
     75  1.1  christos t6  =  1.79706751152103942928638276067164935e-02L,
     76  1.1  christos t7  = -1.03142230366363872751602029672767978e-02L,
     77  1.1  christos t8  =  6.10053602051788840313573150785080958e-03L,
     78  1.1  christos t9  = -3.68456960831637325470641021892968954e-03L,
     79  1.1  christos t10 =  2.25976482322181046611440855340968560e-03L,
     80  1.1  christos t11 = -1.40225144590445082933490395950664961e-03L,
     81  1.1  christos t12 =  8.78232634717681264035014878172485575e-04L,
     82  1.1  christos t13 = -5.54194952796682301220684760591403899e-04L,
     83  1.1  christos t14 =  3.51912956837848209220421213975000298e-04L,
     84  1.1  christos t15 = -2.24653443695947456542669289367055542e-04L,
     85  1.1  christos t16 =  1.44070395420840737695611929680511823e-04L,
     86  1.1  christos t17 = -9.27609865550394140067059487518862512e-05L,
     87  1.1  christos t18 =  5.99347334438437081412945428365433073e-05L,
     88  1.1  christos t19 = -3.88458388854572825603964274134801009e-05L,
     89  1.1  christos t20 =  2.52476631610328129217896436186551043e-05L,
     90  1.1  christos t21 = -1.64508584981658692556994212457518536e-05L,
     91  1.1  christos t22 =  1.07434583475987007495523340296173839e-05L,
     92  1.1  christos t23 = -7.03070407519397260929482550448878399e-06L,
     93  1.1  christos t24 =  4.60968590693753579648385629003100469e-06L,
     94  1.1  christos t25 = -3.02765473778832036018438676945512661e-06L,
     95  1.1  christos t26 =  1.99238771545503819972741288511303401e-06L,
     96  1.1  christos t27 = -1.31281299822614084861868817951788579e-06L,
     97  1.1  christos t28 =  8.60844432267399655055574642052370223e-07L,
     98  1.1  christos t29 = -5.64535486432397413273248363550536374e-07L,
     99  1.1  christos t30 =  3.99357783676275660934903139592727737e-07L,
    100  1.1  christos t31 = -2.95849029193433121795495215869311610e-07L,
    101  1.1  christos t32 =  1.37790144435073124976696250804940384e-07L;
    102  1.1  christos /*
    103  1.1  christos  * Domain y in [-0.1, 0.232], range ~[-1.4046e-37, 1.4181e-37]:
    104  1.1  christos  * |(lgamma(1 + y) + 0.5 * y) / y - u(y) / v(y)| < 2**-122.8
    105  1.1  christos  */
    106  1.1  christos static const long double
    107  1.1  christos u0  = -7.72156649015328606065120900824024311e-02L,
    108  1.1  christos u1  =  4.24082772271938167430983113242482656e-01L,
    109  1.1  christos u2  =  2.96194003481457101058321977413332171e+00L,
    110  1.1  christos u3  =  6.49503267711258043997790983071543710e+00L,
    111  1.1  christos u4  =  7.40090051288150177152835698948644483e+00L,
    112  1.1  christos u5  =  4.94698036296756044610805900340723464e+00L,
    113  1.1  christos u6  =  2.00194224610796294762469550684947768e+00L,
    114  1.1  christos u7  =  4.82073087750608895996915051568834949e-01L,
    115  1.1  christos u8  =  6.46694052280506568192333848437585427e-02L,
    116  1.1  christos u9  =  4.17685526755100259316625348933108810e-03L,
    117  1.1  christos u10 =  9.06361003550314327144119307810053410e-05L,
    118  1.1  christos v1  =  5.15937098592887275994320496999951947e+00L,
    119  1.1  christos v2  =  1.14068418766251486777604403304717558e+01L,
    120  1.1  christos v3  =  1.41164839437524744055723871839748489e+01L,
    121  1.1  christos v4  =  1.07170702656179582805791063277960532e+01L,
    122  1.1  christos v5  =  5.14448694179047879915042998453632434e+00L,
    123  1.1  christos v6  =  1.55210088094585540637493826431170289e+00L,
    124  1.1  christos v7  =  2.82975732849424562719893657416365673e-01L,
    125  1.1  christos v8  =  2.86424622754753198010525786005443539e-02L,
    126  1.1  christos v9  =  1.35364253570403771005922441442688978e-03L,
    127  1.1  christos v10 =  1.91514173702398375346658943749580666e-05L,
    128  1.1  christos v11 = -3.25364686890242327944584691466034268e-08L;
    129  1.1  christos /*
    130  1.1  christos  * Domain x in (2, 3], range ~[-1.3341e-36, 1.3536e-36]:
    131  1.1  christos  * |(lgamma(y+2) - 0.5 * y) / y - s(y)/r(y)| < 2**-120.1
    132  1.1  christos  * with y = x - 2.
    133  1.1  christos  */
    134  1.1  christos static const long double
    135  1.1  christos s0  = -7.72156649015328606065120900824024297e-02L,
    136  1.1  christos s1  =  1.23221687850916448903914170805852253e-01L,
    137  1.1  christos s2  =  5.43673188699937239808255378293820020e-01L,
    138  1.1  christos s3  =  6.31998137119005233383666791176301800e-01L,
    139  1.1  christos s4  =  3.75885340179479850993811501596213763e-01L,
    140  1.1  christos s5  =  1.31572908743275052623410195011261575e-01L,
    141  1.1  christos s6  =  2.82528453299138685507186287149699749e-02L,
    142  1.1  christos s7  =  3.70262021550340817867688714880797019e-03L,
    143  1.1  christos s8  =  2.83374000312371199625774129290973648e-04L,
    144  1.1  christos s9  =  1.15091830239148290758883505582343691e-05L,
    145  1.1  christos s10 =  2.04203474281493971326506384646692446e-07L,
    146  1.1  christos s11 =  9.79544198078992058548607407635645763e-10L,
    147  1.1  christos r1  =  2.58037466655605285937112832039537492e+00L,
    148  1.1  christos r2  =  2.86289413392776399262513849911531180e+00L,
    149  1.1  christos r3  =  1.78691044735267497452847829579514367e+00L,
    150  1.1  christos r4  =  6.89400381446725342846854215600008055e-01L,
    151  1.1  christos r5  =  1.70135865462567955867134197595365343e-01L,
    152  1.1  christos r6  =  2.68794816183964420375498986152766763e-02L,
    153  1.1  christos r7  =  2.64617234244861832870088893332006679e-03L,
    154  1.1  christos r8  =  1.52881761239180800640068128681725702e-04L,
    155  1.1  christos r9  =  4.63264813762296029824851351257638558e-06L,
    156  1.1  christos r10 =  5.89461519146957343083848967333671142e-08L,
    157  1.1  christos r11 =  1.79027678176582527798327441636552968e-10L;
    158  1.1  christos /*
    159  1.1  christos  * Domain z in [8, 0x1p70], range ~[-9.8214e-35, 9.8214e-35]:
    160  1.1  christos  * |lgamma(x) - (x - 0.5) * (log(x) - 1) - w(1/x)| < 2**-113.0
    161  1.1  christos  */
    162  1.1  christos static const long double
    163  1.1  christos w0  =  4.18938533204672741780329736405617738e-01L,
    164  1.1  christos w1  =  8.33333333333333333333333333332852026e-02L,
    165  1.1  christos w2  = -2.77777777777777777777777727810123528e-03L,
    166  1.1  christos w3  =  7.93650793650793650791708939493907380e-04L,
    167  1.1  christos w4  = -5.95238095238095234390450004444370959e-04L,
    168  1.1  christos w5  =  8.41750841750837633887817658848845695e-04L,
    169  1.1  christos w6  = -1.91752691752396849943172337347259743e-03L,
    170  1.1  christos w7  =  6.41025640880333069429106541459015557e-03L,
    171  1.1  christos w8  = -2.95506530801732133437990433080327074e-02L,
    172  1.1  christos w9  =  1.79644237328444101596766586979576927e-01L,
    173  1.1  christos w10 = -1.39240539108367641920172649259736394e+00L,
    174  1.1  christos w11 =  1.33987701479007233325288857758641761e+01L,
    175  1.1  christos w12 = -1.56363596431084279780966590116006255e+02L,
    176  1.1  christos w13 =  2.14830978044410267201172332952040777e+03L,
    177  1.1  christos w14 = -3.28636067474227378352761516589092334e+04L,
    178  1.1  christos w15 =  5.06201257747865138432663574251462485e+05L,
    179  1.1  christos w16 = -6.79720123352023636706247599728048344e+06L,
    180  1.1  christos w17 =  6.57556601705472106989497289465949255e+07L,
    181  1.1  christos w18 = -3.26229058141181783534257632389415580e+08L;
    182  1.1  christos 
    183  1.1  christos static long double
    184  1.1  christos sin_pil(long double x)
    185  1.1  christos {
    186  1.1  christos 	volatile long double vz;
    187  1.1  christos 	long double y,z;
    188  1.1  christos 	uint64_t lx __unused, n;
    189  1.1  christos 	uint16_t hx __unused;
    190  1.1  christos 
    191  1.1  christos 	y = -x;
    192  1.1  christos 
    193  1.1  christos 	vz = y+0x1.p112;
    194  1.1  christos 	z = vz-0x1.p112;
    195  1.1  christos 	if (z == y)
    196  1.1  christos 	    return zero;
    197  1.1  christos 
    198  1.1  christos 	vz = y+0x1.p110;
    199  1.1  christos 	EXTRACT_LDBL128_WORDS(hx,lx,n,vz);
    200  1.1  christos 	z = vz-0x1.p110;
    201  1.1  christos 	if (z > y) {
    202  1.1  christos 	    z -= 0.25;
    203  1.1  christos 	    n--;
    204  1.1  christos 	}
    205  1.1  christos 	n &= 7;
    206  1.1  christos 	y = y - z + n * 0.25;
    207  1.1  christos 
    208  1.1  christos 	switch (n) {
    209  1.1  christos 	    case 0:   y =  __kernel_sinl(pi*y,zero,0); break;
    210  1.1  christos 	    case 1:
    211  1.1  christos 	    case 2:   y =  __kernel_cosl(pi*(0.5-y),zero); break;
    212  1.1  christos 	    case 3:
    213  1.1  christos 	    case 4:   y =  __kernel_sinl(pi*(one-y),zero,0); break;
    214  1.1  christos 	    case 5:
    215  1.1  christos 	    case 6:   y = -__kernel_cosl(pi*(y-1.5),zero); break;
    216  1.1  christos 	    default:  y =  __kernel_sinl(pi*(y-2.0),zero,0); break;
    217  1.1  christos 	    }
    218  1.1  christos 	return -y;
    219  1.1  christos }
    220  1.1  christos 
    221  1.1  christos long double
    222  1.1  christos lgammal_r(long double x, int *signgamp)
    223  1.1  christos {
    224  1.2  christos 	long double p,p1,p2,q,r,t,w,y,z;
    225  1.2  christos 	long double nadj = 0; // XXX: gcc
    226  1.1  christos 	uint64_t llx,lx;
    227  1.1  christos 	int i;
    228  1.1  christos 	uint16_t hx,ix;
    229  1.1  christos 
    230  1.1  christos 	EXTRACT_LDBL128_WORDS(hx,lx,llx,x);
    231  1.1  christos 
    232  1.1  christos     /* purge +-Inf and NaNs */
    233  1.1  christos 	*signgamp = 1;
    234  1.1  christos 	ix = hx&0x7fff;
    235  1.1  christos 	if(ix==0x7fff) return x*x;
    236  1.1  christos 
    237  1.1  christos    /* purge +-0 and tiny arguments */
    238  1.1  christos 	*signgamp = 1-2*(hx>>15);
    239  1.1  christos 	if(ix<0x3fff-116) {		/* |x|<2**-(p+3), return -log(|x|) */
    240  1.1  christos 	    if((ix|lx|llx)==0)
    241  1.1  christos 		return one/vzero;
    242  1.1  christos 	    return -logl(fabsl(x));
    243  1.1  christos 	}
    244  1.1  christos 
    245  1.1  christos     /* purge negative integers and start evaluation for other x < 0 */
    246  1.1  christos 	if(hx&0x8000) {
    247  1.1  christos 	    *signgamp = 1;
    248  1.1  christos 	    if(ix>=0x3fff+112) 		/* |x|>=2**(p-1), must be -integer */
    249  1.1  christos 		return one/vzero;
    250  1.1  christos 	    t = sin_pil(x);
    251  1.1  christos 	    if(t==zero) return one/vzero;
    252  1.1  christos 	    nadj = logl(pi/fabsl(t*x));
    253  1.1  christos 	    if(t<zero) *signgamp = -1;
    254  1.1  christos 	    x = -x;
    255  1.1  christos 	}
    256  1.1  christos 
    257  1.1  christos     /* purge 1 and 2 */
    258  1.1  christos 	if((ix==0x3fff || ix==0x4000) && (lx|llx)==0) r = 0;
    259  1.1  christos     /* for x < 2.0 */
    260  1.1  christos 	else if(ix<0x4000) {
    261  1.1  christos 	    if(x<=8.9999961853027344e-01) {
    262  1.1  christos 		r = -logl(x);
    263  1.1  christos 		if(x>=7.3159980773925781e-01) {y = 1-x; i= 0;}
    264  1.1  christos 		else if(x>=2.3163998126983643e-01) {y= x-(tc-1); i=1;}
    265  1.1  christos 	  	else {y = x; i=2;}
    266  1.1  christos 	    } else {
    267  1.1  christos 		r = 0;
    268  1.1  christos 	        if(x>=1.7316312789916992e+00) {y=2-x;i=0;}
    269  1.1  christos 	        else if(x>=1.2316322326660156e+00) {y=x-tc;i=1;}
    270  1.1  christos 		else {y=x-1;i=2;}
    271  1.1  christos 	    }
    272  1.1  christos 	    switch(i) {
    273  1.1  christos 	      case 0:
    274  1.1  christos 		z = y*y;
    275  1.1  christos 		p1 = a0+z*(a2+z*(a4+z*(a6+z*(a8+z*(a10+z*(a12+z*(a14+z*(a16+
    276  1.1  christos 		    z*(a18+z*(a20+z*a22))))))))));
    277  1.1  christos 		p2 = z*(a1+z*(a3+z*(a5+z*(a7+z*(a9+z*(a11+z*(a13+z*(a15+
    278  1.1  christos 		    z*(a17+z*(a19+z*(a21+z*a23)))))))))));
    279  1.1  christos 		p  = y*p1+p2;
    280  1.1  christos 		r  += p-y/2; break;
    281  1.1  christos 	      case 1:
    282  1.1  christos 		p = t0+y*t1+tt+y*y*(t2+y*(t3+y*(t4+y*(t5+y*(t6+y*(t7+y*(t8+
    283  1.1  christos 		    y*(t9+y*(t10+y*(t11+y*(t12+y*(t13+y*(t14+y*(t15+y*(t16+
    284  1.1  christos 		    y*(t17+y*(t18+y*(t19+y*(t20+y*(t21+y*(t22+y*(t23+
    285  1.1  christos 		    y*(t24+y*(t25+y*(t26+y*(t27+y*(t28+y*(t29+y*(t30+
    286  1.1  christos 		    y*(t31+y*t32))))))))))))))))))))))))))))));
    287  1.1  christos 		r += tf + p; break;
    288  1.1  christos 	      case 2:
    289  1.1  christos 		p1 = y*(u0+y*(u1+y*(u2+y*(u3+y*(u4+y*(u5+y*(u6+y*(u7+
    290  1.1  christos 		    y*(u8+y*(u9+y*u10))))))))));
    291  1.1  christos 		p2 = one+y*(v1+y*(v2+y*(v3+y*(v4+y*(v5+y*(v6+y*(v7+
    292  1.1  christos 		    y*(v8+y*(v9+y*(v10+y*v11))))))))));
    293  1.1  christos 		r += p1/p2-y/2;
    294  1.1  christos 	    }
    295  1.1  christos 	}
    296  1.1  christos     /* x < 8.0 */
    297  1.1  christos 	else if(ix<0x4002) {
    298  1.1  christos 	    i = x;
    299  1.1  christos 	    y = x-i;
    300  1.1  christos 	    p = y*(s0+y*(s1+y*(s2+y*(s3+y*(s4+y*(s5+y*(s6+y*(s7+y*(s8+
    301  1.1  christos 		y*(s9+y*(s10+y*s11)))))))))));
    302  1.1  christos 	    q = one+y*(r1+y*(r2+y*(r3+y*(r4+y*(r5+y*(r6+y*(r7+y*(r8+
    303  1.1  christos 		y*(r9+y*(r10+y*r11))))))))));
    304  1.1  christos 	    r = y/2+p/q;
    305  1.1  christos 	    z = 1;	/* lgamma(1+s) = log(s) + lgamma(s) */
    306  1.1  christos 	    switch(i) {
    307  1.1  christos 	    case 7: z *= (y+6);		/* FALLTHRU */
    308  1.1  christos 	    case 6: z *= (y+5);		/* FALLTHRU */
    309  1.1  christos 	    case 5: z *= (y+4);		/* FALLTHRU */
    310  1.1  christos 	    case 4: z *= (y+3);		/* FALLTHRU */
    311  1.1  christos 	    case 3: z *= (y+2);		/* FALLTHRU */
    312  1.1  christos 		    r += logl(z); break;
    313  1.1  christos 	    }
    314  1.1  christos     /* 8.0 <= x < 2**(p+3) */
    315  1.1  christos 	} else if (ix<0x3fff+116) {
    316  1.1  christos 	    t = logl(x);
    317  1.1  christos 	    z = one/x;
    318  1.1  christos 	    y = z*z;
    319  1.1  christos 	    w = w0+z*(w1+y*(w2+y*(w3+y*(w4+y*(w5+y*(w6+y*(w7+y*(w8+
    320  1.1  christos 		y*(w9+y*(w10+y*(w11+y*(w12+y*(w13+y*(w14+y*(w15+y*(w16+
    321  1.1  christos 		y*(w17+y*w18)))))))))))))))));
    322  1.1  christos 	    r = (x-half)*(t-one)+w;
    323  1.1  christos     /* 2**(p+3) <= x <= inf */
    324  1.1  christos 	} else
    325  1.1  christos 	    r =  x*(logl(x)-1);
    326  1.1  christos 	if(hx&0x8000) r = nadj - r;
    327  1.1  christos 	return r;
    328  1.1  christos }
    329