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