xref: /titanic_41/usr/src/lib/libm/common/m9x/tgamma.c (revision a9d3dcd5820128b4f34bf38f447e47aa95c004e8)
15b2ba9d3SPiotr Jasiukajtis /*
25b2ba9d3SPiotr Jasiukajtis  * CDDL HEADER START
35b2ba9d3SPiotr Jasiukajtis  *
45b2ba9d3SPiotr Jasiukajtis  * The contents of this file are subject to the terms of the
55b2ba9d3SPiotr Jasiukajtis  * Common Development and Distribution License (the "License").
65b2ba9d3SPiotr Jasiukajtis  * You may not use this file except in compliance with the License.
75b2ba9d3SPiotr Jasiukajtis  *
85b2ba9d3SPiotr Jasiukajtis  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
95b2ba9d3SPiotr Jasiukajtis  * or http://www.opensolaris.org/os/licensing.
105b2ba9d3SPiotr Jasiukajtis  * See the License for the specific language governing permissions
115b2ba9d3SPiotr Jasiukajtis  * and limitations under the License.
125b2ba9d3SPiotr Jasiukajtis  *
135b2ba9d3SPiotr Jasiukajtis  * When distributing Covered Code, include this CDDL HEADER in each
145b2ba9d3SPiotr Jasiukajtis  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
155b2ba9d3SPiotr Jasiukajtis  * If applicable, add the following below this CDDL HEADER, with the
165b2ba9d3SPiotr Jasiukajtis  * fields enclosed by brackets "[]" replaced with your own identifying
175b2ba9d3SPiotr Jasiukajtis  * information: Portions Copyright [yyyy] [name of copyright owner]
185b2ba9d3SPiotr Jasiukajtis  *
195b2ba9d3SPiotr Jasiukajtis  * CDDL HEADER END
205b2ba9d3SPiotr Jasiukajtis  */
215b2ba9d3SPiotr Jasiukajtis 
225b2ba9d3SPiotr Jasiukajtis /*
235b2ba9d3SPiotr Jasiukajtis  * Copyright 2011 Nexenta Systems, Inc.  All rights reserved.
245b2ba9d3SPiotr Jasiukajtis  */
255b2ba9d3SPiotr Jasiukajtis /*
265b2ba9d3SPiotr Jasiukajtis  * Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
275b2ba9d3SPiotr Jasiukajtis  * Use is subject to license terms.
285b2ba9d3SPiotr Jasiukajtis  */
295b2ba9d3SPiotr Jasiukajtis 
30*a9d3dcd5SRichard Lowe #pragma weak __tgamma = tgamma
315b2ba9d3SPiotr Jasiukajtis 
325b2ba9d3SPiotr Jasiukajtis /* INDENT OFF */
335b2ba9d3SPiotr Jasiukajtis /*
345b2ba9d3SPiotr Jasiukajtis  * True gamma function
355b2ba9d3SPiotr Jasiukajtis  * double tgamma(double x)
365b2ba9d3SPiotr Jasiukajtis  *
375b2ba9d3SPiotr Jasiukajtis  * Error:
385b2ba9d3SPiotr Jasiukajtis  * ------
395b2ba9d3SPiotr Jasiukajtis  *  	Less that one ulp for both positive and negative arguments.
405b2ba9d3SPiotr Jasiukajtis  *
415b2ba9d3SPiotr Jasiukajtis  * Algorithm:
425b2ba9d3SPiotr Jasiukajtis  * ---------
435b2ba9d3SPiotr Jasiukajtis  *	A: For negative argument
445b2ba9d3SPiotr Jasiukajtis  *		(1) gamma(-n or -inf) is NaN
455b2ba9d3SPiotr Jasiukajtis  *		(2) Underflow Threshold
465b2ba9d3SPiotr Jasiukajtis  *		(3) Reduction to gamma(1+x)
475b2ba9d3SPiotr Jasiukajtis  *	B: For x between 1 and 2
485b2ba9d3SPiotr Jasiukajtis  * 	C: For x between 0 and 1
495b2ba9d3SPiotr Jasiukajtis  *	D: For x between 2 and 8
505b2ba9d3SPiotr Jasiukajtis  *	E: Overflow thresold {see over.c}
515b2ba9d3SPiotr Jasiukajtis  *	F: For overflow_threshold >= x >= 8
525b2ba9d3SPiotr Jasiukajtis  *
535b2ba9d3SPiotr Jasiukajtis  * Implementation details
545b2ba9d3SPiotr Jasiukajtis  * -----------------------
555b2ba9d3SPiotr Jasiukajtis  *							-pi
565b2ba9d3SPiotr Jasiukajtis  * (A) For negative argument, use gamma(-x) = ------------------------.
575b2ba9d3SPiotr Jasiukajtis  *                                            (sin(pi*x)*gamma(1+x))
585b2ba9d3SPiotr Jasiukajtis  *
595b2ba9d3SPiotr Jasiukajtis  *   (1) gamma(-n or -inf) is NaN with invalid signal by SUSv3 spec.
605b2ba9d3SPiotr Jasiukajtis  *	 (Ideally, gamma(-n) = 1/sinpi(n) = (-1)**(n+1) * inf.)
615b2ba9d3SPiotr Jasiukajtis  *
625b2ba9d3SPiotr Jasiukajtis  *   (2) Underflow Threshold. For each precision, there is a value T
635b2ba9d3SPiotr Jasiukajtis  *	such that when x>T and when x is not an integer, gamma(-x) will
645b2ba9d3SPiotr Jasiukajtis  *       always underflow. A table of the underflow threshold value is given
655b2ba9d3SPiotr Jasiukajtis  *	below. For proof, see file "under.c".
665b2ba9d3SPiotr Jasiukajtis  *
675b2ba9d3SPiotr Jasiukajtis  *	Precision	underflow threshold T =
685b2ba9d3SPiotr Jasiukajtis  *	----------------------------------------------------------------------
695b2ba9d3SPiotr Jasiukajtis  *	single	41.000041962					= 41  + 11 ULP
705b2ba9d3SPiotr Jasiukajtis  *		(machine format) 4224000B
715b2ba9d3SPiotr Jasiukajtis  *	double	183.000000000000312639				= 183 + 11 ULP
725b2ba9d3SPiotr Jasiukajtis  *		(machine format) 4066E000 0000000B
735b2ba9d3SPiotr Jasiukajtis  *	quad	1774.0000000000000000000000000000017749370	= 1774 + 9 ULP
745b2ba9d3SPiotr Jasiukajtis  *		(machine format) 4009BB80000000000000000000000009
755b2ba9d3SPiotr Jasiukajtis  *	----------------------------------------------------------------------
765b2ba9d3SPiotr Jasiukajtis  *
775b2ba9d3SPiotr Jasiukajtis  *   (3) Reduction to gamma(1+x).
785b2ba9d3SPiotr Jasiukajtis  *	Because of (1) and (2), we need only consider non-integral x
795b2ba9d3SPiotr Jasiukajtis  *	such that 0<x<T. Let k = [x] and z = x-[x]. Define
805b2ba9d3SPiotr Jasiukajtis  *                  sin(x*pi)                cos(x*pi)
815b2ba9d3SPiotr Jasiukajtis  *	kpsin(x) = --------- and kpcos(x) = --------- . Then
825b2ba9d3SPiotr Jasiukajtis  *                     pi                       pi
835b2ba9d3SPiotr Jasiukajtis  *                                    1
845b2ba9d3SPiotr Jasiukajtis  *		gamma(-x) = --------------------.
855b2ba9d3SPiotr Jasiukajtis  *		            -kpsin(x)*gamma(1+x)
865b2ba9d3SPiotr Jasiukajtis  *	Since x = k+z,
875b2ba9d3SPiotr Jasiukajtis  *                                                  k+1
885b2ba9d3SPiotr Jasiukajtis  *		-sin(x*pi) = -sin(k*pi+z*pi) = (-1)   *sin(z*pi),
895b2ba9d3SPiotr Jasiukajtis  *                               k+1
905b2ba9d3SPiotr Jasiukajtis  *	we have -kpsin(x) = (-1)   * kpsin(z).  We can further
915b2ba9d3SPiotr Jasiukajtis  *	reduce z to t by
925b2ba9d3SPiotr Jasiukajtis  *	   (I)   t = z	     when 0.00000     <= z < 0.31830...
935b2ba9d3SPiotr Jasiukajtis  *	   (II)  t = 0.5-z   when 0.31830...  <= z < 0.681690...
945b2ba9d3SPiotr Jasiukajtis  *	   (III) t = 1-z     when 0.681690... <= z < 1.00000
955b2ba9d3SPiotr Jasiukajtis  *	and correspondingly
965b2ba9d3SPiotr Jasiukajtis  *	   (I)   kpsin(z) = kpsin(t)  	... 0<= z < 0.3184
975b2ba9d3SPiotr Jasiukajtis  *	   (II)  kpsin(z) = kpcos(t) 	... |t|   < 0.182
985b2ba9d3SPiotr Jasiukajtis  *	   (III) kpsin(z) = kpsin(t) 	... 0<= t < 0.3184
995b2ba9d3SPiotr Jasiukajtis  *
1005b2ba9d3SPiotr Jasiukajtis  *	Using a special Remez algorithm, we obtain the following polynomial
1015b2ba9d3SPiotr Jasiukajtis  *	approximation for kpsin(t) for 0<=t<0.3184:
1025b2ba9d3SPiotr Jasiukajtis  *
1035b2ba9d3SPiotr Jasiukajtis  *	Computation note: in simulating higher precision arithmetic, kcpsin
1045b2ba9d3SPiotr Jasiukajtis  *	return head = t and tail = ks[0]*t^3 + (...) to maintain extra bits.
1055b2ba9d3SPiotr Jasiukajtis  *
1065b2ba9d3SPiotr Jasiukajtis  *	Quad precision, remez error <= 2**(-129.74)
1075b2ba9d3SPiotr Jasiukajtis  *                                   3            5                   27
1085b2ba9d3SPiotr Jasiukajtis  *	    kpsin(t) = t + ks[0] * t  + ks[1] * t  + ... + ks[12] * t
1095b2ba9d3SPiotr Jasiukajtis  *
1105b2ba9d3SPiotr Jasiukajtis  *       ks[ 0] =  -1.64493406684822643647241516664602518705158902870e+0000
1115b2ba9d3SPiotr Jasiukajtis  *       ks[ 1] =   8.11742425283353643637002772405874238094995726160e-0001
1125b2ba9d3SPiotr Jasiukajtis  *       ks[ 2] =  -1.90751824122084213696472111835337366232282723933e-0001
1135b2ba9d3SPiotr Jasiukajtis  *       ks[ 3] =   2.61478478176548005046532613563241288115395517084e-0002
1145b2ba9d3SPiotr Jasiukajtis  *       ks[ 4] =  -2.34608103545582363750893072647117829448016479971e-0003
1155b2ba9d3SPiotr Jasiukajtis  *       ks[ 5] =   1.48428793031071003684606647212534027556262040158e-0004
1165b2ba9d3SPiotr Jasiukajtis  *       ks[ 6] =  -6.97587366165638046518462722252768122615952898698e-0006
1175b2ba9d3SPiotr Jasiukajtis  *       ks[ 7] =   2.53121740413702536928659271747187500934840057929e-0007
1185b2ba9d3SPiotr Jasiukajtis  *       ks[ 8] =  -7.30471182221385990397683641695766121301933621956e-0009
1195b2ba9d3SPiotr Jasiukajtis  *       ks[ 9] =   1.71653847451163495739958249695549313987973589884e-0010
1205b2ba9d3SPiotr Jasiukajtis  *       ks[10] =  -3.34813314714560776122245796929054813458341420565e-0012
1215b2ba9d3SPiotr Jasiukajtis  *       ks[11] =   5.50724992262622033449487808306969135431411753047e-0014
1225b2ba9d3SPiotr Jasiukajtis  *       ks[12] =  -7.67678132753577998601234393215802221104236979928e-0016
1235b2ba9d3SPiotr Jasiukajtis  *
1245b2ba9d3SPiotr Jasiukajtis  *	Double precision, Remez error <= 2**(-62.9)
1255b2ba9d3SPiotr Jasiukajtis  *                                  3            5                  15
1265b2ba9d3SPiotr Jasiukajtis  *	    kpsin(t) = t + ks[0] * t  + ks[1] * t  + ... + ks[6] * t
1275b2ba9d3SPiotr Jasiukajtis  *
1285b2ba9d3SPiotr Jasiukajtis  *       ks[0] =  -1.644934066848226406065691	(0x3ffa51a6 625307d3)
1295b2ba9d3SPiotr Jasiukajtis  *       ks[1] =   8.11742425283341655883668741874008920850698590621e-0001
1305b2ba9d3SPiotr Jasiukajtis  *       ks[2] =  -1.90751824120862873825597279118304943994042258291e-0001
1315b2ba9d3SPiotr Jasiukajtis  *       ks[3] =   2.61478477632554278317289628332654539353521911570e-0002
1325b2ba9d3SPiotr Jasiukajtis  *       ks[4] =  -2.34607978510202710377617190278735525354347705866e-0003
1335b2ba9d3SPiotr Jasiukajtis  *       ks[5] =   1.48413292290051695897242899977121846763824221705e-0004
1345b2ba9d3SPiotr Jasiukajtis  *       ks[6] =  -6.87730769637543488108688726777687262485357072242e-0006
1355b2ba9d3SPiotr Jasiukajtis  *
1365b2ba9d3SPiotr Jasiukajtis  *	Single precision, Remez error <= 2**(-34.09)
1375b2ba9d3SPiotr Jasiukajtis  *                                  3            5                  9
1385b2ba9d3SPiotr Jasiukajtis  *	    kpsin(t) = t + ks[0] * t  + ks[1] * t  + ... + ks[3] * t
1395b2ba9d3SPiotr Jasiukajtis  *
1405b2ba9d3SPiotr Jasiukajtis  *       ks[0] =  -1.64493404985645811354476665052005342839447790544e+0000
1415b2ba9d3SPiotr Jasiukajtis  *       ks[1] =   8.11740794458351064092797249069438269367389272270e-0001
1425b2ba9d3SPiotr Jasiukajtis  *       ks[2] =  -1.90703144603551216933075809162889536878854055202e-0001
1435b2ba9d3SPiotr Jasiukajtis  *       ks[3] =   2.55742333994264563281155312271481108635575331201e-0002
1445b2ba9d3SPiotr Jasiukajtis  *
1455b2ba9d3SPiotr Jasiukajtis  *	Computation note: in simulating higher precision arithmetic, kcpsin
1465b2ba9d3SPiotr Jasiukajtis  *	return head = t and tail = kc[0]*t^3 + (...) to maintain extra bits
1475b2ba9d3SPiotr Jasiukajtis  *   	precision.
1485b2ba9d3SPiotr Jasiukajtis  *
1495b2ba9d3SPiotr Jasiukajtis  *	And for kpcos(t) for |t|< 0.183:
1505b2ba9d3SPiotr Jasiukajtis  *
1515b2ba9d3SPiotr Jasiukajtis  *	Quad precision, remez <= 2**(-122.48)
1525b2ba9d3SPiotr Jasiukajtis  *                                     2            4                  22
1535b2ba9d3SPiotr Jasiukajtis  *	    kpcos(t) = 1/pi +  pi/2 * t  + kc[2] * t + ... + kc[11] * t
1545b2ba9d3SPiotr Jasiukajtis  *
1555b2ba9d3SPiotr Jasiukajtis  *       kc[2] =   1.29192819501249250731151312779548918765320728489e+0000
1565b2ba9d3SPiotr Jasiukajtis  *       kc[3] =  -4.25027339979557573976029596929319207009444090366e-0001
1575b2ba9d3SPiotr Jasiukajtis  *       kc[4] =   7.49080661650990096109672954618317623888421628613e-0002
1585b2ba9d3SPiotr Jasiukajtis  *       kc[5] =  -8.21458866111282287985539464173976555436050215120e-0003
1595b2ba9d3SPiotr Jasiukajtis  *       kc[6] =   6.14202578809529228503205255165761204750211603402e-0004
1605b2ba9d3SPiotr Jasiukajtis  *       kc[7] =  -3.33073432691149607007217330302595267179545908740e-0005
1615b2ba9d3SPiotr Jasiukajtis  *       kc[8] =   1.36970959047832085796809745461530865597993680204e-0006
1625b2ba9d3SPiotr Jasiukajtis  *       kc[9] =  -4.41780774262583514450246512727201806217271097336e-0008
1635b2ba9d3SPiotr Jasiukajtis  *       kc[10]=   1.14741409212381858820016567664488123478660705759e-0009
1645b2ba9d3SPiotr Jasiukajtis  *       kc[11]=  -2.44261236114707374558437500654381006300502749632e-0011
1655b2ba9d3SPiotr Jasiukajtis  *
1665b2ba9d3SPiotr Jasiukajtis  *	Double precision, remez < 2**(61.91)
1675b2ba9d3SPiotr Jasiukajtis  *                                   2            4                  12
1685b2ba9d3SPiotr Jasiukajtis  *	    kpcos(t) = 1/pi + pi/2 *t +  kc[2] * t  + ... + kc[6] * t
1695b2ba9d3SPiotr Jasiukajtis  *
1705b2ba9d3SPiotr Jasiukajtis  *       kc[2] =   1.29192819501230224953283586722575766189551966008e+0000
1715b2ba9d3SPiotr Jasiukajtis  *       kc[3] =  -4.25027339940149518500158850753393173519732149213e-0001
1725b2ba9d3SPiotr Jasiukajtis  *       kc[4] =   7.49080625187015312373925142219429422375556727752e-0002
1735b2ba9d3SPiotr Jasiukajtis  *       kc[5] =  -8.21442040906099210866977352284054849051348692715e-0003
1745b2ba9d3SPiotr Jasiukajtis  *       kc[6] =   6.10411356829515414575566564733632532333904115968e-0004
1755b2ba9d3SPiotr Jasiukajtis  *
1765b2ba9d3SPiotr Jasiukajtis  *	Single precision, remez < 2**(-30.13)
1775b2ba9d3SPiotr Jasiukajtis  *                                       2                  6
1785b2ba9d3SPiotr Jasiukajtis  *	    kpcos(t) = kc[0] +  kc[1] * t  + ... + kc[3] * t
1795b2ba9d3SPiotr Jasiukajtis  *
1805b2ba9d3SPiotr Jasiukajtis  *       kc[0] =   3.18309886183790671537767526745028724068919291480e-0001
1815b2ba9d3SPiotr Jasiukajtis  *       kc[1] =  -1.57079581447762568199467875065854538626594937791e+0000
1825b2ba9d3SPiotr Jasiukajtis  *       kc[2] =   1.29183528092558692844073004029568674027807393862e+0000
1835b2ba9d3SPiotr Jasiukajtis  *       kc[3] =  -4.20232949771307685981015914425195471602739075537e-0001
1845b2ba9d3SPiotr Jasiukajtis  *
1855b2ba9d3SPiotr Jasiukajtis  *	Computation note: in simulating higher precision arithmetic, kcpcos
1865b2ba9d3SPiotr Jasiukajtis  *	return head = 1/pi chopped, and tail = pi/2 *t^2 + (tail part of 1/pi
1875b2ba9d3SPiotr Jasiukajtis  *	+ ...) to maintain extra bits precision. In particular, pi/2 * t^2
1885b2ba9d3SPiotr Jasiukajtis  *	is calculated with great care.
1895b2ba9d3SPiotr Jasiukajtis  *
1905b2ba9d3SPiotr Jasiukajtis  *	Thus, the computation of gamma(-x), x>0, is:
1915b2ba9d3SPiotr Jasiukajtis  *	Let k = int(x), z = x-k.
1925b2ba9d3SPiotr Jasiukajtis  *	For z in (I)
1935b2ba9d3SPiotr Jasiukajtis  *                                    k+1
1945b2ba9d3SPiotr Jasiukajtis  *			          (-1)
1955b2ba9d3SPiotr Jasiukajtis  * 		gamma(-x) = ------------------- ;
1965b2ba9d3SPiotr Jasiukajtis  *		            kpsin(z)*gamma(1+x)
1975b2ba9d3SPiotr Jasiukajtis  *
1985b2ba9d3SPiotr Jasiukajtis  *	otherwise, for z in (II),
1995b2ba9d3SPiotr Jasiukajtis  *                                      k+1
2005b2ba9d3SPiotr Jasiukajtis  *			            (-1)
2015b2ba9d3SPiotr Jasiukajtis  * 		gamma(-x) = ----------------------- ;
2025b2ba9d3SPiotr Jasiukajtis  *			    kpcos(0.5-z)*gamma(1+x)
2035b2ba9d3SPiotr Jasiukajtis  *
2045b2ba9d3SPiotr Jasiukajtis  *	otherwise, for z in (III),
2055b2ba9d3SPiotr Jasiukajtis  *                                      k+1
2065b2ba9d3SPiotr Jasiukajtis  *			            (-1)
2075b2ba9d3SPiotr Jasiukajtis  * 		gamma(-x) = --------------------- .
2085b2ba9d3SPiotr Jasiukajtis  *		            kpsin(1-z)*gamma(1+x)
2095b2ba9d3SPiotr Jasiukajtis  *
2105b2ba9d3SPiotr Jasiukajtis  *	Thus, the computation of gamma(-x) reduced to the computation of
2115b2ba9d3SPiotr Jasiukajtis  *	gamma(1+x) and kpsin(), kpcos().
2125b2ba9d3SPiotr Jasiukajtis  *
2135b2ba9d3SPiotr Jasiukajtis  * (B) For x between 1 and 2.  We break [1,2] into three parts:
2145b2ba9d3SPiotr Jasiukajtis  *	GT1 = [1.0000, 1.2845]
2155b2ba9d3SPiotr Jasiukajtis  * 	GT2 = [1.2844, 1.6374]
2165b2ba9d3SPiotr Jasiukajtis  * 	GT3 = [1.6373, 2.0000]
2175b2ba9d3SPiotr Jasiukajtis  *
2185b2ba9d3SPiotr Jasiukajtis  *    For x in GTi, i=1,2,3, let
2195b2ba9d3SPiotr Jasiukajtis  * 	z1  =  1.134861805732790769689793935774652917006
2205b2ba9d3SPiotr Jasiukajtis  *	gz1 = gamma(z1)  =   0.9382046279096824494097535615803269576988
2215b2ba9d3SPiotr Jasiukajtis  *	tz1 = gamma'(z1) =  -0.3517214357852935791015625000000000000000
2225b2ba9d3SPiotr Jasiukajtis  *
2235b2ba9d3SPiotr Jasiukajtis  *	z2  =  1.461632144968362341262659542325721328468e+0000
2245b2ba9d3SPiotr Jasiukajtis  *	gz2 = gamma(z2)  = 0.8856031944108887002788159005825887332080
2255b2ba9d3SPiotr Jasiukajtis  *	tz2 = gamma'(z2) = 0.00
2265b2ba9d3SPiotr Jasiukajtis  *
2275b2ba9d3SPiotr Jasiukajtis  *	z3  =  1.819773101100500601787868704921606996312e+0000
2285b2ba9d3SPiotr Jasiukajtis  *	gz3 = gamma(z3)  = 0.9367814114636523216188468970808378497426
2295b2ba9d3SPiotr Jasiukajtis  *	tz3 = gamma'(z3) = 0.2805306315422058105468750000000000000000
2305b2ba9d3SPiotr Jasiukajtis  *
2315b2ba9d3SPiotr Jasiukajtis  *    and
2325b2ba9d3SPiotr Jasiukajtis  *	y = x-zi	... for extra precision, write y = y.h + y.l
2335b2ba9d3SPiotr Jasiukajtis  *    Then
2345b2ba9d3SPiotr Jasiukajtis  *	gamma(x) = gzi + tzi*(y.h+y.l) + y*y*Ri(y),
2355b2ba9d3SPiotr Jasiukajtis  *		 = gzi.h + (tzi*y.h + ((tzi*y.l+gzi.l) +  y*y*Ri(y)))
2365b2ba9d3SPiotr Jasiukajtis  *		 = gy.h + gy.l
2375b2ba9d3SPiotr Jasiukajtis  *    where
2385b2ba9d3SPiotr Jasiukajtis  *	(I) For double precision
2395b2ba9d3SPiotr Jasiukajtis  *
2405b2ba9d3SPiotr Jasiukajtis  *		Ri(y) = Pi(y)/Qi(y), i=1,2,3;
2415b2ba9d3SPiotr Jasiukajtis  *
2425b2ba9d3SPiotr Jasiukajtis  *		P1(y) = p1[0] + p1[1]*y + ... + p1[4]*y^4
2435b2ba9d3SPiotr Jasiukajtis  *		Q1(y) = q1[0] + q1[1]*y + ... + q1[5]*y^5
2445b2ba9d3SPiotr Jasiukajtis  *
2455b2ba9d3SPiotr Jasiukajtis  *		P2(y) = p2[0] + p2[1]*y + ... + p2[3]*y^3
2465b2ba9d3SPiotr Jasiukajtis  *		Q2(y) = q2[0] + q2[1]*y + ... + q2[6]*y^6
2475b2ba9d3SPiotr Jasiukajtis  *
2485b2ba9d3SPiotr Jasiukajtis  *		P3(y) = p3[0] + p3[1]*y + ... + p3[4]*y^4
2495b2ba9d3SPiotr Jasiukajtis  *		Q3(y) = q3[0] + q3[1]*y + ... + q3[5]*y^5
2505b2ba9d3SPiotr Jasiukajtis  *
2515b2ba9d3SPiotr Jasiukajtis  *		Remez precision of Ri(y):
2525b2ba9d3SPiotr Jasiukajtis  *		|gamma(x)-(gzi+tzi*y) - y*y*Ri(y)|  <= 2**-62.3	... for i = 1
2535b2ba9d3SPiotr Jasiukajtis  *					            <= 2**-59.4	... for i = 2
2545b2ba9d3SPiotr Jasiukajtis  *					            <= 2**-62.1	... for i = 3
2555b2ba9d3SPiotr Jasiukajtis  *
2565b2ba9d3SPiotr Jasiukajtis  *	(II) For quad precision
2575b2ba9d3SPiotr Jasiukajtis  *
2585b2ba9d3SPiotr Jasiukajtis  *		Ri(y) = Pi(y)/Qi(y), i=1,2,3;
2595b2ba9d3SPiotr Jasiukajtis  *
2605b2ba9d3SPiotr Jasiukajtis  *		P1(y) = p1[0] + p1[1]*y + ... + p1[9]*y^9
2615b2ba9d3SPiotr Jasiukajtis  *		Q1(y) = q1[0] + q1[1]*y + ... + q1[8]*y^8
2625b2ba9d3SPiotr Jasiukajtis  *
2635b2ba9d3SPiotr Jasiukajtis  *		P2(y) = p2[0] + p2[1]*y + ... + p2[9]*y^9
2645b2ba9d3SPiotr Jasiukajtis  *		Q2(y) = q2[0] + q2[1]*y + ... + q2[9]*y^9
2655b2ba9d3SPiotr Jasiukajtis  *
2665b2ba9d3SPiotr Jasiukajtis  *		P3(y) = p3[0] + p3[1]*y + ... + p3[9]*y^9
2675b2ba9d3SPiotr Jasiukajtis  *		Q3(y) = q3[0] + q3[1]*y + ... + q3[9]*y^9
2685b2ba9d3SPiotr Jasiukajtis  *
2695b2ba9d3SPiotr Jasiukajtis  *		Remez precision of Ri(y):
2705b2ba9d3SPiotr Jasiukajtis  *		|gamma(x)-(gzi+tzi*y) - y*y*Ri(y)|  <= 2**-118.2 ... for i = 1
2715b2ba9d3SPiotr Jasiukajtis  *					            <= 2**-126.8 ... for i = 2
2725b2ba9d3SPiotr Jasiukajtis  *					            <= 2**-119.5 ... for i = 3
2735b2ba9d3SPiotr Jasiukajtis  *
2745b2ba9d3SPiotr Jasiukajtis  *	(III) For single precision
2755b2ba9d3SPiotr Jasiukajtis  *
2765b2ba9d3SPiotr Jasiukajtis  *		Ri(y) = Pi(y), i=1,2,3;
2775b2ba9d3SPiotr Jasiukajtis  *
2785b2ba9d3SPiotr Jasiukajtis  *		P1(y) = p1[0] + p1[1]*y + ... + p1[5]*y^5
2795b2ba9d3SPiotr Jasiukajtis  *
2805b2ba9d3SPiotr Jasiukajtis  *		P2(y) = p2[0] + p2[1]*y + ... + p2[5]*y^5
2815b2ba9d3SPiotr Jasiukajtis  *
2825b2ba9d3SPiotr Jasiukajtis  *		P3(y) = p3[0] + p3[1]*y + ... + p3[4]*y^4
2835b2ba9d3SPiotr Jasiukajtis  *
2845b2ba9d3SPiotr Jasiukajtis  *		Remez precision of Ri(y):
2855b2ba9d3SPiotr Jasiukajtis  *		|gamma(x)-(gzi+tzi*y) - y*y*Ri(y)|  <= 2**-30.8	... for i = 1
2865b2ba9d3SPiotr Jasiukajtis  *					            <= 2**-31.6	... for i = 2
2875b2ba9d3SPiotr Jasiukajtis  *					            <= 2**-29.5	... for i = 3
2885b2ba9d3SPiotr Jasiukajtis  *
2895b2ba9d3SPiotr Jasiukajtis  *    Notes. (1) GTi and zi are choosen to balance the interval width and
2905b2ba9d3SPiotr Jasiukajtis  *		minimize the distant between gamma(x) and the tangent line at
2915b2ba9d3SPiotr Jasiukajtis  *		zi. In particular, we have
2925b2ba9d3SPiotr Jasiukajtis  *		|gamma(x)-(gzi+tzi*(x-zi))|  <=   0.01436... for x in [1,z2]
2935b2ba9d3SPiotr Jasiukajtis  *					     <=   0.01265... for x in [z2,2]
2945b2ba9d3SPiotr Jasiukajtis  *
2955b2ba9d3SPiotr Jasiukajtis  *           (2) zi are slightly adjusted so that tzi=gamma'(zi) is very
2965b2ba9d3SPiotr Jasiukajtis  *		close to a single precision value.
2975b2ba9d3SPiotr Jasiukajtis  *
2985b2ba9d3SPiotr Jasiukajtis  *    Coefficents: Single precision
2995b2ba9d3SPiotr Jasiukajtis  *	i= 1:
3005b2ba9d3SPiotr Jasiukajtis  *       P1[0] =   7.09087253435088360271451613398019280077561279443e-0001
3015b2ba9d3SPiotr Jasiukajtis  *       P1[1] =  -5.17229560788652108545141978238701790105241761089e-0001
3025b2ba9d3SPiotr Jasiukajtis  *       P1[2] =   5.23403394528150789405825222323770647162337764327e-0001
3035b2ba9d3SPiotr Jasiukajtis  *       P1[3] =  -4.54586308717075010784041566069480411732634814899e-0001
3045b2ba9d3SPiotr Jasiukajtis  *       P1[4] =   4.20596490915239085459964590559256913498190955233e-0001
3055b2ba9d3SPiotr Jasiukajtis  *	P1[5] =  -3.57307589712377520978332185838241458642142185789e-0001
3065b2ba9d3SPiotr Jasiukajtis  *
3075b2ba9d3SPiotr Jasiukajtis  *	i = 2:
3085b2ba9d3SPiotr Jasiukajtis  *       p2[0] =   4.28486983980295198166056119223984284434264344578e-0001
3095b2ba9d3SPiotr Jasiukajtis  *       p2[1] =  -1.30704539487709138528680121627899735386650103914e-0001
3105b2ba9d3SPiotr Jasiukajtis  *       p2[2] =   1.60856285038051955072861219352655851542955430871e-0001
3115b2ba9d3SPiotr Jasiukajtis  *       p2[3] =  -9.22285161346010583774458802067371182158937943507e-0002
3125b2ba9d3SPiotr Jasiukajtis  *       p2[4] =   7.19240511767225260740890292605070595560626179357e-0002
3135b2ba9d3SPiotr Jasiukajtis  *       p2[5] =  -4.88158265593355093703112238534484636193260459574e-0002
3145b2ba9d3SPiotr Jasiukajtis  *
3155b2ba9d3SPiotr Jasiukajtis  *	i = 3
3165b2ba9d3SPiotr Jasiukajtis  *       p3[0] =   3.82409531118807759081121479786092134814808872880e-0001
3175b2ba9d3SPiotr Jasiukajtis  *       p3[1] =   2.65309888180188647956400403013495759365167853426e-0002
3185b2ba9d3SPiotr Jasiukajtis  *       p3[2] =   8.06815109775079171923561169415370309376296739835e-0002
3195b2ba9d3SPiotr Jasiukajtis  *       p3[3] =  -1.54821591666137613928840890835174351674007764799e-0002
3205b2ba9d3SPiotr Jasiukajtis  *       p3[4] =   1.76308239242717268530498313416899188157165183405e-0002
3215b2ba9d3SPiotr Jasiukajtis  *
3225b2ba9d3SPiotr Jasiukajtis  *    Coefficents: Double precision
3235b2ba9d3SPiotr Jasiukajtis  * 	i = 1:
3245b2ba9d3SPiotr Jasiukajtis  *       p1[0]   =   0.70908683619977797008004927192814648151397705078125000
3255b2ba9d3SPiotr Jasiukajtis  *       p1[1]   =   1.71987061393048558089579513384356441668351720061e-0001
3265b2ba9d3SPiotr Jasiukajtis  *       p1[2]   =  -3.19273345791990970293320316122813960527705450671e-0002
3275b2ba9d3SPiotr Jasiukajtis  *       p1[3]   =   8.36172645419110036267169600390549973563534476989e-0003
3285b2ba9d3SPiotr Jasiukajtis  *       p1[4]   =   1.13745336648572838333152213474277971244629758101e-0003
3295b2ba9d3SPiotr Jasiukajtis  *	 q1[0]   =   1.0
3305b2ba9d3SPiotr Jasiukajtis  *       q1[1]   =   9.71980217826032937526460731778472389791321968082e-0001
3315b2ba9d3SPiotr Jasiukajtis  *       q1[2]   =  -7.43576743326756176594084137256042653497087666030e-0002
3325b2ba9d3SPiotr Jasiukajtis  *       q1[3]   =  -1.19345944932265559769719470515102012246995255372e-0001
3335b2ba9d3SPiotr Jasiukajtis  *       q1[4]   =   1.59913445751425002620935120470781382215050284762e-0002
3345b2ba9d3SPiotr Jasiukajtis  *	 q1[5]   =   1.12601136853374984566572691306402321911547550783e-0003
3355b2ba9d3SPiotr Jasiukajtis  * 	i = 2:
3365b2ba9d3SPiotr Jasiukajtis  *       p2[0]   =   0.42848681585558601181418225678498856723308563232421875
3375b2ba9d3SPiotr Jasiukajtis  *       p2[1]   =   6.53596762668970816023718845105667418483122103629e-0002
3385b2ba9d3SPiotr Jasiukajtis  *       p2[2]   =  -6.97280829631212931321050770925128264272768936731e-0003
3395b2ba9d3SPiotr Jasiukajtis  *       p2[3]   =   6.46342359021981718947208605674813260166116632899e-0003
3405b2ba9d3SPiotr Jasiukajtis  *	 q2[0]   =   1.0
3415b2ba9d3SPiotr Jasiukajtis  *       q2[1]   =   4.57572620560506047062553957454062012327519313936e-0001
3425b2ba9d3SPiotr Jasiukajtis  *       q2[2]   =  -2.52182594886075452859655003407796103083422572036e-0001
3435b2ba9d3SPiotr Jasiukajtis  *       q2[3]   =  -1.82970945407778594681348166040103197178711552827e-0002
3445b2ba9d3SPiotr Jasiukajtis  *       q2[4]   =   2.43574726993169566475227642128830141304953840502e-0002
3455b2ba9d3SPiotr Jasiukajtis  *       q2[5]   =  -5.20390406466942525358645957564897411258667085501e-0003
3465b2ba9d3SPiotr Jasiukajtis  *       q2[6]   =   4.79520251383279837635552431988023256031951133885e-0004
3475b2ba9d3SPiotr Jasiukajtis  * 	i = 3:
3485b2ba9d3SPiotr Jasiukajtis  *	 p3[0]   =   0.382409479734567459008331979930517263710498809814453125
3495b2ba9d3SPiotr Jasiukajtis  *       p3[1]   =   1.42876048697668161599069814043449301572928034140e-0001
3505b2ba9d3SPiotr Jasiukajtis  *       p3[2]   =   3.42157571052250536817923866013561760785748899071e-0003
3515b2ba9d3SPiotr Jasiukajtis  *       p3[3]   =  -5.01542621710067521405087887856991700987709272937e-0004
3525b2ba9d3SPiotr Jasiukajtis  *       p3[4]   =   8.89285814866740910123834688163838287618332122670e-0004
3535b2ba9d3SPiotr Jasiukajtis  *	 q3[0]   =   1.0
3545b2ba9d3SPiotr Jasiukajtis  *       q3[1]   =   3.04253086629444201002215640948957897906299633168e-0001
3555b2ba9d3SPiotr Jasiukajtis  *       q3[2]   =  -2.23162407379999477282555672834881213873185520006e-0001
3565b2ba9d3SPiotr Jasiukajtis  *       q3[3]   =  -1.05060867741952065921809811933670131427552903636e-0002
3575b2ba9d3SPiotr Jasiukajtis  *       q3[4]   =   1.70511763916186982473301861980856352005926669320e-0002
3585b2ba9d3SPiotr Jasiukajtis  *       q3[5]   =  -2.12950201683609187927899416700094630764182477464e-0003
3595b2ba9d3SPiotr Jasiukajtis  *
3605b2ba9d3SPiotr Jasiukajtis  *    Note that all pi0 are exact in double, which is obtained by a
3615b2ba9d3SPiotr Jasiukajtis  *    special Remez Algorithm.
3625b2ba9d3SPiotr Jasiukajtis  *
3635b2ba9d3SPiotr Jasiukajtis  *    Coefficents: Quad precision
3645b2ba9d3SPiotr Jasiukajtis  * 	i = 1:
3655b2ba9d3SPiotr Jasiukajtis  *       p1[0] =   0.709086836199777919037185741507610124611513720557
3665b2ba9d3SPiotr Jasiukajtis  *       p1[1] =   4.45754781206489035827915969367354835667391606951e-0001
3675b2ba9d3SPiotr Jasiukajtis  *       p1[2] =   3.21049298735832382311662273882632210062918153852e-0002
3685b2ba9d3SPiotr Jasiukajtis  *       p1[3] =  -5.71296796342106617651765245858289197369688864350e-0003
3695b2ba9d3SPiotr Jasiukajtis  *       p1[4] =   6.04666892891998977081619174969855831606965352773e-0003
3705b2ba9d3SPiotr Jasiukajtis  *       p1[5] =   8.99106186996888711939627812174765258822658645168e-0004
3715b2ba9d3SPiotr Jasiukajtis  *       p1[6] =  -6.96496846144407741431207008527018441810175568949e-0005
3725b2ba9d3SPiotr Jasiukajtis  *       p1[7] =   1.52597046118984020814225409300131445070213882429e-0005
3735b2ba9d3SPiotr Jasiukajtis  *       p1[8] =   5.68521076168495673844711465407432189190681541547e-0007
3745b2ba9d3SPiotr Jasiukajtis  *       p1[9] =   3.30749673519634895220582062520286565610418952979e-0008
3755b2ba9d3SPiotr Jasiukajtis  *       q1[0] =   1.0+0000
3765b2ba9d3SPiotr Jasiukajtis  *       q1[1] =   1.35806511721671070408570853537257079579490650668e+0000
3775b2ba9d3SPiotr Jasiukajtis  *       q1[2] =   2.97567810153429553405327140096063086994072952961e-0001
3785b2ba9d3SPiotr Jasiukajtis  *       q1[3] =  -1.52956835982588571502954372821681851681118097870e-0001
3795b2ba9d3SPiotr Jasiukajtis  *       q1[4] =  -2.88248519561420109768781615289082053597954521218e-0002
3805b2ba9d3SPiotr Jasiukajtis  *       q1[5] =   1.03475311719937405219789948456313936302378395955e-0002
3815b2ba9d3SPiotr Jasiukajtis  *       q1[6] =   4.12310203243891222368965360124391297374822742313e-0004
3825b2ba9d3SPiotr Jasiukajtis  *       q1[7] =  -3.12653708152290867248931925120380729518332507388e-0004
3835b2ba9d3SPiotr Jasiukajtis  *       q1[8] =   2.36672170850409745237358105667757760527014332458e-0005
3845b2ba9d3SPiotr Jasiukajtis  *
3855b2ba9d3SPiotr Jasiukajtis  * 	i = 2:
3865b2ba9d3SPiotr Jasiukajtis  *       p2[0] =   0.428486815855585429730209907810650616737756697477
3875b2ba9d3SPiotr Jasiukajtis  *       p2[1] =   2.63622124067885222919192651151581541943362617352e-0001
3885b2ba9d3SPiotr Jasiukajtis  *       p2[2] =   3.85520683670028865731877276741390421744971446855e-0002
3895b2ba9d3SPiotr Jasiukajtis  *       p2[3] =   3.05065978278128549958897133190295325258023525862e-0003
3905b2ba9d3SPiotr Jasiukajtis  *       p2[4] =   2.48232934951723128892080415054084339152450445081e-0003
3915b2ba9d3SPiotr Jasiukajtis  *       p2[5] =   3.67092777065632360693313762221411547741550105407e-0004
3925b2ba9d3SPiotr Jasiukajtis  *       p2[6] =   3.81228045616085789674530902563145250532194518946e-0006
3935b2ba9d3SPiotr Jasiukajtis  *       p2[7] =   4.61677225867087554059531455133839175822537617677e-0006
3945b2ba9d3SPiotr Jasiukajtis  *       p2[8] =   2.18209052385703200438239200991201916609364872993e-0007
3955b2ba9d3SPiotr Jasiukajtis  *       p2[9] =   1.00490538985245846460006244065624754421022542454e-0008
3965b2ba9d3SPiotr Jasiukajtis  *       q2[0] =   1.0
3975b2ba9d3SPiotr Jasiukajtis  *       q2[1] =   9.20276350207639290567783725273128544224570775056e-0001
3985b2ba9d3SPiotr Jasiukajtis  *       q2[2] =  -4.79533683654165107448020515733883781138947771495e-0003
3995b2ba9d3SPiotr Jasiukajtis  *       q2[3] =  -1.24538337585899300494444600248687901947684291683e-0001
4005b2ba9d3SPiotr Jasiukajtis  *       q2[4] =   4.49866050763472358547524708431719114204535491412e-0003
4015b2ba9d3SPiotr Jasiukajtis  *       q2[5] =   7.20715455697920560621638325356292640604078591907e-0003
4025b2ba9d3SPiotr Jasiukajtis  *       q2[6] =  -8.68513169029126780280798337091982780598228096116e-0004
4035b2ba9d3SPiotr Jasiukajtis  *       q2[7] =  -1.25104431629401181525027098222745544809974229874e-0004
4045b2ba9d3SPiotr Jasiukajtis  *       q2[8] =   3.10558344839000038489191304550998047521253437464e-0005
4055b2ba9d3SPiotr Jasiukajtis  *       q2[9] =  -1.76829227852852176018537139573609433652506765712e-0006
4065b2ba9d3SPiotr Jasiukajtis  *
4075b2ba9d3SPiotr Jasiukajtis  *	i = 3
4085b2ba9d3SPiotr Jasiukajtis  *       p3[0] =   0.3824094797345675048502747661075355640070439388902
4095b2ba9d3SPiotr Jasiukajtis  *       p3[1] =   3.42198093076618495415854906335908427159833377774e-0001
4105b2ba9d3SPiotr Jasiukajtis  *       p3[2] =   9.63828189500585568303961406863153237440702754858e-0002
4115b2ba9d3SPiotr Jasiukajtis  *       p3[3] =   8.76069421042696384852462044188520252156846768667e-0003
4125b2ba9d3SPiotr Jasiukajtis  *       p3[4] =   1.86477890389161491224872014149309015261897537488e-0003
4135b2ba9d3SPiotr Jasiukajtis  *       p3[5] =   8.16871354540309895879974742853701311541286944191e-0004
4145b2ba9d3SPiotr Jasiukajtis  *       p3[6] =   6.83783483674600322518695090864659381650125625216e-0005
4155b2ba9d3SPiotr Jasiukajtis  *       p3[7] =  -1.10168269719261574708565935172719209272190828456e-0006
4165b2ba9d3SPiotr Jasiukajtis  *       p3[8] =   9.66243228508380420159234853278906717065629721016e-0007
4175b2ba9d3SPiotr Jasiukajtis  *       p3[9] =   2.31858885579177250541163820671121664974334728142e-0008
4185b2ba9d3SPiotr Jasiukajtis  *       q3[0] =   1.0
4195b2ba9d3SPiotr Jasiukajtis  *       q3[1] =   8.25479821168813634632437430090376252512793067339e-0001
4205b2ba9d3SPiotr Jasiukajtis  *       q3[2] =  -1.62251363073937769739639623669295110346015576320e-0002
4215b2ba9d3SPiotr Jasiukajtis  *       q3[3] =  -1.10621286905916732758745130629426559691187579852e-0001
4225b2ba9d3SPiotr Jasiukajtis  *       q3[4] =   3.48309693970985612644446415789230015515365291459e-0003
4235b2ba9d3SPiotr Jasiukajtis  *       q3[5] =   6.73553737487488333032431261131289672347043401328e-0003
4245b2ba9d3SPiotr Jasiukajtis  *       q3[6] =  -7.63222008393372630162743587811004613050245128051e-0004
4255b2ba9d3SPiotr Jasiukajtis  *       q3[7] =  -1.35792670669190631476784768961953711773073251336e-0004
4265b2ba9d3SPiotr Jasiukajtis  *       q3[8] =   3.19610150954223587006220730065608156460205690618e-0005
4275b2ba9d3SPiotr Jasiukajtis  *       q3[9] =  -1.82096553862822346610109522015129585693354348322e-0006
4285b2ba9d3SPiotr Jasiukajtis  *
4295b2ba9d3SPiotr Jasiukajtis  * (C) For x between 0 and 1.
4305b2ba9d3SPiotr Jasiukajtis  *     Let P stand for the number of significant bits in the working precision.
4315b2ba9d3SPiotr Jasiukajtis  *                      -P                            1
4325b2ba9d3SPiotr Jasiukajtis  *    (1)For 0 <= x <= 2   , gamma(x) is computed by --- rounded to nearest.
4335b2ba9d3SPiotr Jasiukajtis  *                                                    x
4345b2ba9d3SPiotr Jasiukajtis  *       The error is bound by 0.739 ulp(gamma(x)) in IEEE double precision.
4355b2ba9d3SPiotr Jasiukajtis  *	Proof.
4365b2ba9d3SPiotr Jasiukajtis  *                1                       2
4375b2ba9d3SPiotr Jasiukajtis  *	Since  --------  ~  x + 0.577...*x  - ...,  we have, for small x,
4385b2ba9d3SPiotr Jasiukajtis  *              gamma(x)
4395b2ba9d3SPiotr Jasiukajtis  *           1                    1
4405b2ba9d3SPiotr Jasiukajtis  *	----------- < gamma(x) < --- and
4415b2ba9d3SPiotr Jasiukajtis  *      x(1+0.578x)               x
4425b2ba9d3SPiotr Jasiukajtis  *              1                 1           1
4435b2ba9d3SPiotr Jasiukajtis  *	  0 <  --- - gamma(x) <= ---  -  ----------- < 0.578
4445b2ba9d3SPiotr Jasiukajtis  *              x                 x      x(1+0.578x)
4455b2ba9d3SPiotr Jasiukajtis  *                                     1       1                        -P
4465b2ba9d3SPiotr Jasiukajtis  * 	The error is thus bounded by --- ulp(---) + 0.578. Since x <= 2   ,
4475b2ba9d3SPiotr Jasiukajtis  *                                     2       x
4485b2ba9d3SPiotr Jasiukajtis  *       1      P       1           P                                      1
4495b2ba9d3SPiotr Jasiukajtis  *	--- >= 2 , ulp(---) >= ulp(2  ) >= 2. Thus 0.578=0.289*2<=0.289ulp(-)
4505b2ba9d3SPiotr Jasiukajtis  *       x              x                                                  x
4515b2ba9d3SPiotr Jasiukajtis  *       Thus
4525b2ba9d3SPiotr Jasiukajtis  *                             1                                 1
4535b2ba9d3SPiotr Jasiukajtis  *		| gamma(x) - [---] rounded | <= (0.5+0.289)*ulp(---).
4545b2ba9d3SPiotr Jasiukajtis  *			       x	                         x
4555b2ba9d3SPiotr Jasiukajtis  *                         -P                              1
4565b2ba9d3SPiotr Jasiukajtis  *	Note that for x<= 2  , it is easy to see that ulp(---)=ulp(gamma(x))
4575b2ba9d3SPiotr Jasiukajtis  *                                                         x
4585b2ba9d3SPiotr Jasiukajtis  *                            n                             1
4595b2ba9d3SPiotr Jasiukajtis  *	except only when x = 2 , (n<= -53). In such cases, --- is exact
4605b2ba9d3SPiotr Jasiukajtis  *                                                          x
4615b2ba9d3SPiotr Jasiukajtis  * 	and therefore the error is bounded by
4625b2ba9d3SPiotr Jasiukajtis  *                         1
4635b2ba9d3SPiotr Jasiukajtis  *		0.298*ulp(---) = 0.298*2*ulp(gamma(x)) = 0.578ulp(gamma(x)).
4645b2ba9d3SPiotr Jasiukajtis  *                         x
4655b2ba9d3SPiotr Jasiukajtis  *	Thus we conclude that the error in gamma is less than 0.739 ulp.
4665b2ba9d3SPiotr Jasiukajtis  *
4675b2ba9d3SPiotr Jasiukajtis  *    (2)Otherwise, for x in GTi-1 (see B), let y = x-(zi-1). From (B) we obtain
4685b2ba9d3SPiotr Jasiukajtis  *                                                          gamma(1+x)
4695b2ba9d3SPiotr Jasiukajtis  *	gamma(1+x) = gy.h + gy.l,  then compute gamma(x) by -----------.
4705b2ba9d3SPiotr Jasiukajtis  *                                                               x
4715b2ba9d3SPiotr Jasiukajtis  *                                                          gy.h
4725b2ba9d3SPiotr Jasiukajtis  *	Implementaion note. Write x = x.h+x.l, and Let th = ----- chopped to
4735b2ba9d3SPiotr Jasiukajtis  *                                                            x
4745b2ba9d3SPiotr Jasiukajtis  *	20 bits, then
4755b2ba9d3SPiotr Jasiukajtis  *                                gy.h+gy.l
4765b2ba9d3SPiotr Jasiukajtis  *		gamma(x) = th + (----------  - th )
4775b2ba9d3SPiotr Jasiukajtis  *                                    x
4785b2ba9d3SPiotr Jasiukajtis  *                               1
4795b2ba9d3SPiotr Jasiukajtis  *			 = th + ---*(gy.h-th*x.h+gy.l-th*x.l)
4805b2ba9d3SPiotr Jasiukajtis  *	                         x
4815b2ba9d3SPiotr Jasiukajtis  *
4825b2ba9d3SPiotr Jasiukajtis  * (D) For x between 2 and 8. Let n = 1+x chopped to an integer. Then
4835b2ba9d3SPiotr Jasiukajtis  *
4845b2ba9d3SPiotr Jasiukajtis  *               gamma(x)=(x-1)*(x-2)*...*(x-n)*gamma(x-n)
4855b2ba9d3SPiotr Jasiukajtis  *
4865b2ba9d3SPiotr Jasiukajtis  *     Since x-n is between 1 and 2, we can apply (B) to compute gamma(x).
4875b2ba9d3SPiotr Jasiukajtis  *
4885b2ba9d3SPiotr Jasiukajtis  *     Implementation detail. The computation of (x-1)(x-2)...(x-n) in simulated
4895b2ba9d3SPiotr Jasiukajtis  *     higher precision arithmetic can be somewhat optimized.  For example, in
4905b2ba9d3SPiotr Jasiukajtis  *     computing (x-1)*(x-2)*(x-3)*(x-4), if we compute (x-1)*(x-4) = z.h+z.l,
4915b2ba9d3SPiotr Jasiukajtis  *     then (x-2)(x-3) = z.h+2+z.l readily. In below, we list the expression
4925b2ba9d3SPiotr Jasiukajtis  *     of the formula to compute gamma(x).
4935b2ba9d3SPiotr Jasiukajtis  *
4945b2ba9d3SPiotr Jasiukajtis  *     Assume x-n is in GTi (i=1,2, or 3, see B for detail). Let y = x - n - zi.
4955b2ba9d3SPiotr Jasiukajtis  *     By (B) we have gamma(x-n) = gy.h+gy.l. If x = x.h+x.l, then we have
4965b2ba9d3SPiotr Jasiukajtis  *      n=1 (x in [2,3]):
4975b2ba9d3SPiotr Jasiukajtis  *	 gamma(x) = (x-1)*gamma(x-1) = (x-1)*(gy.h+gy.l)
4985b2ba9d3SPiotr Jasiukajtis  *                 = [(x.h-1)+x.l]*(gy.h+gy.l)
4995b2ba9d3SPiotr Jasiukajtis  *      n=2 (x in [3,4]):
5005b2ba9d3SPiotr Jasiukajtis  *        gamma(x) = (x-1)(x-2)*gamma(x-2) = (x-1)*(x-2)*(gy.h+gy.l)
5015b2ba9d3SPiotr Jasiukajtis  *                 = ((x.h-2)+x.l)*((x.h-1)+x.l)*(gy.h+gy.l)
5025b2ba9d3SPiotr Jasiukajtis  *                 = [x.h*(x.h-3)+2+x.l*(x+(x.h-3))]*(gy.h+gy.l)
5035b2ba9d3SPiotr Jasiukajtis  *      n=3 (x in [4,5])
5045b2ba9d3SPiotr Jasiukajtis  *	 gamma(x) = (x-1)(x-2)(x-3)*(gy.h+gy.l)
5055b2ba9d3SPiotr Jasiukajtis  *                 = (x.h*(x.h-3)+2+x.l*(x+(x.h-3)))*[((x.h-3)+x.l)(gy.h+gy.l)]
5065b2ba9d3SPiotr Jasiukajtis  *      n=4 (x in [5,6])
5075b2ba9d3SPiotr Jasiukajtis  *	 gamma(x) = [(x-1)(x-4)]*[(x-2)(x-3)]*(gy.h+gy.l)
5085b2ba9d3SPiotr Jasiukajtis  *                 = [(x.h*(x.h-5)+4+x.l(x+(x.h-5)))]*[(x-2)*(x-3)]*(gy.h+gy.l)
5095b2ba9d3SPiotr Jasiukajtis  *                 = (y.h+y.l)*(y.h+1+y.l)*(gy.h+gy.l)
5105b2ba9d3SPiotr Jasiukajtis  *      n=5 (x in [6,7])
5115b2ba9d3SPiotr Jasiukajtis  *	 gamma(x) = [(x-1)(x-4)]*[(x-2)(x-3)]*[(x-5)*(gy.h+gy.l)]
5125b2ba9d3SPiotr Jasiukajtis  *      n=6 (x in [7,8])
5135b2ba9d3SPiotr Jasiukajtis  *	 gamma(x) = [(x-1)(x-6)]*[(x-2)(x-5)]*[(x-3)(x-4)]*(gy.h+gy.l)]
5145b2ba9d3SPiotr Jasiukajtis  *		  = [(y.h+y.l)(y.h+4+y.l)][(y.h+6+y.l)(gy.h+gy.l)]
5155b2ba9d3SPiotr Jasiukajtis  *
5165b2ba9d3SPiotr Jasiukajtis  * (E)Overflow Thresold. For x > Overflow thresold of gamma,
5175b2ba9d3SPiotr Jasiukajtis  *    return huge*huge (overflow).
5185b2ba9d3SPiotr Jasiukajtis  *
5195b2ba9d3SPiotr Jasiukajtis  *    By checking whether lgamma(x) >= 2**{128,1024,16384}, one can
5205b2ba9d3SPiotr Jasiukajtis  *    determine the overflow threshold for x in single, double, and
5215b2ba9d3SPiotr Jasiukajtis  *    quad precision. See over.c for details.
5225b2ba9d3SPiotr Jasiukajtis  *
5235b2ba9d3SPiotr Jasiukajtis  *    The overflow threshold of gamma(x) are
5245b2ba9d3SPiotr Jasiukajtis  *
5255b2ba9d3SPiotr Jasiukajtis  *    single: x = 3.5040096283e+01
5265b2ba9d3SPiotr Jasiukajtis  *              = 0x420C290F (IEEE single)
5275b2ba9d3SPiotr Jasiukajtis  *    double: x = 1.71624376956302711505e+02
5285b2ba9d3SPiotr Jasiukajtis  *              = 0x406573FAE561F647 (IEEE double)
5295b2ba9d3SPiotr Jasiukajtis  *    quad:   x = 1.7555483429044629170038892160702032034177e+03
5305b2ba9d3SPiotr Jasiukajtis  *              = 0x4009B6E3180CD66A5C4206F128BA77F4  (quad)
5315b2ba9d3SPiotr Jasiukajtis  *
5325b2ba9d3SPiotr Jasiukajtis  * (F)For overflow_threshold >= x >= 8, we use asymptotic approximation.
5335b2ba9d3SPiotr Jasiukajtis  *    (1) Stirling's formula
5345b2ba9d3SPiotr Jasiukajtis  *
5355b2ba9d3SPiotr Jasiukajtis  *      log(G(x)) ~= (x-.5)*(log(x)-1) + .5(log(2*pi)-1) + (1/x)*P(1/(x*x))
5365b2ba9d3SPiotr Jasiukajtis  *		  = L1 + L2 + L3,
5375b2ba9d3SPiotr Jasiukajtis  *    where
5385b2ba9d3SPiotr Jasiukajtis  *		L1(x) = (x-.5)*(log(x)-1),
5395b2ba9d3SPiotr Jasiukajtis  *		L2    = .5(log(2pi)-1) = 0.41893853....,
5405b2ba9d3SPiotr Jasiukajtis  *		L3(x) = (1/x)P(1/(x*x)),
5415b2ba9d3SPiotr Jasiukajtis  *
5425b2ba9d3SPiotr Jasiukajtis  *    The range of L1,L2, and L3 are as follows:
5435b2ba9d3SPiotr Jasiukajtis  *
5445b2ba9d3SPiotr Jasiukajtis  *	------------------------------------------------------------------
5455b2ba9d3SPiotr Jasiukajtis  *  	Range(L1) =  (single) [8.09..,88.30..]	 =[2** 3.01..,2**  6.46..]
5465b2ba9d3SPiotr Jasiukajtis  *                   (double) [8.09..,709.3..]   =[2** 3.01..,2**  9.47..]
5475b2ba9d3SPiotr Jasiukajtis  *		     (quad)   [8.09..,11356.10..]=[2** 3.01..,2** 13.47..]
5485b2ba9d3SPiotr Jasiukajtis  *  	Range(L2) = 0.41893853.....
5495b2ba9d3SPiotr Jasiukajtis  *	Range(L3) = [0.0104...., 0.00048....]	 =[2**-6.58..,2**-11.02..]
5505b2ba9d3SPiotr Jasiukajtis  *	------------------------------------------------------------------
5515b2ba9d3SPiotr Jasiukajtis  *
5525b2ba9d3SPiotr Jasiukajtis  *    Gamma(x) is then computed by exp(L1+L2+L3).
5535b2ba9d3SPiotr Jasiukajtis  *
5545b2ba9d3SPiotr Jasiukajtis  *    (2) Error analysis of (F):
5555b2ba9d3SPiotr Jasiukajtis  *    --------------------------
5565b2ba9d3SPiotr Jasiukajtis  *    The error in Gamma(x) depends on the error inherited in the computation
5575b2ba9d3SPiotr Jasiukajtis  *    of L= L1+L2+L3. Let L' be the computed value of L. The absolute error
5585b2ba9d3SPiotr Jasiukajtis  *    in L' is t = L-L'. Since exp(L') = exp(L-t) = exp(L)*exp(t) ~
5595b2ba9d3SPiotr Jasiukajtis  *    (1+t)*exp(L), the relative error in exp(L') is approximately t.
5605b2ba9d3SPiotr Jasiukajtis  *
5615b2ba9d3SPiotr Jasiukajtis  *    To guarantee the relatively accuracy in exp(L'), we would like
5625b2ba9d3SPiotr Jasiukajtis  *    |t| < 2**(-P-5) where P denotes for the number of significant bits
5635b2ba9d3SPiotr Jasiukajtis  *    of the working precision. Consequently, each of the L1,L2, and L3
5645b2ba9d3SPiotr Jasiukajtis  *    must be computed with absolute error bounded by 2**(-P-5) in absolute
5655b2ba9d3SPiotr Jasiukajtis  *    value.
5665b2ba9d3SPiotr Jasiukajtis  *
5675b2ba9d3SPiotr Jasiukajtis  *    Since L2 is a constant, it can be pre-computed to the desired accuracy.
5685b2ba9d3SPiotr Jasiukajtis  *    Also |L3| < 2**-6; therefore, it suffices to compute L3 with the
5695b2ba9d3SPiotr Jasiukajtis  *    working precision.  That is,
5705b2ba9d3SPiotr Jasiukajtis  *	L3(x) approxmiate log(G(x))-(x-.5)(log(x)-1)-.5(log(2pi)-1)
5715b2ba9d3SPiotr Jasiukajtis  *    to a precision bounded by 2**(-P-5).
5725b2ba9d3SPiotr Jasiukajtis  *
5735b2ba9d3SPiotr Jasiukajtis  *                                   2**(-6)
5745b2ba9d3SPiotr Jasiukajtis  *			    _________V___________________
5755b2ba9d3SPiotr Jasiukajtis  *		L1(x):	   |_________|___________________|
5765b2ba9d3SPiotr Jasiukajtis  *			           __ ________________________
5775b2ba9d3SPiotr Jasiukajtis  *		L2:	          |__|________________________|
5785b2ba9d3SPiotr Jasiukajtis  *			              __________________________
5795b2ba9d3SPiotr Jasiukajtis  *         +    L3(x):               |__________________________|
5805b2ba9d3SPiotr Jasiukajtis  *                       -------------------------------------------
5815b2ba9d3SPiotr Jasiukajtis  *                         [leading] + [Trailing]
5825b2ba9d3SPiotr Jasiukajtis  *
5835b2ba9d3SPiotr Jasiukajtis  *    For L1(x)=(x-0.5)*(log(x)-1), we need ilogb(L1(x))+5 extra bits for
5845b2ba9d3SPiotr Jasiukajtis  *    both multiplicants to guarantee L1(x)'s absolute error is bounded by
5855b2ba9d3SPiotr Jasiukajtis  *    2**(-P-5) in absolute value. Here ilogb(y) is defined to be the unbias
5865b2ba9d3SPiotr Jasiukajtis  *    binary exponent of y in IEEE format.  We can get x-0.5 to the desire
5875b2ba9d3SPiotr Jasiukajtis  *    accuracy easily. It remains to compute log(x)-1 with ilogb(L1(x))+5
5885b2ba9d3SPiotr Jasiukajtis  *    extra bits accracy. Note that the range of L1 is 88.30.., 709.3.., and
5895b2ba9d3SPiotr Jasiukajtis  *    11356.10... for single, double, and quadruple precision, we have
5905b2ba9d3SPiotr Jasiukajtis  *
5915b2ba9d3SPiotr Jasiukajtis  *                           single     double      quadruple
5925b2ba9d3SPiotr Jasiukajtis  *                         ------------------------------------
5935b2ba9d3SPiotr Jasiukajtis  *	ilogb(L1(x))+5 <=     11	  14	       18
5945b2ba9d3SPiotr Jasiukajtis  *                         ------------------------------------
5955b2ba9d3SPiotr Jasiukajtis  *
5965b2ba9d3SPiotr Jasiukajtis  *    (3) Table Driven Method for log(x)-1:
5975b2ba9d3SPiotr Jasiukajtis  *    --------------------------------------
5985b2ba9d3SPiotr Jasiukajtis  *    Let x = 2**n * y, where 1 <= y < 2. Let Z={z(i),i=1,...,m}
5995b2ba9d3SPiotr Jasiukajtis  *    be a set of predetermined evenly distributed floating point numbers
6005b2ba9d3SPiotr Jasiukajtis  *    in [1, 2]. Let z(j) be the closest one to y, then
6015b2ba9d3SPiotr Jasiukajtis  *	log(x)-1 = n*log(2)-1  +  log(y)
6025b2ba9d3SPiotr Jasiukajtis  *		 = n*log(2)-1  +  log(z(j)*y/z(j))
6035b2ba9d3SPiotr Jasiukajtis  *		 = n*log(2)-1  +  log(z(j))  +  log(y/z(j))
6045b2ba9d3SPiotr Jasiukajtis  *		 = T1(n)       +  T2(j)      +  T3,
6055b2ba9d3SPiotr Jasiukajtis  *
6065b2ba9d3SPiotr Jasiukajtis  *    where T1(n) = n*log(2)-1 and T2(j) = log(z(j)). Both T1 and T2 can be
6075b2ba9d3SPiotr Jasiukajtis  *    pre-calculated and be looked-up in a table. Note that 8 <= x < 1756
6085b2ba9d3SPiotr Jasiukajtis  *    implies 3<=n<=10 implies 1.079.. < T1(n) < 6.931.
6095b2ba9d3SPiotr Jasiukajtis  *
6105b2ba9d3SPiotr Jasiukajtis  *
6115b2ba9d3SPiotr Jasiukajtis  *                     y-z(i)          y       1+s
6125b2ba9d3SPiotr Jasiukajtis  *    For T3, let s = --------; then ----- =  ----- and
6135b2ba9d3SPiotr Jasiukajtis  *                     y+z(i)         z(i)     1-s
6145b2ba9d3SPiotr Jasiukajtis  *                1+s           2   3    2   5
6155b2ba9d3SPiotr Jasiukajtis  *    	T3 = log(-----) = 2s + --- s  + --- s  + ....
6165b2ba9d3SPiotr Jasiukajtis  *                1-s           3        5
6175b2ba9d3SPiotr Jasiukajtis  *
6185b2ba9d3SPiotr Jasiukajtis  *    Suppose the first term 2s is compute in extra precision. The
6195b2ba9d3SPiotr Jasiukajtis  *    dominating error in T3 would then be the rounding error of the
6205b2ba9d3SPiotr Jasiukajtis  *    second term 2/3*s**3. To force the rounding bounded by
6215b2ba9d3SPiotr Jasiukajtis  *    the required accuracy, we have
6225b2ba9d3SPiotr Jasiukajtis  *        single:  |2/3*s**3| < 2**-11   == > |s|<0.09014...
6235b2ba9d3SPiotr Jasiukajtis  *        double:  |2/3*s**3| < 2**-14   == > |s|<0.04507...
6245b2ba9d3SPiotr Jasiukajtis  *        quad  :  |2/3*s**3| < 2**-18   == > |s|<0.01788... = 2**(-5.80..)
6255b2ba9d3SPiotr Jasiukajtis  *
6265b2ba9d3SPiotr Jasiukajtis  *    Base on this analysis, we choose Z = {z(i)|z(i)=1+i/64+1/128, 0<=i<=63}.
6275b2ba9d3SPiotr Jasiukajtis  *    For any y in [1,2), let j = [64*y] chopped to integer, then z(j) is
6285b2ba9d3SPiotr Jasiukajtis  *    the closest to y, and it is not difficult to see that |s| < 2**(-8).
6295b2ba9d3SPiotr Jasiukajtis  *    Please note that the polynomial approximation of T3 must be accurate
6305b2ba9d3SPiotr Jasiukajtis  *        -24-11   -35    -53-14    -67         -113-18   -131
6315b2ba9d3SPiotr Jasiukajtis  *    to 2       =2   ,  2       = 2   ,  and  2        =2
6325b2ba9d3SPiotr Jasiukajtis  *    for single, double, and quadruple precision respectively.
6335b2ba9d3SPiotr Jasiukajtis  *
6345b2ba9d3SPiotr Jasiukajtis  *    Inplementation notes.
6355b2ba9d3SPiotr Jasiukajtis  *    (1) Table look-up entries for T1(n) and T2(j), as well as the calculation
6365b2ba9d3SPiotr Jasiukajtis  *        of the leading term 2s in T3,  are broken up into leading and trailing
6375b2ba9d3SPiotr Jasiukajtis  *        part such that (leading part)* 2**24 will always be an integer. That
6385b2ba9d3SPiotr Jasiukajtis  *        will guarantee the addition of the leading parts will be exact.
6395b2ba9d3SPiotr Jasiukajtis  *
6405b2ba9d3SPiotr Jasiukajtis  *                                   2**(-24)
6415b2ba9d3SPiotr Jasiukajtis  *			    _________V___________________
6425b2ba9d3SPiotr Jasiukajtis  *		T1(n):	   |_________|___________________|
6435b2ba9d3SPiotr Jasiukajtis  *			      _______ ______________________
6445b2ba9d3SPiotr Jasiukajtis  *		T2(j):	     |_______|______________________|
6455b2ba9d3SPiotr Jasiukajtis  *			         ____ _______________________
6465b2ba9d3SPiotr Jasiukajtis  *		2s:	        |____|_______________________|
6475b2ba9d3SPiotr Jasiukajtis  *			             __________________________
6485b2ba9d3SPiotr Jasiukajtis  *         +    T3(s)-2s:           |__________________________|
6495b2ba9d3SPiotr Jasiukajtis  *                       -------------------------------------------
6505b2ba9d3SPiotr Jasiukajtis  *                         [leading] + [Trailing]
6515b2ba9d3SPiotr Jasiukajtis  *
6525b2ba9d3SPiotr Jasiukajtis  *    (2) How to compute 2s accurately.
6535b2ba9d3SPiotr Jasiukajtis  *        (A) Compute v = 2s to the working precision. If |v| < 2**(-18),
6545b2ba9d3SPiotr Jasiukajtis  *            stop.
6555b2ba9d3SPiotr Jasiukajtis  *        (B) chopped v to 2**(-24): v = ((int)(v*2**24))/2**24
6565b2ba9d3SPiotr Jasiukajtis  *	 (C) 2s = v + (2s - v), where
6575b2ba9d3SPiotr Jasiukajtis  *                        1
6585b2ba9d3SPiotr Jasiukajtis  *		2s - v = --- * (2(y-z) - v*(y+z) )
6595b2ba9d3SPiotr Jasiukajtis  *                       y+z
6605b2ba9d3SPiotr Jasiukajtis  *                         1
6615b2ba9d3SPiotr Jasiukajtis  *                      = --- * ( [2(y-z) - v*(y+z)_h ]  - v*(y+z)_l  )
6625b2ba9d3SPiotr Jasiukajtis  *                        y+z
6635b2ba9d3SPiotr Jasiukajtis  *           where (y+z)_h = (y+z) rounded to 24 bits by (double)(float),
6645b2ba9d3SPiotr Jasiukajtis  *	    and (y+z)_l = ((z+z)-(y+z)_h)+(y-z).  Note the the quantity
6655b2ba9d3SPiotr Jasiukajtis  *	    in [] is exact.
6665b2ba9d3SPiotr Jasiukajtis  *                                                      2         4
6675b2ba9d3SPiotr Jasiukajtis  *    (3) Remez approximation for (T3(s)-2s)/s = T3[0]*s + T3[1]*s + ...:
6685b2ba9d3SPiotr Jasiukajtis  *	 Single precision: 1 term (compute in double precision arithmetic)
6695b2ba9d3SPiotr Jasiukajtis  *	    T3(s) = 2s + S1*s^3, S1 = 0.6666717231848518054693623697539230
6705b2ba9d3SPiotr Jasiukajtis  *	    Remez error: |T3(s)/s - (2s+S1*s^3)| < 2**(-35.87)
6715b2ba9d3SPiotr Jasiukajtis  *	 Double precision: 3 terms, Remez error is bounded by 2**(-72.40),
6725b2ba9d3SPiotr Jasiukajtis  *	    see "tgamma_log"
6735b2ba9d3SPiotr Jasiukajtis  *	 Quad precision: 7 terms, Remez error is bounded by 2**(-136.54),
6745b2ba9d3SPiotr Jasiukajtis  *	    see "tgammal_log"
6755b2ba9d3SPiotr Jasiukajtis  *
6765b2ba9d3SPiotr Jasiukajtis  *   The computation of 0.5*(ln(2pi)-1):
6775b2ba9d3SPiotr Jasiukajtis  *   	0.5*(ln(2pi)-1) =  0.4189385332046727417803297364056176398614...
6785b2ba9d3SPiotr Jasiukajtis  *	split 0.5*(ln(2pi)-1) to hln2pi_h + hln2pi_l, where hln2pi_h is the
6795b2ba9d3SPiotr Jasiukajtis  *	leading 21 bits of the constant.
6805b2ba9d3SPiotr Jasiukajtis  *	    hln2pi_h= 0.4189383983612060546875
6815b2ba9d3SPiotr Jasiukajtis  *	    hln2pi_l= 1.348434666870928297364056176398612173648e-07
6825b2ba9d3SPiotr Jasiukajtis  *
6835b2ba9d3SPiotr Jasiukajtis  *   The computation of 1/x*P(1/x^2) = log(G(x))-(x-.5)(ln(x)-1)-(.5ln(2pi)-1):
6845b2ba9d3SPiotr Jasiukajtis  *	Let s = 1/x <= 1/8 < 0.125. We have
6855b2ba9d3SPiotr Jasiukajtis  *	quad precision
6865b2ba9d3SPiotr Jasiukajtis  *	    |GP(s) - s*P(s^2)| <= 2**(-120.6), where
6875b2ba9d3SPiotr Jasiukajtis  *			       3      5            39
6885b2ba9d3SPiotr Jasiukajtis  *	    GP(s) = GP0*s+GP1*s +GP2*s +... +GP19*s    ,
6895b2ba9d3SPiotr Jasiukajtis  *       GP0  =   0.083333333333333333333333333333333172839171301
6905b2ba9d3SPiotr Jasiukajtis  *			hex 0x3ffe5555 55555555 55555555 55555548
6915b2ba9d3SPiotr Jasiukajtis  *       GP1  =  -2.77777777777777777777777777492501211999399424104e-0003
6925b2ba9d3SPiotr Jasiukajtis  *       GP2  =   7.93650793650793650793635650541638236350020883243e-0004
6935b2ba9d3SPiotr Jasiukajtis  *       GP3  =  -5.95238095238095238057299772679324503339241961704e-0004
6945b2ba9d3SPiotr Jasiukajtis  *       GP4  =   8.41750841750841696138422987977683524926142600321e-0004
6955b2ba9d3SPiotr Jasiukajtis  *       GP5  =  -1.91752691752686682825032547823699662178842123308e-0003
6965b2ba9d3SPiotr Jasiukajtis  *       GP6  =   6.41025641022403480921891559356473451161279359322e-0003
6975b2ba9d3SPiotr Jasiukajtis  *       GP7  =  -2.95506535798414019189819587455577003732808185071e-0002
6985b2ba9d3SPiotr Jasiukajtis  *       GP8  =   1.79644367229970031486079180060923073476568732136e-0001
6995b2ba9d3SPiotr Jasiukajtis  *       GP9  =  -1.39243086487274662174562872567057200255649290646e+0000
7005b2ba9d3SPiotr Jasiukajtis  *       GP10 =   1.34025874044417962188677816477842265259608269775e+0001
7015b2ba9d3SPiotr Jasiukajtis  *       GP11 =  -1.56803713480127469414495545399982508700748274318e+0002
7025b2ba9d3SPiotr Jasiukajtis  *       GP12 =   2.18739841656201561694927630335099313968924493891e+0003
7035b2ba9d3SPiotr Jasiukajtis  *       GP13 =  -3.55249848644100338419187038090925410976237921269e+0004
7045b2ba9d3SPiotr Jasiukajtis  *       GP14 =   6.43464880437835286216768959439484376449179576452e+0005
7055b2ba9d3SPiotr Jasiukajtis  *       GP15 =  -1.20459154385577014992600342782821389605893904624e+0007
7065b2ba9d3SPiotr Jasiukajtis  *       GP16 =   2.09263249637351298563934942349749718491071093210e+0008
7075b2ba9d3SPiotr Jasiukajtis  *       GP17 =  -2.96247483183169219343745316433899599834685703457e+0009
7085b2ba9d3SPiotr Jasiukajtis  *       GP18 =   2.88984933605896033154727626086506756972327292981e+0010
7095b2ba9d3SPiotr Jasiukajtis  *       GP19 =  -1.40960434146030007732838382416230610302678063984e+0011
7105b2ba9d3SPiotr Jasiukajtis  *
7115b2ba9d3SPiotr Jasiukajtis  *       double precision
7125b2ba9d3SPiotr Jasiukajtis  *	    |GP(s) - s*P(s^2)| <= 2**(-63.5), where
7135b2ba9d3SPiotr Jasiukajtis  *			       3      5      7      9      11      13      15
7145b2ba9d3SPiotr Jasiukajtis  *	    GP(s) = GP0*s+GP1*s +GP2*s +GP3*s +GP4*s +GP5*s  +GP6*s  +GP7*s  ,
7155b2ba9d3SPiotr Jasiukajtis  *
7165b2ba9d3SPiotr Jasiukajtis  *		GP0=  0.0833333333333333287074040640618477 (3FB55555 55555555)
7175b2ba9d3SPiotr Jasiukajtis  *		GP1= -2.77777777776649355200565611114627670089130772843e-0003
7185b2ba9d3SPiotr Jasiukajtis  *		GP2=  7.93650787486083724805476194170211775784158551509e-0004
7195b2ba9d3SPiotr Jasiukajtis  *		GP3= -5.95236628558314928757811419580281294593903582971e-0004
7205b2ba9d3SPiotr Jasiukajtis  *		GP4=  8.41566473999853451983137162780427812781178932540e-0004
7215b2ba9d3SPiotr Jasiukajtis  *		GP5= -1.90424776670441373564512942038926168175921303212e-0003
7225b2ba9d3SPiotr Jasiukajtis  *		GP6=  5.84933161530949666312333949534482303007354299178e-0003
7235b2ba9d3SPiotr Jasiukajtis  *		GP7= -1.59453228931082030262124832506144392496561694550e-0002
7245b2ba9d3SPiotr Jasiukajtis  *       single precision
7255b2ba9d3SPiotr Jasiukajtis  *	    |GP(s) - s*P(s^2)| <= 2**(-37.78), where
7265b2ba9d3SPiotr Jasiukajtis  *			       3      5
7275b2ba9d3SPiotr Jasiukajtis  *	    GP(s) = GP0*s+GP1*s +GP2*s
7285b2ba9d3SPiotr Jasiukajtis  *        GP0 =   8.33333330959694065245736888749042811909994573178e-0002
7295b2ba9d3SPiotr Jasiukajtis  *        GP1 =  -2.77765545601667179767706600890361535225507762168e-0003
7305b2ba9d3SPiotr Jasiukajtis  *        GP2 =   7.77830853479775281781085278324621033523037489883e-0004
7315b2ba9d3SPiotr Jasiukajtis  *
7325b2ba9d3SPiotr Jasiukajtis  *
7335b2ba9d3SPiotr Jasiukajtis  *	Implementation note:
7345b2ba9d3SPiotr Jasiukajtis  *	z = (1/x), z2 = z*z, z4 = z2*z2;
7355b2ba9d3SPiotr Jasiukajtis  *	p = z*(GP0+z2*(GP1+....+z2*GP7))
7365b2ba9d3SPiotr Jasiukajtis  *	  = z*(GP0+(z4*(GP2+z4*(GP4+z4*GP6))+z2*(GP1+z4*(GP3+z4*(GP5+z4*GP7)))))
7375b2ba9d3SPiotr Jasiukajtis  *
7385b2ba9d3SPiotr Jasiukajtis  *   Adding everything up:
7395b2ba9d3SPiotr Jasiukajtis  *	t = rr.h*ww.h+hln2pi_h      		... exact
7405b2ba9d3SPiotr Jasiukajtis  *	w = (hln2pi_l + ((x-0.5)*ww.l+rr.l*ww.h)) + p
7415b2ba9d3SPiotr Jasiukajtis  *
7425b2ba9d3SPiotr Jasiukajtis  *   Computing exp(t+w):
7435b2ba9d3SPiotr Jasiukajtis  *	s = t+w; write s = (n+j/32)*ln2+r, |r|<=(1/64)*ln2, then
7445b2ba9d3SPiotr Jasiukajtis  *	exp(s) = 2**n * (2**(j/32) + 2**(j/32)*expm1(r)), where
7455b2ba9d3SPiotr Jasiukajtis  *	expm1(r) = r + Et1*r^2 + Et2*r^3 + ... + Et5*r^6, and
7465b2ba9d3SPiotr Jasiukajtis  *	2**(j/32) is obtained by table look-up S[j]+S_trail[j].
7475b2ba9d3SPiotr Jasiukajtis  *	Remez error bound:
7485b2ba9d3SPiotr Jasiukajtis  *	|exp(r) - (1+r+Et1*r^2+...+Et5*r^6)| <= 2^(-63).
7495b2ba9d3SPiotr Jasiukajtis  */
7505b2ba9d3SPiotr Jasiukajtis 
7515b2ba9d3SPiotr Jasiukajtis #include "libm.h"
7525b2ba9d3SPiotr Jasiukajtis 
7535b2ba9d3SPiotr Jasiukajtis #define	__HI(x)	((int *) &x)[HIWORD]
7545b2ba9d3SPiotr Jasiukajtis #define	__LO(x)	((unsigned *) &x)[LOWORD]
7555b2ba9d3SPiotr Jasiukajtis 
7565b2ba9d3SPiotr Jasiukajtis struct Double {
7575b2ba9d3SPiotr Jasiukajtis 	double h;
7585b2ba9d3SPiotr Jasiukajtis 	double l;
7595b2ba9d3SPiotr Jasiukajtis };
7605b2ba9d3SPiotr Jasiukajtis 
7615b2ba9d3SPiotr Jasiukajtis /* Hex value of GP0 shoule be 3FB55555 55555555 */
7625b2ba9d3SPiotr Jasiukajtis static const double c[] = {
7635b2ba9d3SPiotr Jasiukajtis 	+1.0,
7645b2ba9d3SPiotr Jasiukajtis 	+2.0,
7655b2ba9d3SPiotr Jasiukajtis 	+0.5,
7665b2ba9d3SPiotr Jasiukajtis 	+1.0e-300,
7675b2ba9d3SPiotr Jasiukajtis 	+6.66666666666666740682e-01,				/* A1=T3[0] */
7685b2ba9d3SPiotr Jasiukajtis 	+3.99999999955626478023093908674902212920e-01,		/* A2=T3[1] */
7695b2ba9d3SPiotr Jasiukajtis 	+2.85720221533145659809237398709372330980e-01,		/* A3=T3[2] */
7705b2ba9d3SPiotr Jasiukajtis 	+0.0833333333333333287074040640618477,			/* GP[0] */
7715b2ba9d3SPiotr Jasiukajtis 	-2.77777777776649355200565611114627670089130772843e-03,
7725b2ba9d3SPiotr Jasiukajtis 	+7.93650787486083724805476194170211775784158551509e-04,
7735b2ba9d3SPiotr Jasiukajtis 	-5.95236628558314928757811419580281294593903582971e-04,
7745b2ba9d3SPiotr Jasiukajtis 	+8.41566473999853451983137162780427812781178932540e-04,
7755b2ba9d3SPiotr Jasiukajtis 	-1.90424776670441373564512942038926168175921303212e-03,
7765b2ba9d3SPiotr Jasiukajtis 	+5.84933161530949666312333949534482303007354299178e-03,
7775b2ba9d3SPiotr Jasiukajtis 	-1.59453228931082030262124832506144392496561694550e-02,
7785b2ba9d3SPiotr Jasiukajtis 	+4.18937683105468750000e-01,				/* hln2pi_h */
7795b2ba9d3SPiotr Jasiukajtis 	+8.50099203991780279640e-07,				/* hln2pi_l */
7805b2ba9d3SPiotr Jasiukajtis 	+4.18938533204672741744150788368695779923320328369e-01,	/* hln2pi */
7815b2ba9d3SPiotr Jasiukajtis 	+2.16608493865351192653e-02,				/* ln2_32hi */
7825b2ba9d3SPiotr Jasiukajtis 	+5.96317165397058656257e-12,				/* ln2_32lo */
7835b2ba9d3SPiotr Jasiukajtis 	+4.61662413084468283841e+01,				/* invln2_32 */
7845b2ba9d3SPiotr Jasiukajtis 	+5.0000000000000000000e-1,				/* Et1 */
7855b2ba9d3SPiotr Jasiukajtis 	+1.66666666665223585560605991943703896196054020060e-01,	/* Et2 */
7865b2ba9d3SPiotr Jasiukajtis 	+4.16666666665895103520154073534275286743788421687e-02,	/* Et3 */
7875b2ba9d3SPiotr Jasiukajtis 	+8.33336844093536520775865096538773197505523826029e-03,	/* Et4 */
7885b2ba9d3SPiotr Jasiukajtis 	+1.38889201930843436040204096950052984793587640227e-03,	/* Et5 */
7895b2ba9d3SPiotr Jasiukajtis };
7905b2ba9d3SPiotr Jasiukajtis 
7915b2ba9d3SPiotr Jasiukajtis #define	one	  c[0]
7925b2ba9d3SPiotr Jasiukajtis #define	two	  c[1]
7935b2ba9d3SPiotr Jasiukajtis #define	half	  c[2]
7945b2ba9d3SPiotr Jasiukajtis #define	tiny	  c[3]
7955b2ba9d3SPiotr Jasiukajtis #define	A1	  c[4]
7965b2ba9d3SPiotr Jasiukajtis #define	A2	  c[5]
7975b2ba9d3SPiotr Jasiukajtis #define	A3	  c[6]
7985b2ba9d3SPiotr Jasiukajtis #define	GP0	  c[7]
7995b2ba9d3SPiotr Jasiukajtis #define	GP1	  c[8]
8005b2ba9d3SPiotr Jasiukajtis #define	GP2	  c[9]
8015b2ba9d3SPiotr Jasiukajtis #define	GP3	  c[10]
8025b2ba9d3SPiotr Jasiukajtis #define	GP4	  c[11]
8035b2ba9d3SPiotr Jasiukajtis #define	GP5	  c[12]
8045b2ba9d3SPiotr Jasiukajtis #define	GP6	  c[13]
8055b2ba9d3SPiotr Jasiukajtis #define	GP7	  c[14]
8065b2ba9d3SPiotr Jasiukajtis #define	hln2pi_h  c[15]
8075b2ba9d3SPiotr Jasiukajtis #define	hln2pi_l  c[16]
8085b2ba9d3SPiotr Jasiukajtis #define	hln2pi	  c[17]
8095b2ba9d3SPiotr Jasiukajtis #define	ln2_32hi  c[18]
8105b2ba9d3SPiotr Jasiukajtis #define	ln2_32lo  c[19]
8115b2ba9d3SPiotr Jasiukajtis #define	invln2_32 c[20]
8125b2ba9d3SPiotr Jasiukajtis #define	Et1	  c[21]
8135b2ba9d3SPiotr Jasiukajtis #define	Et2	  c[22]
8145b2ba9d3SPiotr Jasiukajtis #define	Et3	  c[23]
8155b2ba9d3SPiotr Jasiukajtis #define	Et4	  c[24]
8165b2ba9d3SPiotr Jasiukajtis #define	Et5	  c[25]
8175b2ba9d3SPiotr Jasiukajtis 
8185b2ba9d3SPiotr Jasiukajtis /*
8195b2ba9d3SPiotr Jasiukajtis  * double precision coefficients for computing log(x)-1 in tgamma.
8205b2ba9d3SPiotr Jasiukajtis  *  See "algorithm" for details
8215b2ba9d3SPiotr Jasiukajtis  *
8225b2ba9d3SPiotr Jasiukajtis  *  log(x) - 1 = T1(n) + T2(j) + T3(s), where x = 2**n * y,  1<=y<2,
8235b2ba9d3SPiotr Jasiukajtis  *  j=[64*y], z[j]=1+j/64+1/128, s = (y-z[j])/(y+z[j]), and
8245b2ba9d3SPiotr Jasiukajtis  *       T1(n) = T1[2n,2n+1] = n*log(2)-1,
8255b2ba9d3SPiotr Jasiukajtis  *       T2(j) = T2[2j,2j+1] = log(z[j]),
8265b2ba9d3SPiotr Jasiukajtis  *       T3(s) = 2s + T3[0]s^3 + T3[1]s^5 + T3[2]s^7
8275b2ba9d3SPiotr Jasiukajtis  *	       = 2s + A1*s^3 + A2*s^5 + A3*s^7  (see const A1,A2,A3)
8285b2ba9d3SPiotr Jasiukajtis  *  Note
8295b2ba9d3SPiotr Jasiukajtis  *  (1) the leading entries are truncated to 24 binary point.
8305b2ba9d3SPiotr Jasiukajtis  *      See Remezpak/sun/tgamma_log_64.c
8315b2ba9d3SPiotr Jasiukajtis  *  (2) Remez error for T3(s) is bounded by 2**(-72.4)
8325b2ba9d3SPiotr Jasiukajtis  *      See mpremez/work/Log/tgamma_log_4_outr2
8335b2ba9d3SPiotr Jasiukajtis  */
8345b2ba9d3SPiotr Jasiukajtis 
8355b2ba9d3SPiotr Jasiukajtis static const double T1[] = {
8365b2ba9d3SPiotr Jasiukajtis 	-1.00000000000000000000e+00,	/* 0xBFF00000 0x00000000 */
8375b2ba9d3SPiotr Jasiukajtis 	+0.00000000000000000000e+00,	/* 0x00000000 0x00000000 */
8385b2ba9d3SPiotr Jasiukajtis 	-3.06852817535400390625e-01,	/* 0xBFD3A37A 0x00000000 */
8395b2ba9d3SPiotr Jasiukajtis 	-1.90465429995776763166e-09,	/* 0xBE205C61 0x0CA86C38 */
8405b2ba9d3SPiotr Jasiukajtis 	+3.86294305324554443359e-01,	/* 0x3FD8B90B 0xC0000000 */
8415b2ba9d3SPiotr Jasiukajtis 	+5.57953361754750897367e-08,	/* 0x3E6DF473 0xDE6AF279 */
8425b2ba9d3SPiotr Jasiukajtis 	+1.07944148778915405273e+00,	/* 0x3FF14564 0x70000000 */
8435b2ba9d3SPiotr Jasiukajtis 	+5.38906818755173187963e-08,	/* 0x3E6CEEAD 0xCDA06BB5 */
8445b2ba9d3SPiotr Jasiukajtis 	+1.77258867025375366211e+00,	/* 0x3FFC5C85 0xF0000000 */
8455b2ba9d3SPiotr Jasiukajtis 	+5.19860275755595544734e-08,	/* 0x3E6BE8E7 0xBCD5E4F2 */
8465b2ba9d3SPiotr Jasiukajtis 	+2.46573585271835327148e+00,	/* 0x4003B9D3 0xB8000000 */
8475b2ba9d3SPiotr Jasiukajtis 	+5.00813732756017835330e-08,	/* 0x3E6AE321 0xAC0B5E2E */
8485b2ba9d3SPiotr Jasiukajtis 	+3.15888303518295288086e+00,	/* 0x40094564 0x78000000 */
8495b2ba9d3SPiotr Jasiukajtis 	+4.81767189756440192100e-08,	/* 0x3E69DD5B 0x9B40D76B */
8505b2ba9d3SPiotr Jasiukajtis 	+3.85203021764755249023e+00,	/* 0x400ED0F5 0x38000000 */
8515b2ba9d3SPiotr Jasiukajtis 	+4.62720646756862482697e-08,	/* 0x3E68D795 0x8A7650A7 */
8525b2ba9d3SPiotr Jasiukajtis 	+4.54517740011215209961e+00,	/* 0x40122E42 0xFC000000 */
8535b2ba9d3SPiotr Jasiukajtis 	+4.43674103757284839467e-08,	/* 0x3E67D1CF 0x79ABC9E4 */
8545b2ba9d3SPiotr Jasiukajtis 	+5.23832458257675170898e+00,	/* 0x4014F40B 0x5C000000 */
8555b2ba9d3SPiotr Jasiukajtis 	+4.24627560757707130063e-08,	/* 0x3E66CC09 0x68E14320 */
8565b2ba9d3SPiotr Jasiukajtis 	+5.93147176504135131836e+00,	/* 0x4017B9D3 0xBC000000 */
8575b2ba9d3SPiotr Jasiukajtis 	+4.05581017758129486834e-08,	/* 0x3E65C643 0x5816BC5D */
8585b2ba9d3SPiotr Jasiukajtis };
8595b2ba9d3SPiotr Jasiukajtis 
8605b2ba9d3SPiotr Jasiukajtis static const double T2[] = {
8615b2ba9d3SPiotr Jasiukajtis 	+7.78210163116455078125e-03,	/* 0x3F7FE020 0x00000000 */
8625b2ba9d3SPiotr Jasiukajtis 	+3.88108903981662140884e-08,	/* 0x3E64D620 0xCF11F86F */
8635b2ba9d3SPiotr Jasiukajtis 	+2.31670141220092773438e-02,	/* 0x3F97B918 0x00000000 */
8645b2ba9d3SPiotr Jasiukajtis 	+4.51595251008850513740e-08,	/* 0x3E683EAD 0x88D54940 */
8655b2ba9d3SPiotr Jasiukajtis 	+3.83188128471374511719e-02,	/* 0x3FA39E86 0x00000000 */
8665b2ba9d3SPiotr Jasiukajtis 	+5.14549991480218823411e-08,	/* 0x3E6B9FEB 0xD5FA9016 */
8675b2ba9d3SPiotr Jasiukajtis 	+5.32444715499877929688e-02,	/* 0x3FAB42DC 0x00000000 */
8685b2ba9d3SPiotr Jasiukajtis 	+4.29688244898971182165e-08,	/* 0x3E671197 0x1BEC28D1 */
8695b2ba9d3SPiotr Jasiukajtis 	+6.79506063461303710938e-02,	/* 0x3FB16536 0x00000000 */
8705b2ba9d3SPiotr Jasiukajtis 	+5.55623773783008185114e-08,	/* 0x3E6DD46F 0x5C1D0C4C */
8715b2ba9d3SPiotr Jasiukajtis 	+8.24436545372009277344e-02,	/* 0x3FB51B07 0x00000000 */
8725b2ba9d3SPiotr Jasiukajtis 	+1.46738736635337847313e-08,	/* 0x3E4F830C 0x1FB493C7 */
8735b2ba9d3SPiotr Jasiukajtis 	+9.67295765876770019531e-02,	/* 0x3FB8C345 0x00000000 */
8745b2ba9d3SPiotr Jasiukajtis 	+4.98708741103424492282e-08,	/* 0x3E6AC633 0x641EB597 */
8755b2ba9d3SPiotr Jasiukajtis 	+1.10814332962036132812e-01,	/* 0x3FBC5E54 0x00000000 */
8765b2ba9d3SPiotr Jasiukajtis 	+3.33782539813823062226e-08,	/* 0x3E61EB78 0xE862BAC3 */
8775b2ba9d3SPiotr Jasiukajtis 	+1.24703466892242431641e-01,	/* 0x3FBFEC91 0x00000000 */
8785b2ba9d3SPiotr Jasiukajtis 	+1.16087148042227818450e-08,	/* 0x3E48EDF5 0x5D551729 */
8795b2ba9d3SPiotr Jasiukajtis 	+1.38402283191680908203e-01,	/* 0x3FC1B72A 0x80000000 */
8805b2ba9d3SPiotr Jasiukajtis 	+3.96674382274822001957e-08,	/* 0x3E654BD9 0xE80A4181 */
8815b2ba9d3SPiotr Jasiukajtis 	+1.51916027069091796875e-01,	/* 0x3FC371FC 0x00000000 */
8825b2ba9d3SPiotr Jasiukajtis 	+1.49567501781968021494e-08,	/* 0x3E500F47 0xBA1DE6CB */
8835b2ba9d3SPiotr Jasiukajtis 	+1.65249526500701904297e-01,	/* 0x3FC526E5 0x80000000 */
8845b2ba9d3SPiotr Jasiukajtis 	+4.63946052585787334062e-08,	/* 0x3E68E86D 0x0DE8B900 */
8855b2ba9d3SPiotr Jasiukajtis 	+1.78407609462738037109e-01,	/* 0x3FC6D60F 0x80000000 */
8865b2ba9d3SPiotr Jasiukajtis 	+4.80100802600100279538e-08,	/* 0x3E69C674 0x8723551E */
8875b2ba9d3SPiotr Jasiukajtis 	+1.91394805908203125000e-01,	/* 0x3FC87FA0 0x00000000 */
8885b2ba9d3SPiotr Jasiukajtis 	+4.70914263296092971436e-08,	/* 0x3E694832 0x44240802 */
8895b2ba9d3SPiotr Jasiukajtis 	+2.04215526580810546875e-01,	/* 0x3FCA23BC 0x00000000 */
8905b2ba9d3SPiotr Jasiukajtis 	+1.48478803446288209001e-08,	/* 0x3E4FE2B5 0x63193712 */
8915b2ba9d3SPiotr Jasiukajtis 	+2.16873884201049804688e-01,	/* 0x3FCBC286 0x00000000 */
8925b2ba9d3SPiotr Jasiukajtis 	+5.40995645549315919488e-08,	/* 0x3E6D0B63 0x358A7E74 */
8935b2ba9d3SPiotr Jasiukajtis 	+2.29374051094055175781e-01,	/* 0x3FCD5C21 0x00000000 */
8945b2ba9d3SPiotr Jasiukajtis 	+4.99707906542102284117e-08,	/* 0x3E6AD3EE 0xE456E443 */
8955b2ba9d3SPiotr Jasiukajtis 	+2.41719901561737060547e-01,	/* 0x3FCEF0AD 0x80000000 */
8965b2ba9d3SPiotr Jasiukajtis 	+3.53254081075974352804e-08,	/* 0x3E62F716 0x4D948638 */
8975b2ba9d3SPiotr Jasiukajtis 	+2.53915190696716308594e-01,	/* 0x3FD04025 0x80000000 */
8985b2ba9d3SPiotr Jasiukajtis 	+1.92842471355435739091e-08,	/* 0x3E54B4D0 0x40DAE27C */
8995b2ba9d3SPiotr Jasiukajtis 	+2.65963494777679443359e-01,	/* 0x3FD1058B 0xC0000000 */
9005b2ba9d3SPiotr Jasiukajtis 	+5.37194584979797487125e-08,	/* 0x3E6CD725 0x6A8C4FD0 */
9015b2ba9d3SPiotr Jasiukajtis 	+2.77868449687957763672e-01,	/* 0x3FD1C898 0xC0000000 */
9025b2ba9d3SPiotr Jasiukajtis 	+1.31549854251447496506e-09,	/* 0x3E16999F 0xAFBC68E7 */
9035b2ba9d3SPiotr Jasiukajtis 	+2.89633274078369140625e-01,	/* 0x3FD2895A 0x00000000 */
9045b2ba9d3SPiotr Jasiukajtis 	+1.85046735362538929911e-08,	/* 0x3E53DE86 0xA35EB493 */
9055b2ba9d3SPiotr Jasiukajtis 	+3.01261305809020996094e-01,	/* 0x3FD347DD 0x80000000 */
9065b2ba9d3SPiotr Jasiukajtis 	+2.47691407849191245052e-08,	/* 0x3E5A987D 0x54D64567 */
9075b2ba9d3SPiotr Jasiukajtis 	+3.12755703926086425781e-01,	/* 0x3FD40430 0x80000000 */
9085b2ba9d3SPiotr Jasiukajtis 	+6.07781046260499658610e-09,	/* 0x3E3A1A9F 0x8EF4304A */
9095b2ba9d3SPiotr Jasiukajtis 	+3.24119448661804199219e-01,	/* 0x3FD4BE5F 0x80000000 */
9105b2ba9d3SPiotr Jasiukajtis 	+1.99924077768719198045e-08,	/* 0x3E557778 0xA0DB4C99 */
9115b2ba9d3SPiotr Jasiukajtis 	+3.35355520248413085938e-01,	/* 0x3FD57677 0x00000000 */
9125b2ba9d3SPiotr Jasiukajtis 	+2.16727247443196802771e-08,	/* 0x3E57455A 0x6C549AB7 */
9135b2ba9d3SPiotr Jasiukajtis 	+3.46466720104217529297e-01,	/* 0x3FD62C82 0xC0000000 */
9145b2ba9d3SPiotr Jasiukajtis 	+4.72419910516215900493e-08,	/* 0x3E695CE3 0xCA97B7B0 */
9155b2ba9d3SPiotr Jasiukajtis 	+3.57455849647521972656e-01,	/* 0x3FD6E08E 0x80000000 */
9165b2ba9d3SPiotr Jasiukajtis 	+3.92742818015697624778e-08,	/* 0x3E6515D0 0xF1C609CA */
9175b2ba9d3SPiotr Jasiukajtis 	+3.68325531482696533203e-01,	/* 0x3FD792A5 0x40000000 */
9185b2ba9d3SPiotr Jasiukajtis 	+2.96760111198451042238e-08,	/* 0x3E5FDD47 0xA27C15DA */
9195b2ba9d3SPiotr Jasiukajtis 	+3.79078328609466552734e-01,	/* 0x3FD842D1 0xC0000000 */
9205b2ba9d3SPiotr Jasiukajtis 	+2.43255029056564770289e-08,	/* 0x3E5A1E8B 0x17493B14 */
9215b2ba9d3SPiotr Jasiukajtis 	+3.89716744422912597656e-01,	/* 0x3FD8F11E 0x80000000 */
9225b2ba9d3SPiotr Jasiukajtis 	+6.71711261571421332726e-09,	/* 0x3E3CD98B 0x1DF85DA7 */
9235b2ba9d3SPiotr Jasiukajtis 	+4.00243163108825683594e-01,	/* 0x3FD99D95 0x80000000 */
9245b2ba9d3SPiotr Jasiukajtis 	+1.01818702333557515008e-09,	/* 0x3E117E08 0xACBA92EF */
9255b2ba9d3SPiotr Jasiukajtis 	+4.10659909248352050781e-01,	/* 0x3FDA4840 0x80000000 */
9265b2ba9d3SPiotr Jasiukajtis 	+1.57369163351530571459e-08,	/* 0x3E50E5BB 0x0A2BFCA7 */
9275b2ba9d3SPiotr Jasiukajtis 	+4.20969247817993164062e-01,	/* 0x3FDAF129 0x00000000 */
9285b2ba9d3SPiotr Jasiukajtis 	+4.68261364720663662040e-08,	/* 0x3E6923BC 0x358899C2 */
9295b2ba9d3SPiotr Jasiukajtis 	+4.31173443794250488281e-01,	/* 0x3FDB9858 0x80000000 */
9305b2ba9d3SPiotr Jasiukajtis 	+2.10241208525779214510e-08,	/* 0x3E569310 0xFB598FB1 */
9315b2ba9d3SPiotr Jasiukajtis 	+4.41274523735046386719e-01,	/* 0x3FDC3DD7 0x80000000 */
9325b2ba9d3SPiotr Jasiukajtis 	+3.70698288427707487748e-08,	/* 0x3E63E6D6 0xA6B9D9E1 */
9335b2ba9d3SPiotr Jasiukajtis 	+4.51274633407592773438e-01,	/* 0x3FDCE1AF 0x00000000 */
9345b2ba9d3SPiotr Jasiukajtis 	+1.07318658117071930723e-08,	/* 0x3E470BE7 0xD6F6FA58 */
9355b2ba9d3SPiotr Jasiukajtis 	+4.61175680160522460938e-01,	/* 0x3FDD83E7 0x00000000 */
9365b2ba9d3SPiotr Jasiukajtis 	+3.49616477054305011286e-08,	/* 0x3E62C517 0x9F2828AE */
9375b2ba9d3SPiotr Jasiukajtis 	+4.70979690551757812500e-01,	/* 0x3FDE2488 0x00000000 */
9385b2ba9d3SPiotr Jasiukajtis 	+2.46670332000468969567e-08,	/* 0x3E5A7C6C 0x261CBD8F */
9395b2ba9d3SPiotr Jasiukajtis 	+4.80688512325286865234e-01,	/* 0x3FDEC399 0xC0000000 */
9405b2ba9d3SPiotr Jasiukajtis 	+1.70204650424422423704e-08,	/* 0x3E52468C 0xC0175CEE */
9415b2ba9d3SPiotr Jasiukajtis 	+4.90303933620452880859e-01,	/* 0x3FDF6123 0xC0000000 */
9425b2ba9d3SPiotr Jasiukajtis 	+5.44247409572909703749e-08,	/* 0x3E6D3814 0x5630A2B6 */
9435b2ba9d3SPiotr Jasiukajtis 	+4.99827861785888671875e-01,	/* 0x3FDFFD2E 0x00000000 */
9445b2ba9d3SPiotr Jasiukajtis 	+7.77056065794633071345e-09,	/* 0x3E40AFE9 0x30AB2FA0 */
9455b2ba9d3SPiotr Jasiukajtis 	+5.09261846542358398438e-01,	/* 0x3FE04BDF 0x80000000 */
9465b2ba9d3SPiotr Jasiukajtis 	+5.52474495483665749052e-08,	/* 0x3E6DA926 0xD265FCC1 */
9475b2ba9d3SPiotr Jasiukajtis 	+5.18607735633850097656e-01,	/* 0x3FE0986F 0x40000000 */
9485b2ba9d3SPiotr Jasiukajtis 	+2.85741955344967264536e-08,	/* 0x3E5EAE6A 0x41723FB5 */
9495b2ba9d3SPiotr Jasiukajtis 	+5.27867078781127929688e-01,	/* 0x3FE0E449 0x80000000 */
9505b2ba9d3SPiotr Jasiukajtis 	+1.08397144554263914271e-08,	/* 0x3E474732 0x2FDBAB97 */
9515b2ba9d3SPiotr Jasiukajtis 	+5.37041425704956054688e-01,	/* 0x3FE12F71 0x80000000 */
9525b2ba9d3SPiotr Jasiukajtis 	+4.01919275998792285777e-08,	/* 0x3E6593EF 0xBC530123 */
9535b2ba9d3SPiotr Jasiukajtis 	+5.46132385730743408203e-01,	/* 0x3FE179EA 0xA0000000 */
9545b2ba9d3SPiotr Jasiukajtis 	+5.18673922421792693237e-08,	/* 0x3E6BD899 0xA0BFC60E */
9555b2ba9d3SPiotr Jasiukajtis 	+5.55141448974609375000e-01,	/* 0x3FE1C3B8 0x00000000 */
9565b2ba9d3SPiotr Jasiukajtis 	+5.85658922177154808539e-08,	/* 0x3E6F713C 0x24BC94F9 */
9575b2ba9d3SPiotr Jasiukajtis 	+5.64070105552673339844e-01,	/* 0x3FE20CDC 0xC0000000 */
9585b2ba9d3SPiotr Jasiukajtis 	+3.27321296262276338905e-08,	/* 0x3E6192AB 0x6D93503D */
9595b2ba9d3SPiotr Jasiukajtis 	+5.72919726371765136719e-01,	/* 0x3FE2555B 0xC0000000 */
9605b2ba9d3SPiotr Jasiukajtis 	+2.71900203723740076878e-08,	/* 0x3E5D31EF 0x96780876 */
9615b2ba9d3SPiotr Jasiukajtis 	+5.81691682338714599609e-01,	/* 0x3FE29D37 0xE0000000 */
9625b2ba9d3SPiotr Jasiukajtis 	+5.72959078829112371070e-08,	/* 0x3E6EC2B0 0x8AC85CD7 */
9635b2ba9d3SPiotr Jasiukajtis 	+5.90387403964996337891e-01,	/* 0x3FE2E474 0x20000000 */
9645b2ba9d3SPiotr Jasiukajtis 	+4.26371800367512948470e-08,	/* 0x3E66E402 0x68405422 */
9655b2ba9d3SPiotr Jasiukajtis 	+5.99008142948150634766e-01,	/* 0x3FE32B13 0x20000000 */
9665b2ba9d3SPiotr Jasiukajtis 	+4.66979327646159769249e-08,	/* 0x3E69121D 0x71320557 */
9675b2ba9d3SPiotr Jasiukajtis 	+6.07555210590362548828e-01,	/* 0x3FE37117 0xA0000000 */
9685b2ba9d3SPiotr Jasiukajtis 	+3.96341792466729582847e-08,	/* 0x3E654747 0xB5C5DD02 */
9695b2ba9d3SPiotr Jasiukajtis 	+6.16029858589172363281e-01,	/* 0x3FE3B684 0x40000000 */
9705b2ba9d3SPiotr Jasiukajtis 	+1.86263416563663175432e-08,	/* 0x3E53FFF8 0x455F1DBE */
9715b2ba9d3SPiotr Jasiukajtis 	+6.24433279037475585938e-01,	/* 0x3FE3FB5B 0x80000000 */
9725b2ba9d3SPiotr Jasiukajtis 	+8.97441791510503832111e-09,	/* 0x3E4345BD 0x096D3A75 */
9735b2ba9d3SPiotr Jasiukajtis 	+6.32766664028167724609e-01,	/* 0x3FE43F9F 0xE0000000 */
9745b2ba9d3SPiotr Jasiukajtis 	+5.54287010493641158796e-09,	/* 0x3E37CE73 0x3BD393DD */
9755b2ba9d3SPiotr Jasiukajtis 	+6.41031146049499511719e-01,	/* 0x3FE48353 0xC0000000 */
9765b2ba9d3SPiotr Jasiukajtis 	+3.33714317793368531132e-08,	/* 0x3E61EA88 0xDF73D5E9 */
9775b2ba9d3SPiotr Jasiukajtis 	+6.49227917194366455078e-01,	/* 0x3FE4C679 0xA0000000 */
9785b2ba9d3SPiotr Jasiukajtis 	+2.94307433638127158696e-08,	/* 0x3E5F99DC 0x7362D1DA */
9795b2ba9d3SPiotr Jasiukajtis 	+6.57358050346374511719e-01,	/* 0x3FE50913 0xC0000000 */
9805b2ba9d3SPiotr Jasiukajtis 	+2.23619855184231409785e-08,	/* 0x3E5802D0 0xD6979675 */
9815b2ba9d3SPiotr Jasiukajtis 	+6.65422618389129638672e-01,	/* 0x3FE54B24 0x60000000 */
9825b2ba9d3SPiotr Jasiukajtis 	+1.41559608102782173188e-08,	/* 0x3E4E6652 0x5EA4550A */
9835b2ba9d3SPiotr Jasiukajtis 	+6.73422634601593017578e-01,	/* 0x3FE58CAD 0xA0000000 */
9845b2ba9d3SPiotr Jasiukajtis 	+4.06105737027198329700e-08,	/* 0x3E65CD79 0x893092F2 */
9855b2ba9d3SPiotr Jasiukajtis 	+6.81359171867370605469e-01,	/* 0x3FE5CDB1 0xC0000000 */
9865b2ba9d3SPiotr Jasiukajtis 	+5.29405324634793230630e-08,	/* 0x3E6C6C17 0x648CF6E4 */
9875b2ba9d3SPiotr Jasiukajtis 	+6.89233243465423583984e-01,	/* 0x3FE60E32 0xE0000000 */
9885b2ba9d3SPiotr Jasiukajtis 	+3.77733853963405370102e-08,	/* 0x3E644788 0xD8CA7C89 */
9895b2ba9d3SPiotr Jasiukajtis };
9905b2ba9d3SPiotr Jasiukajtis 
9915b2ba9d3SPiotr Jasiukajtis /* S[j],S_trail[j] = 2**(j/32.) for the final computation of exp(t+w) */
9925b2ba9d3SPiotr Jasiukajtis static const double S[] = {
9935b2ba9d3SPiotr Jasiukajtis 	+1.00000000000000000000e+00,	/* 3FF0000000000000 */
9945b2ba9d3SPiotr Jasiukajtis 	+1.02189714865411662714e+00,	/* 3FF059B0D3158574 */
9955b2ba9d3SPiotr Jasiukajtis 	+1.04427378242741375480e+00,	/* 3FF0B5586CF9890F */
9965b2ba9d3SPiotr Jasiukajtis 	+1.06714040067682369717e+00,	/* 3FF11301D0125B51 */
9975b2ba9d3SPiotr Jasiukajtis 	+1.09050773266525768967e+00,	/* 3FF172B83C7D517B */
9985b2ba9d3SPiotr Jasiukajtis 	+1.11438674259589243221e+00,	/* 3FF1D4873168B9AA */
9995b2ba9d3SPiotr Jasiukajtis 	+1.13878863475669156458e+00,	/* 3FF2387A6E756238 */
10005b2ba9d3SPiotr Jasiukajtis 	+1.16372485877757747552e+00,	/* 3FF29E9DF51FDEE1 */
10015b2ba9d3SPiotr Jasiukajtis 	+1.18920711500272102690e+00,	/* 3FF306FE0A31B715 */
10025b2ba9d3SPiotr Jasiukajtis 	+1.21524735998046895524e+00,	/* 3FF371A7373AA9CB */
10035b2ba9d3SPiotr Jasiukajtis 	+1.24185781207348400201e+00,	/* 3FF3DEA64C123422 */
10045b2ba9d3SPiotr Jasiukajtis 	+1.26905095719173321989e+00,	/* 3FF44E086061892D */
10055b2ba9d3SPiotr Jasiukajtis 	+1.29683955465100964055e+00,	/* 3FF4BFDAD5362A27 */
10065b2ba9d3SPiotr Jasiukajtis 	+1.32523664315974132322e+00,	/* 3FF5342B569D4F82 */
10075b2ba9d3SPiotr Jasiukajtis 	+1.35425554693689265129e+00,	/* 3FF5AB07DD485429 */
10085b2ba9d3SPiotr Jasiukajtis 	+1.38390988196383202258e+00,	/* 3FF6247EB03A5585 */
10095b2ba9d3SPiotr Jasiukajtis 	+1.41421356237309514547e+00,	/* 3FF6A09E667F3BCD */
10105b2ba9d3SPiotr Jasiukajtis 	+1.44518080697704665027e+00,	/* 3FF71F75E8EC5F74 */
10115b2ba9d3SPiotr Jasiukajtis 	+1.47682614593949934623e+00,	/* 3FF7A11473EB0187 */
10125b2ba9d3SPiotr Jasiukajtis 	+1.50916442759342284141e+00,	/* 3FF82589994CCE13 */
10135b2ba9d3SPiotr Jasiukajtis 	+1.54221082540794074411e+00,	/* 3FF8ACE5422AA0DB */
10145b2ba9d3SPiotr Jasiukajtis 	+1.57598084510788649659e+00,	/* 3FF93737B0CDC5E5 */
10155b2ba9d3SPiotr Jasiukajtis 	+1.61049033194925428347e+00,	/* 3FF9C49182A3F090 */
10165b2ba9d3SPiotr Jasiukajtis 	+1.64575547815396494578e+00,	/* 3FFA5503B23E255D */
10175b2ba9d3SPiotr Jasiukajtis 	+1.68179283050742900407e+00,	/* 3FFAE89F995AD3AD */
10185b2ba9d3SPiotr Jasiukajtis 	+1.71861929812247793414e+00,	/* 3FFB7F76F2FB5E47 */
10195b2ba9d3SPiotr Jasiukajtis 	+1.75625216037329945351e+00,	/* 3FFC199BDD85529C */
10205b2ba9d3SPiotr Jasiukajtis 	+1.79470907500310716820e+00,	/* 3FFCB720DCEF9069 */
10215b2ba9d3SPiotr Jasiukajtis 	+1.83400808640934243066e+00,	/* 3FFD5818DCFBA487 */
10225b2ba9d3SPiotr Jasiukajtis 	+1.87416763411029996256e+00,	/* 3FFDFC97337B9B5F */
10235b2ba9d3SPiotr Jasiukajtis 	+1.91520656139714740007e+00,	/* 3FFEA4AFA2A490DA */
10245b2ba9d3SPiotr Jasiukajtis 	+1.95714412417540017941e+00,	/* 3FFF50765B6E4540 */
10255b2ba9d3SPiotr Jasiukajtis };
10265b2ba9d3SPiotr Jasiukajtis 
10275b2ba9d3SPiotr Jasiukajtis static const double S_trail[] = {
10285b2ba9d3SPiotr Jasiukajtis 	+0.00000000000000000000e+00,
10295b2ba9d3SPiotr Jasiukajtis 	+5.10922502897344389359e-17,	/* 3C8D73E2A475B465 */
10305b2ba9d3SPiotr Jasiukajtis 	+8.55188970553796365958e-17,	/* 3C98A62E4ADC610A */
10315b2ba9d3SPiotr Jasiukajtis 	-7.89985396684158212226e-17,	/* BC96C51039449B3A */
10325b2ba9d3SPiotr Jasiukajtis 	-3.04678207981247114697e-17,	/* BC819041B9D78A76 */
10335b2ba9d3SPiotr Jasiukajtis 	+1.04102784568455709549e-16,	/* 3C9E016E00A2643C */
10345b2ba9d3SPiotr Jasiukajtis 	+8.91281267602540777782e-17,	/* 3C99B07EB6C70573 */
10355b2ba9d3SPiotr Jasiukajtis 	+3.82920483692409349872e-17,	/* 3C8612E8AFAD1255 */
10365b2ba9d3SPiotr Jasiukajtis 	+3.98201523146564611098e-17,	/* 3C86F46AD23182E4 */
10375b2ba9d3SPiotr Jasiukajtis 	-7.71263069268148813091e-17,	/* BC963AEABF42EAE2 */
10385b2ba9d3SPiotr Jasiukajtis 	+4.65802759183693679123e-17,	/* 3C8ADA0911F09EBC */
10395b2ba9d3SPiotr Jasiukajtis 	+2.66793213134218609523e-18,	/* 3C489B7A04EF80D0 */
10405b2ba9d3SPiotr Jasiukajtis 	+2.53825027948883149593e-17,	/* 3C7D4397AFEC42E2 */
10415b2ba9d3SPiotr Jasiukajtis 	-2.85873121003886075697e-17,	/* BC807ABE1DB13CAC */
10425b2ba9d3SPiotr Jasiukajtis 	+7.70094837980298946162e-17,	/* 3C96324C054647AD */
10435b2ba9d3SPiotr Jasiukajtis 	-6.77051165879478628716e-17,	/* BC9383C17E40B497 */
10445b2ba9d3SPiotr Jasiukajtis 	-9.66729331345291345105e-17,	/* BC9BDD3413B26456 */
10455b2ba9d3SPiotr Jasiukajtis 	-3.02375813499398731940e-17,	/* BC816E4786887A99 */
10465b2ba9d3SPiotr Jasiukajtis 	-3.48399455689279579579e-17,	/* BC841577EE04992F */
10475b2ba9d3SPiotr Jasiukajtis 	-1.01645532775429503911e-16,	/* BC9D4C1DD41532D8 */
10485b2ba9d3SPiotr Jasiukajtis 	+7.94983480969762085616e-17,	/* 3C96E9F156864B27 */
10495b2ba9d3SPiotr Jasiukajtis 	-1.01369164712783039808e-17,	/* BC675FC781B57EBC */
10505b2ba9d3SPiotr Jasiukajtis 	+2.47071925697978878522e-17,	/* 3C7C7C46B071F2BE */
10515b2ba9d3SPiotr Jasiukajtis 	-1.01256799136747726038e-16,	/* BC9D2F6EDB8D41E1 */
10525b2ba9d3SPiotr Jasiukajtis 	+8.19901002058149652013e-17,	/* 3C97A1CD345DCC81 */
10535b2ba9d3SPiotr Jasiukajtis 	-1.85138041826311098821e-17,	/* BC75584F7E54AC3B */
10545b2ba9d3SPiotr Jasiukajtis 	+2.96014069544887330703e-17,	/* 3C811065895048DD */
10555b2ba9d3SPiotr Jasiukajtis 	+1.82274584279120867698e-17,	/* 3C7503CBD1E949DB */
10565b2ba9d3SPiotr Jasiukajtis 	+3.28310722424562658722e-17,	/* 3C82ED02D75B3706 */
10575b2ba9d3SPiotr Jasiukajtis 	-6.12276341300414256164e-17,	/* BC91A5CD4F184B5C */
10585b2ba9d3SPiotr Jasiukajtis 	-1.06199460561959626376e-16,	/* BC9E9C23179C2893 */
10595b2ba9d3SPiotr Jasiukajtis 	+8.96076779103666776760e-17,	/* 3C99D3E12DD8A18B */
10605b2ba9d3SPiotr Jasiukajtis };
10615b2ba9d3SPiotr Jasiukajtis 
10625b2ba9d3SPiotr Jasiukajtis /* Primary interval GTi() */
10635b2ba9d3SPiotr Jasiukajtis static const double cr[] = {
10645b2ba9d3SPiotr Jasiukajtis /* p1, q1 */
10655b2ba9d3SPiotr Jasiukajtis 	+0.70908683619977797008004927192814648151397705078125000,
10665b2ba9d3SPiotr Jasiukajtis 	+1.71987061393048558089579513384356441668351720061e-0001,
10675b2ba9d3SPiotr Jasiukajtis 	-3.19273345791990970293320316122813960527705450671e-0002,
10685b2ba9d3SPiotr Jasiukajtis 	+8.36172645419110036267169600390549973563534476989e-0003,
10695b2ba9d3SPiotr Jasiukajtis 	+1.13745336648572838333152213474277971244629758101e-0003,
10705b2ba9d3SPiotr Jasiukajtis 	+1.0,
10715b2ba9d3SPiotr Jasiukajtis 	+9.71980217826032937526460731778472389791321968082e-0001,
10725b2ba9d3SPiotr Jasiukajtis 	-7.43576743326756176594084137256042653497087666030e-0002,
10735b2ba9d3SPiotr Jasiukajtis 	-1.19345944932265559769719470515102012246995255372e-0001,
10745b2ba9d3SPiotr Jasiukajtis 	+1.59913445751425002620935120470781382215050284762e-0002,
10755b2ba9d3SPiotr Jasiukajtis 	+1.12601136853374984566572691306402321911547550783e-0003,
10765b2ba9d3SPiotr Jasiukajtis /* p2, q2 */
10775b2ba9d3SPiotr Jasiukajtis 	+0.42848681585558601181418225678498856723308563232421875,
10785b2ba9d3SPiotr Jasiukajtis 	+6.53596762668970816023718845105667418483122103629e-0002,
10795b2ba9d3SPiotr Jasiukajtis 	-6.97280829631212931321050770925128264272768936731e-0003,
10805b2ba9d3SPiotr Jasiukajtis 	+6.46342359021981718947208605674813260166116632899e-0003,
10815b2ba9d3SPiotr Jasiukajtis 	+1.0,
10825b2ba9d3SPiotr Jasiukajtis 	+4.57572620560506047062553957454062012327519313936e-0001,
10835b2ba9d3SPiotr Jasiukajtis 	-2.52182594886075452859655003407796103083422572036e-0001,
10845b2ba9d3SPiotr Jasiukajtis 	-1.82970945407778594681348166040103197178711552827e-0002,
10855b2ba9d3SPiotr Jasiukajtis 	+2.43574726993169566475227642128830141304953840502e-0002,
10865b2ba9d3SPiotr Jasiukajtis 	-5.20390406466942525358645957564897411258667085501e-0003,
10875b2ba9d3SPiotr Jasiukajtis 	+4.79520251383279837635552431988023256031951133885e-0004,
10885b2ba9d3SPiotr Jasiukajtis /* p3, q3 */
10895b2ba9d3SPiotr Jasiukajtis 	+0.382409479734567459008331979930517263710498809814453125,
10905b2ba9d3SPiotr Jasiukajtis 	+1.42876048697668161599069814043449301572928034140e-0001,
10915b2ba9d3SPiotr Jasiukajtis 	+3.42157571052250536817923866013561760785748899071e-0003,
10925b2ba9d3SPiotr Jasiukajtis 	-5.01542621710067521405087887856991700987709272937e-0004,
10935b2ba9d3SPiotr Jasiukajtis 	+8.89285814866740910123834688163838287618332122670e-0004,
10945b2ba9d3SPiotr Jasiukajtis 	+1.0,
10955b2ba9d3SPiotr Jasiukajtis 	+3.04253086629444201002215640948957897906299633168e-0001,
10965b2ba9d3SPiotr Jasiukajtis 	-2.23162407379999477282555672834881213873185520006e-0001,
10975b2ba9d3SPiotr Jasiukajtis 	-1.05060867741952065921809811933670131427552903636e-0002,
10985b2ba9d3SPiotr Jasiukajtis 	+1.70511763916186982473301861980856352005926669320e-0002,
10995b2ba9d3SPiotr Jasiukajtis 	-2.12950201683609187927899416700094630764182477464e-0003,
11005b2ba9d3SPiotr Jasiukajtis };
11015b2ba9d3SPiotr Jasiukajtis 
11025b2ba9d3SPiotr Jasiukajtis #define	P10   cr[0]
11035b2ba9d3SPiotr Jasiukajtis #define	P11   cr[1]
11045b2ba9d3SPiotr Jasiukajtis #define	P12   cr[2]
11055b2ba9d3SPiotr Jasiukajtis #define	P13   cr[3]
11065b2ba9d3SPiotr Jasiukajtis #define	P14   cr[4]
11075b2ba9d3SPiotr Jasiukajtis #define	Q10   cr[5]
11085b2ba9d3SPiotr Jasiukajtis #define	Q11   cr[6]
11095b2ba9d3SPiotr Jasiukajtis #define	Q12   cr[7]
11105b2ba9d3SPiotr Jasiukajtis #define	Q13   cr[8]
11115b2ba9d3SPiotr Jasiukajtis #define	Q14   cr[9]
11125b2ba9d3SPiotr Jasiukajtis #define	Q15   cr[10]
11135b2ba9d3SPiotr Jasiukajtis #define	P20   cr[11]
11145b2ba9d3SPiotr Jasiukajtis #define	P21   cr[12]
11155b2ba9d3SPiotr Jasiukajtis #define	P22   cr[13]
11165b2ba9d3SPiotr Jasiukajtis #define	P23   cr[14]
11175b2ba9d3SPiotr Jasiukajtis #define	Q20   cr[15]
11185b2ba9d3SPiotr Jasiukajtis #define	Q21   cr[16]
11195b2ba9d3SPiotr Jasiukajtis #define	Q22   cr[17]
11205b2ba9d3SPiotr Jasiukajtis #define	Q23   cr[18]
11215b2ba9d3SPiotr Jasiukajtis #define	Q24   cr[19]
11225b2ba9d3SPiotr Jasiukajtis #define	Q25   cr[20]
11235b2ba9d3SPiotr Jasiukajtis #define	Q26   cr[21]
11245b2ba9d3SPiotr Jasiukajtis #define	P30   cr[22]
11255b2ba9d3SPiotr Jasiukajtis #define	P31   cr[23]
11265b2ba9d3SPiotr Jasiukajtis #define	P32   cr[24]
11275b2ba9d3SPiotr Jasiukajtis #define	P33   cr[25]
11285b2ba9d3SPiotr Jasiukajtis #define	P34   cr[26]
11295b2ba9d3SPiotr Jasiukajtis #define	Q30   cr[27]
11305b2ba9d3SPiotr Jasiukajtis #define	Q31   cr[28]
11315b2ba9d3SPiotr Jasiukajtis #define	Q32   cr[29]
11325b2ba9d3SPiotr Jasiukajtis #define	Q33   cr[30]
11335b2ba9d3SPiotr Jasiukajtis #define	Q34   cr[31]
11345b2ba9d3SPiotr Jasiukajtis #define	Q35   cr[32]
11355b2ba9d3SPiotr Jasiukajtis 
11365b2ba9d3SPiotr Jasiukajtis static const double
11375b2ba9d3SPiotr Jasiukajtis 	GZ1_h = +0.938204627909682398190,
11385b2ba9d3SPiotr Jasiukajtis 	GZ1_l = +5.121952600248205157935e-17,
11395b2ba9d3SPiotr Jasiukajtis 	GZ2_h = +0.885603194410888749921,
11405b2ba9d3SPiotr Jasiukajtis 	GZ2_l = -4.964236872556339810692e-17,
11415b2ba9d3SPiotr Jasiukajtis 	GZ3_h = +0.936781411463652347038,
11425b2ba9d3SPiotr Jasiukajtis 	GZ3_l = -2.541923110834479415023e-17,
11435b2ba9d3SPiotr Jasiukajtis 	TZ1 = -0.3517214357852935791015625,
11445b2ba9d3SPiotr Jasiukajtis 	TZ3 = +0.280530631542205810546875;
11455b2ba9d3SPiotr Jasiukajtis /* INDENT ON */
11465b2ba9d3SPiotr Jasiukajtis 
11475b2ba9d3SPiotr Jasiukajtis /* compute gamma(y=yh+yl) for y in GT1 = [1.0000, 1.2845] */
11485b2ba9d3SPiotr Jasiukajtis /* assume yh got 20 significant bits */
11495b2ba9d3SPiotr Jasiukajtis static struct Double
GT1(double yh,double yl)11505b2ba9d3SPiotr Jasiukajtis GT1(double yh, double yl) {
11515b2ba9d3SPiotr Jasiukajtis 	double t3, t4, y, z;
11525b2ba9d3SPiotr Jasiukajtis 	struct Double r;
11535b2ba9d3SPiotr Jasiukajtis 
11545b2ba9d3SPiotr Jasiukajtis 	y = yh + yl;
11555b2ba9d3SPiotr Jasiukajtis 	z = y * y;
11565b2ba9d3SPiotr Jasiukajtis 	t3 = (z * (P10 + y * ((P11 + y * P12) + z * (P13 + y * P14)))) /
11575b2ba9d3SPiotr Jasiukajtis 		(Q10 + y * ((Q11 + y * Q12) + z * ((Q13 + Q14 * y) + z * Q15)));
11585b2ba9d3SPiotr Jasiukajtis 	t3 += (TZ1 * yl + GZ1_l);
11595b2ba9d3SPiotr Jasiukajtis 	t4 = TZ1 * yh;
11605b2ba9d3SPiotr Jasiukajtis 	r.h = (double) ((float) (t4 + GZ1_h + t3));
11615b2ba9d3SPiotr Jasiukajtis 	t3 += (t4 - (r.h - GZ1_h));
11625b2ba9d3SPiotr Jasiukajtis 	r.l = t3;
11635b2ba9d3SPiotr Jasiukajtis 	return (r);
11645b2ba9d3SPiotr Jasiukajtis }
11655b2ba9d3SPiotr Jasiukajtis 
11665b2ba9d3SPiotr Jasiukajtis /* compute gamma(y=yh+yl) for y in GT2 = [1.2844, 1.6374] */
11675b2ba9d3SPiotr Jasiukajtis /* assume yh got 20 significant bits */
11685b2ba9d3SPiotr Jasiukajtis static struct Double
GT2(double yh,double yl)11695b2ba9d3SPiotr Jasiukajtis GT2(double yh, double yl) {
11705b2ba9d3SPiotr Jasiukajtis 	double t3, y, z;
11715b2ba9d3SPiotr Jasiukajtis 	struct Double r;
11725b2ba9d3SPiotr Jasiukajtis 
11735b2ba9d3SPiotr Jasiukajtis 	y = yh + yl;
11745b2ba9d3SPiotr Jasiukajtis 	z = y * y;
11755b2ba9d3SPiotr Jasiukajtis 	t3 = (z * (P20 + y * P21 + z * (P22 + y * P23))) /
11765b2ba9d3SPiotr Jasiukajtis 		(Q20 + (y * ((Q21 + Q22 * y) + z * Q23) +
11775b2ba9d3SPiotr Jasiukajtis 		(z * z) * ((Q24 + Q25 * y) + z * Q26))) + GZ2_l;
11785b2ba9d3SPiotr Jasiukajtis 	r.h = (double) ((float) (GZ2_h + t3));
11795b2ba9d3SPiotr Jasiukajtis 	r.l = t3 - (r.h - GZ2_h);
11805b2ba9d3SPiotr Jasiukajtis 	return (r);
11815b2ba9d3SPiotr Jasiukajtis }
11825b2ba9d3SPiotr Jasiukajtis 
11835b2ba9d3SPiotr Jasiukajtis /* compute gamma(y=yh+yl) for y in GT3 = [1.6373, 2.0000] */
11845b2ba9d3SPiotr Jasiukajtis /* assume yh got 20 significant bits */
11855b2ba9d3SPiotr Jasiukajtis static struct Double
GT3(double yh,double yl)11865b2ba9d3SPiotr Jasiukajtis GT3(double yh, double yl) {
11875b2ba9d3SPiotr Jasiukajtis 	double t3, t4, y, z;
11885b2ba9d3SPiotr Jasiukajtis 	struct Double r;
11895b2ba9d3SPiotr Jasiukajtis 
11905b2ba9d3SPiotr Jasiukajtis 	y = yh + yl;
11915b2ba9d3SPiotr Jasiukajtis 	z = y * y;
11925b2ba9d3SPiotr Jasiukajtis 	t3 = (z * (P30 + y * ((P31 + y * P32) + z * (P33 + y * P34)))) /
11935b2ba9d3SPiotr Jasiukajtis 		(Q30 + y * ((Q31 + y * Q32) + z * ((Q33 + Q34 * y) + z * Q35)));
11945b2ba9d3SPiotr Jasiukajtis 	t3 += (TZ3 * yl + GZ3_l);
11955b2ba9d3SPiotr Jasiukajtis 	t4 = TZ3 * yh;
11965b2ba9d3SPiotr Jasiukajtis 	r.h = (double) ((float) (t4 + GZ3_h + t3));
11975b2ba9d3SPiotr Jasiukajtis 	t3 += (t4 - (r.h - GZ3_h));
11985b2ba9d3SPiotr Jasiukajtis 	r.l = t3;
11995b2ba9d3SPiotr Jasiukajtis 	return (r);
12005b2ba9d3SPiotr Jasiukajtis }
12015b2ba9d3SPiotr Jasiukajtis 
12025b2ba9d3SPiotr Jasiukajtis /* INDENT OFF */
12035b2ba9d3SPiotr Jasiukajtis /*
12045b2ba9d3SPiotr Jasiukajtis  * return tgamma(x) scaled by 2**-m for 8<x<=171.62... using Stirling's formula
12055b2ba9d3SPiotr Jasiukajtis  *     log(G(x)) ~= (x-.5)*(log(x)-1) + .5(log(2*pi)-1) + (1/x)*P(1/(x*x))
12065b2ba9d3SPiotr Jasiukajtis  *                = L1 + L2 + L3,
12075b2ba9d3SPiotr Jasiukajtis  */
12085b2ba9d3SPiotr Jasiukajtis /* INDENT ON */
12095b2ba9d3SPiotr Jasiukajtis static struct Double
large_gam(double x,int * m)12105b2ba9d3SPiotr Jasiukajtis large_gam(double x, int *m) {
12115b2ba9d3SPiotr Jasiukajtis 	double z, t1, t2, t3, z2, t5, w, y, u, r, z4, v, t24 = 16777216.0,
12125b2ba9d3SPiotr Jasiukajtis 		p24 = 1.0 / 16777216.0;
12135b2ba9d3SPiotr Jasiukajtis 	int n2, j2, k, ix, j;
12145b2ba9d3SPiotr Jasiukajtis 	unsigned lx;
12155b2ba9d3SPiotr Jasiukajtis 	struct Double zz;
12165b2ba9d3SPiotr Jasiukajtis 	double u2, ss_h, ss_l, r_h, w_h, w_l, t4;
12175b2ba9d3SPiotr Jasiukajtis 
12185b2ba9d3SPiotr Jasiukajtis /* INDENT OFF */
12195b2ba9d3SPiotr Jasiukajtis /*
12205b2ba9d3SPiotr Jasiukajtis  * compute ss = ss.h+ss.l = log(x)-1 (see tgamma_log.h for details)
12215b2ba9d3SPiotr Jasiukajtis  *
12225b2ba9d3SPiotr Jasiukajtis  *  log(x) - 1 = T1(n) + T2(j) + T3(s), where x = 2**n * y,  1<=y<2,
12235b2ba9d3SPiotr Jasiukajtis  *  j=[64*y], z[j]=1+j/64+1/128, s = (y-z[j])/(y+z[j]), and
12245b2ba9d3SPiotr Jasiukajtis  *       T1(n) = T1[2n,2n+1] = n*log(2)-1,
12255b2ba9d3SPiotr Jasiukajtis  *       T2(j) = T2[2j,2j+1] = log(z[j]),
12265b2ba9d3SPiotr Jasiukajtis  *       T3(s) = 2s + A1[0]s^3 + A2[1]s^5 + A3[2]s^7
12275b2ba9d3SPiotr Jasiukajtis  *  Note
12285b2ba9d3SPiotr Jasiukajtis  *  (1) the leading entries are truncated to 24 binary point.
12295b2ba9d3SPiotr Jasiukajtis  *  (2) Remez error for T3(s) is bounded by 2**(-72.4)
12305b2ba9d3SPiotr Jasiukajtis  *                                   2**(-24)
12315b2ba9d3SPiotr Jasiukajtis  *                           _________V___________________
12325b2ba9d3SPiotr Jasiukajtis  *               T1(n):     |_________|___________________|
12335b2ba9d3SPiotr Jasiukajtis  *                             _______ ______________________
12345b2ba9d3SPiotr Jasiukajtis  *               T2(j):       |_______|______________________|
12355b2ba9d3SPiotr Jasiukajtis  *                                ____ _______________________
12365b2ba9d3SPiotr Jasiukajtis  *               2s:             |____|_______________________|
12375b2ba9d3SPiotr Jasiukajtis  *                                    __________________________
12385b2ba9d3SPiotr Jasiukajtis  *          +    T3(s)-2s:           |__________________________|
12395b2ba9d3SPiotr Jasiukajtis  *                       -------------------------------------------
12405b2ba9d3SPiotr Jasiukajtis  *                          [leading] + [Trailing]
12415b2ba9d3SPiotr Jasiukajtis  */
12425b2ba9d3SPiotr Jasiukajtis /* INDENT ON */
12435b2ba9d3SPiotr Jasiukajtis 	ix = __HI(x);
12445b2ba9d3SPiotr Jasiukajtis 	lx = __LO(x);
12455b2ba9d3SPiotr Jasiukajtis 	n2 = (ix >> 20) - 0x3ff;	/* exponent of x, range:3-7 */
12465b2ba9d3SPiotr Jasiukajtis 	n2 += n2;			/* 2n */
12475b2ba9d3SPiotr Jasiukajtis 	ix = (ix & 0x000fffff) | 0x3ff00000;	/* y = scale x to [1,2] */
12485b2ba9d3SPiotr Jasiukajtis 	__HI(y) = ix;
12495b2ba9d3SPiotr Jasiukajtis 	__LO(y) = lx;
12505b2ba9d3SPiotr Jasiukajtis 	__HI(z) = (ix & 0xffffc000) | 0x2000;	/* z[j]=1+j/64+1/128 */
12515b2ba9d3SPiotr Jasiukajtis 	__LO(z) = 0;
12525b2ba9d3SPiotr Jasiukajtis 	j2 = (ix >> 13) & 0x7e;	/* 2j */
12535b2ba9d3SPiotr Jasiukajtis 	t1 = y + z;
12545b2ba9d3SPiotr Jasiukajtis 	t2 = y - z;
12555b2ba9d3SPiotr Jasiukajtis 	r = one / t1;
12565b2ba9d3SPiotr Jasiukajtis 	t1 = (double) ((float) t1);
12575b2ba9d3SPiotr Jasiukajtis 	u = r * t2;		/* u = (y-z)/(y+z) */
12585b2ba9d3SPiotr Jasiukajtis 	t4 = T2[j2 + 1] + T1[n2 + 1];
12595b2ba9d3SPiotr Jasiukajtis 	z2 = u * u;
12605b2ba9d3SPiotr Jasiukajtis 	k = __HI(u) & 0x7fffffff;
12615b2ba9d3SPiotr Jasiukajtis 	t3 = T2[j2] + T1[n2];
12625b2ba9d3SPiotr Jasiukajtis 	if ((k >> 20) < 0x3ec) {	/* |u|<2**-19 */
12635b2ba9d3SPiotr Jasiukajtis 		t2 = t4 + u * ((two + z2 * A1) + (z2 * z2) * (A2 + z2 * A3));
12645b2ba9d3SPiotr Jasiukajtis 	} else {
12655b2ba9d3SPiotr Jasiukajtis 		t5 = t4 + u * (z2 * A1 + (z2 * z2) * (A2 + z2 * A3));
12665b2ba9d3SPiotr Jasiukajtis 		u2 = u + u;
12675b2ba9d3SPiotr Jasiukajtis 		v = (double) ((int) (u2 * t24)) * p24;
12685b2ba9d3SPiotr Jasiukajtis 		t2 = t5 + r * ((two * t2 - v * t1) - v * (y - (t1 - z)));
12695b2ba9d3SPiotr Jasiukajtis 		t3 += v;
12705b2ba9d3SPiotr Jasiukajtis 	}
12715b2ba9d3SPiotr Jasiukajtis 	ss_h = (double) ((float) (t2 + t3));
12725b2ba9d3SPiotr Jasiukajtis 	ss_l = t2 - (ss_h - t3);
12735b2ba9d3SPiotr Jasiukajtis 
12745b2ba9d3SPiotr Jasiukajtis 	/*
12755b2ba9d3SPiotr Jasiukajtis 	 * compute ww = (x-.5)*(log(x)-1) + .5*(log(2pi)-1) + 1/x*(P(1/x^2)))
12765b2ba9d3SPiotr Jasiukajtis 	 * where ss = log(x) - 1 in already in extra precision
12775b2ba9d3SPiotr Jasiukajtis 	 */
12785b2ba9d3SPiotr Jasiukajtis 	z = one / x;
12795b2ba9d3SPiotr Jasiukajtis 	r = x - half;
12805b2ba9d3SPiotr Jasiukajtis 	r_h = (double) ((float) r);
12815b2ba9d3SPiotr Jasiukajtis 	w_h = r_h * ss_h + hln2pi_h;
12825b2ba9d3SPiotr Jasiukajtis 	z2 = z * z;
12835b2ba9d3SPiotr Jasiukajtis 	w = (r - r_h) * ss_h + r * ss_l;
12845b2ba9d3SPiotr Jasiukajtis 	z4 = z2 * z2;
12855b2ba9d3SPiotr Jasiukajtis 	t1 = z2 * (GP1 + z4 * (GP3 + z4 * (GP5 + z4 * GP7)));
12865b2ba9d3SPiotr Jasiukajtis 	t2 = z4 * (GP2 + z4 * (GP4 + z4 * GP6));
12875b2ba9d3SPiotr Jasiukajtis 	t1 += t2;
12885b2ba9d3SPiotr Jasiukajtis 	w += hln2pi_l;
12895b2ba9d3SPiotr Jasiukajtis 	w_l = z * (GP0 + t1) + w;
12905b2ba9d3SPiotr Jasiukajtis 	k = (int) ((w_h + w_l) * invln2_32 + half);
12915b2ba9d3SPiotr Jasiukajtis 
12925b2ba9d3SPiotr Jasiukajtis 	/* compute the exponential of w_h+w_l */
12935b2ba9d3SPiotr Jasiukajtis 	j = k & 0x1f;
12945b2ba9d3SPiotr Jasiukajtis 	*m = (k >> 5);
12955b2ba9d3SPiotr Jasiukajtis 	t3 = (double) k;
12965b2ba9d3SPiotr Jasiukajtis 
12975b2ba9d3SPiotr Jasiukajtis 	/* perform w - k*ln2_32 (represent as w_h - w_l) */
12985b2ba9d3SPiotr Jasiukajtis 	t1 = w_h - t3 * ln2_32hi;
12995b2ba9d3SPiotr Jasiukajtis 	t2 = t3 * ln2_32lo;
13005b2ba9d3SPiotr Jasiukajtis 	w = w_l - t2;
13015b2ba9d3SPiotr Jasiukajtis 	w_h = t1 + w_l;
13025b2ba9d3SPiotr Jasiukajtis 	w_l = t2 - (w_l - (w_h - t1));
13035b2ba9d3SPiotr Jasiukajtis 
13045b2ba9d3SPiotr Jasiukajtis 	/* compute exp(w_h+w_l) */
13055b2ba9d3SPiotr Jasiukajtis 	z = w_h - w_l;
13065b2ba9d3SPiotr Jasiukajtis 	z2 = z * z;
13075b2ba9d3SPiotr Jasiukajtis 	t1 = z2 * (Et1 + z2 * (Et3 + z2 * Et5));
13085b2ba9d3SPiotr Jasiukajtis 	t2 = z2 * (Et2 + z2 * Et4);
13095b2ba9d3SPiotr Jasiukajtis 	t3 = w_h - (w_l - (t1 + z * t2));
13105b2ba9d3SPiotr Jasiukajtis 	zz.l = S_trail[j] * (one + t3) + S[j] * t3;
13115b2ba9d3SPiotr Jasiukajtis 	zz.h = S[j];
13125b2ba9d3SPiotr Jasiukajtis 	return (zz);
13135b2ba9d3SPiotr Jasiukajtis }
13145b2ba9d3SPiotr Jasiukajtis 
13155b2ba9d3SPiotr Jasiukajtis /* INDENT OFF */
13165b2ba9d3SPiotr Jasiukajtis /*
13175b2ba9d3SPiotr Jasiukajtis  * kpsin(x)= sin(pi*x)/pi
13185b2ba9d3SPiotr Jasiukajtis  *                 3        5        7        9        11        13        15
13195b2ba9d3SPiotr Jasiukajtis  *	= x+ks[0]*x +ks[1]*x +ks[2]*x +ks[3]*x +ks[4]*x  +ks[5]*x  +ks[6]*x
13205b2ba9d3SPiotr Jasiukajtis  */
13215b2ba9d3SPiotr Jasiukajtis static const double ks[] = {
13225b2ba9d3SPiotr Jasiukajtis 	-1.64493406684822640606569,
13235b2ba9d3SPiotr Jasiukajtis 	+8.11742425283341655883668741874008920850698590621e-0001,
13245b2ba9d3SPiotr Jasiukajtis 	-1.90751824120862873825597279118304943994042258291e-0001,
13255b2ba9d3SPiotr Jasiukajtis 	+2.61478477632554278317289628332654539353521911570e-0002,
13265b2ba9d3SPiotr Jasiukajtis 	-2.34607978510202710377617190278735525354347705866e-0003,
13275b2ba9d3SPiotr Jasiukajtis 	+1.48413292290051695897242899977121846763824221705e-0004,
13285b2ba9d3SPiotr Jasiukajtis 	-6.87730769637543488108688726777687262485357072242e-0006,
13295b2ba9d3SPiotr Jasiukajtis };
13305b2ba9d3SPiotr Jasiukajtis /* INDENT ON */
13315b2ba9d3SPiotr Jasiukajtis 
13325b2ba9d3SPiotr Jasiukajtis /* assume x is not tiny and positive */
13335b2ba9d3SPiotr Jasiukajtis static struct Double
kpsin(double x)13345b2ba9d3SPiotr Jasiukajtis kpsin(double x) {
13355b2ba9d3SPiotr Jasiukajtis 	double z, t1, t2, t3, t4;
13365b2ba9d3SPiotr Jasiukajtis 	struct Double xx;
13375b2ba9d3SPiotr Jasiukajtis 
13385b2ba9d3SPiotr Jasiukajtis 	z = x * x;
13395b2ba9d3SPiotr Jasiukajtis 	xx.h = x;
13405b2ba9d3SPiotr Jasiukajtis 	t1 = z * x;
13415b2ba9d3SPiotr Jasiukajtis 	t2 = z * z;
13425b2ba9d3SPiotr Jasiukajtis 	t4 = t1 * ks[0];
13435b2ba9d3SPiotr Jasiukajtis 	t3 = (t1 * z) * ((ks[1] + z * ks[2] + t2 * ks[3]) + (z * t2) *
13445b2ba9d3SPiotr Jasiukajtis 		(ks[4] + z * ks[5] + t2 * ks[6]));
13455b2ba9d3SPiotr Jasiukajtis 	xx.l = t4 + t3;
13465b2ba9d3SPiotr Jasiukajtis 	return (xx);
13475b2ba9d3SPiotr Jasiukajtis }
13485b2ba9d3SPiotr Jasiukajtis 
13495b2ba9d3SPiotr Jasiukajtis /* INDENT OFF */
13505b2ba9d3SPiotr Jasiukajtis /*
13515b2ba9d3SPiotr Jasiukajtis  * kpcos(x)= cos(pi*x)/pi
13525b2ba9d3SPiotr Jasiukajtis  *                     2        4        6        8        10        12
13535b2ba9d3SPiotr Jasiukajtis  *	= 1/pi +kc[0]*x +kc[1]*x +kc[2]*x +kc[3]*x +kc[4]*x  +kc[5]*x
13545b2ba9d3SPiotr Jasiukajtis  */
13555b2ba9d3SPiotr Jasiukajtis 
13565b2ba9d3SPiotr Jasiukajtis static const double one_pi_h = 0.318309886183790635705292970,
13575b2ba9d3SPiotr Jasiukajtis 		one_pi_l = 3.583247455607534006714276420e-17;
13585b2ba9d3SPiotr Jasiukajtis static const double npi_2_h = -1.5625,
13595b2ba9d3SPiotr Jasiukajtis 		npi_2_l = -0.00829632679489661923132169163975055099555883223;
13605b2ba9d3SPiotr Jasiukajtis static const double kc[] = {
13615b2ba9d3SPiotr Jasiukajtis 	-1.57079632679489661923132169163975055099555883223e+0000,
13625b2ba9d3SPiotr Jasiukajtis 	+1.29192819501230224953283586722575766189551966008e+0000,
13635b2ba9d3SPiotr Jasiukajtis 	-4.25027339940149518500158850753393173519732149213e-0001,
13645b2ba9d3SPiotr Jasiukajtis 	+7.49080625187015312373925142219429422375556727752e-0002,
13655b2ba9d3SPiotr Jasiukajtis 	-8.21442040906099210866977352284054849051348692715e-0003,
13665b2ba9d3SPiotr Jasiukajtis 	+6.10411356829515414575566564733632532333904115968e-0004,
13675b2ba9d3SPiotr Jasiukajtis };
13685b2ba9d3SPiotr Jasiukajtis /* INDENT ON */
13695b2ba9d3SPiotr Jasiukajtis 
13705b2ba9d3SPiotr Jasiukajtis /* assume x is not tiny and positive */
13715b2ba9d3SPiotr Jasiukajtis static struct Double
kpcos(double x)13725b2ba9d3SPiotr Jasiukajtis kpcos(double x) {
13735b2ba9d3SPiotr Jasiukajtis 	double z, t1, t2, t3, t4, x4, x8;
13745b2ba9d3SPiotr Jasiukajtis 	struct Double xx;
13755b2ba9d3SPiotr Jasiukajtis 
13765b2ba9d3SPiotr Jasiukajtis 	z = x * x;
13775b2ba9d3SPiotr Jasiukajtis 	xx.h = one_pi_h;
13785b2ba9d3SPiotr Jasiukajtis 	t1 = (double) ((float) x);
13795b2ba9d3SPiotr Jasiukajtis 	x4 = z * z;
13805b2ba9d3SPiotr Jasiukajtis 	t2 = npi_2_l * z + npi_2_h * (x + t1) * (x - t1);
13815b2ba9d3SPiotr Jasiukajtis 	t3 = one_pi_l + x4 * ((kc[1] + z * kc[2]) + x4 * (kc[3] + z *
13825b2ba9d3SPiotr Jasiukajtis 		kc[4] + x4 * kc[5]));
13835b2ba9d3SPiotr Jasiukajtis 	t4 = t1 * t1;	/* 48 bits mantissa */
13845b2ba9d3SPiotr Jasiukajtis 	x8 = t2 + t3;
13855b2ba9d3SPiotr Jasiukajtis 	t4 *= npi_2_h;	/* npi_2_h is 5 bits const. The product is exact */
13865b2ba9d3SPiotr Jasiukajtis 	xx.l = x8 + t4;	/* that will minimized the rounding error in xx.l */
13875b2ba9d3SPiotr Jasiukajtis 	return (xx);
13885b2ba9d3SPiotr Jasiukajtis }
13895b2ba9d3SPiotr Jasiukajtis 
13905b2ba9d3SPiotr Jasiukajtis /* INDENT OFF */
13915b2ba9d3SPiotr Jasiukajtis static const double
13925b2ba9d3SPiotr Jasiukajtis 	/* 0.134861805732790769689793935774652917006 */
13935b2ba9d3SPiotr Jasiukajtis 	t0z1   =  0.1348618057327907737708,
13945b2ba9d3SPiotr Jasiukajtis 	t0z1_l = -4.0810077708578299022531e-18,
13955b2ba9d3SPiotr Jasiukajtis 	/* 0.461632144968362341262659542325721328468 */
13965b2ba9d3SPiotr Jasiukajtis 	t0z2   =  0.4616321449683623567850,
13975b2ba9d3SPiotr Jasiukajtis 	t0z2_l = -1.5522348162858676890521e-17,
13985b2ba9d3SPiotr Jasiukajtis 	/* 0.819773101100500601787868704921606996312 */
13995b2ba9d3SPiotr Jasiukajtis 	t0z3   =  0.8197731011005006118708,
14005b2ba9d3SPiotr Jasiukajtis 	t0z3_l = -1.0082945122487103498325e-17;
14015b2ba9d3SPiotr Jasiukajtis 	/* 1.134861805732790769689793935774652917006 */
14025b2ba9d3SPiotr Jasiukajtis /* INDENT ON */
14035b2ba9d3SPiotr Jasiukajtis 
14045b2ba9d3SPiotr Jasiukajtis /* gamma(x+i) for 0 <= x < 1  */
14055b2ba9d3SPiotr Jasiukajtis static struct Double
gam_n(int i,double x)14065b2ba9d3SPiotr Jasiukajtis gam_n(int i, double x) {
14075b2ba9d3SPiotr Jasiukajtis 	struct Double rr = {0.0L, 0.0L}, yy;
14085b2ba9d3SPiotr Jasiukajtis 	double r1, r2, t2, z, xh, xl, yh, yl, zh, z1, z2, zl, x5, wh, wl;
14095b2ba9d3SPiotr Jasiukajtis 
14105b2ba9d3SPiotr Jasiukajtis 	/* compute yy = gamma(x+1) */
14115b2ba9d3SPiotr Jasiukajtis 	if (x > 0.2845) {
14125b2ba9d3SPiotr Jasiukajtis 		if (x > 0.6374) {
14135b2ba9d3SPiotr Jasiukajtis 			r1 = x - t0z3;
14145b2ba9d3SPiotr Jasiukajtis 			r2 = (double) ((float) (r1 - t0z3_l));
14155b2ba9d3SPiotr Jasiukajtis 			t2 = r1 - r2;
14165b2ba9d3SPiotr Jasiukajtis 			yy = GT3(r2, t2 - t0z3_l);
14175b2ba9d3SPiotr Jasiukajtis 		} else {
14185b2ba9d3SPiotr Jasiukajtis 			r1 = x - t0z2;
14195b2ba9d3SPiotr Jasiukajtis 			r2 = (double) ((float) (r1 - t0z2_l));
14205b2ba9d3SPiotr Jasiukajtis 			t2 = r1 - r2;
14215b2ba9d3SPiotr Jasiukajtis 			yy = GT2(r2, t2 - t0z2_l);
14225b2ba9d3SPiotr Jasiukajtis 		}
14235b2ba9d3SPiotr Jasiukajtis 	} else {
14245b2ba9d3SPiotr Jasiukajtis 		r1 = x - t0z1;
14255b2ba9d3SPiotr Jasiukajtis 		r2 = (double) ((float) (r1 - t0z1_l));
14265b2ba9d3SPiotr Jasiukajtis 		t2 = r1 - r2;
14275b2ba9d3SPiotr Jasiukajtis 		yy = GT1(r2, t2 - t0z1_l);
14285b2ba9d3SPiotr Jasiukajtis 	}
14295b2ba9d3SPiotr Jasiukajtis 
14305b2ba9d3SPiotr Jasiukajtis 	/* compute gamma(x+i) = (x+i-1)*...*(x+1)*yy, 0<i<8 */
14315b2ba9d3SPiotr Jasiukajtis 	switch (i) {
14325b2ba9d3SPiotr Jasiukajtis 	case 0:		/* yy/x */
14335b2ba9d3SPiotr Jasiukajtis 		r1 = one / x;
14345b2ba9d3SPiotr Jasiukajtis 		xh = (double) ((float) x);	/* x is not tiny */
14355b2ba9d3SPiotr Jasiukajtis 		rr.h = (double) ((float) ((yy.h + yy.l) * r1));
14365b2ba9d3SPiotr Jasiukajtis 		rr.l = r1 * (yy.h - rr.h * xh) -
14375b2ba9d3SPiotr Jasiukajtis 			((r1 * rr.h) * (x - xh) - r1 * yy.l);
14385b2ba9d3SPiotr Jasiukajtis 		break;
14395b2ba9d3SPiotr Jasiukajtis 	case 1:		/* yy */
14405b2ba9d3SPiotr Jasiukajtis 		rr.h = yy.h;
14415b2ba9d3SPiotr Jasiukajtis 		rr.l = yy.l;
14425b2ba9d3SPiotr Jasiukajtis 		break;
14435b2ba9d3SPiotr Jasiukajtis 	case 2:		/* (x+1)*yy */
14445b2ba9d3SPiotr Jasiukajtis 		z = x + one;	/* may not be exact */
14455b2ba9d3SPiotr Jasiukajtis 		zh = (double) ((float) z);
14465b2ba9d3SPiotr Jasiukajtis 		rr.h = zh * yy.h;
14475b2ba9d3SPiotr Jasiukajtis 		rr.l = z * yy.l + (x - (zh - one)) * yy.h;
14485b2ba9d3SPiotr Jasiukajtis 		break;
14495b2ba9d3SPiotr Jasiukajtis 	case 3:		/* (x+2)*(x+1)*yy */
14505b2ba9d3SPiotr Jasiukajtis 		z1 = x + one;
14515b2ba9d3SPiotr Jasiukajtis 		z2 = x + 2.0;
14525b2ba9d3SPiotr Jasiukajtis 		z = z1 * z2;
14535b2ba9d3SPiotr Jasiukajtis 		xh = (double) ((float) z);
14545b2ba9d3SPiotr Jasiukajtis 		zh = (double) ((float) z1);
14555b2ba9d3SPiotr Jasiukajtis 		xl = (x - (zh - one)) * (z2 + zh) - (xh - zh * (zh + one));
14565b2ba9d3SPiotr Jasiukajtis 		rr.h = xh * yy.h;
14575b2ba9d3SPiotr Jasiukajtis 		rr.l = z * yy.l + xl * yy.h;
14585b2ba9d3SPiotr Jasiukajtis 		break;
14595b2ba9d3SPiotr Jasiukajtis 
14605b2ba9d3SPiotr Jasiukajtis 	case 4:		/* (x+1)*(x+3)*(x+2)*yy */
14615b2ba9d3SPiotr Jasiukajtis 		z1 = x + 2.0;
14625b2ba9d3SPiotr Jasiukajtis 		z2 = (x + one) * (x + 3.0);
14635b2ba9d3SPiotr Jasiukajtis 		zh = z1;
14645b2ba9d3SPiotr Jasiukajtis 		__LO(zh) = 0;
14655b2ba9d3SPiotr Jasiukajtis 		__HI(zh) &= 0xfffffff8;	/* zh 18 bits mantissa */
14665b2ba9d3SPiotr Jasiukajtis 		zl = x - (zh - 2.0);
14675b2ba9d3SPiotr Jasiukajtis 		z = z1 * z2;
14685b2ba9d3SPiotr Jasiukajtis 		xh = (double) ((float) z);
14695b2ba9d3SPiotr Jasiukajtis 		xl = zl * (z2 + zh * (z1 + zh)) - (xh - zh * (zh * zh - one));
14705b2ba9d3SPiotr Jasiukajtis 		rr.h = xh * yy.h;
14715b2ba9d3SPiotr Jasiukajtis 		rr.l = z * yy.l + xl * yy.h;
14725b2ba9d3SPiotr Jasiukajtis 		break;
14735b2ba9d3SPiotr Jasiukajtis 	case 5:		/* ((x+1)*(x+4)*(x+2)*(x+3))*yy */
14745b2ba9d3SPiotr Jasiukajtis 		z1 = x + 2.0;
14755b2ba9d3SPiotr Jasiukajtis 		z2 = x + 3.0;
14765b2ba9d3SPiotr Jasiukajtis 		z = z1 * z2;
14775b2ba9d3SPiotr Jasiukajtis 		zh = (double) ((float) z1);
14785b2ba9d3SPiotr Jasiukajtis 		yh = (double) ((float) z);
14795b2ba9d3SPiotr Jasiukajtis 		yl = (x - (zh - 2.0)) * (z2 + zh) - (yh - zh * (zh + one));
14805b2ba9d3SPiotr Jasiukajtis 		z2 = z - 2.0;
14815b2ba9d3SPiotr Jasiukajtis 		z *= z2;
14825b2ba9d3SPiotr Jasiukajtis 		xh = (double) ((float) z);
14835b2ba9d3SPiotr Jasiukajtis 		xl = yl * (z2 + yh) - (xh - yh * (yh - 2.0));
14845b2ba9d3SPiotr Jasiukajtis 		rr.h = xh * yy.h;
14855b2ba9d3SPiotr Jasiukajtis 		rr.l = z * yy.l + xl * yy.h;
14865b2ba9d3SPiotr Jasiukajtis 		break;
14875b2ba9d3SPiotr Jasiukajtis 	case 6:		/* ((x+1)*(x+2)*(x+3)*(x+4)*(x+5))*yy */
14885b2ba9d3SPiotr Jasiukajtis 		z1 = x + 2.0;
14895b2ba9d3SPiotr Jasiukajtis 		z2 = x + 3.0;
14905b2ba9d3SPiotr Jasiukajtis 		z = z1 * z2;
14915b2ba9d3SPiotr Jasiukajtis 		zh = (double) ((float) z1);
14925b2ba9d3SPiotr Jasiukajtis 		yh = (double) ((float) z);
14935b2ba9d3SPiotr Jasiukajtis 		z1 = x - (zh - 2.0);
14945b2ba9d3SPiotr Jasiukajtis 		yl = z1 * (z2 + zh) - (yh - zh * (zh + one));
14955b2ba9d3SPiotr Jasiukajtis 		z2 = z - 2.0;
14965b2ba9d3SPiotr Jasiukajtis 		x5 = x + 5.0;
14975b2ba9d3SPiotr Jasiukajtis 		z *= z2;
14985b2ba9d3SPiotr Jasiukajtis 		xh = (double) ((float) z);
14995b2ba9d3SPiotr Jasiukajtis 		zh += 3.0;
15005b2ba9d3SPiotr Jasiukajtis 		xl = yl * (z2 + yh) - (xh - yh * (yh - 2.0));
15015b2ba9d3SPiotr Jasiukajtis 						/* xh+xl=(x+1)*...*(x+4) */
15025b2ba9d3SPiotr Jasiukajtis 		/* wh+wl=(x+5)*yy */
15035b2ba9d3SPiotr Jasiukajtis 		wh = (double) ((float) (x5 * (yy.h + yy.l)));
15045b2ba9d3SPiotr Jasiukajtis 		wl = (z1 * yy.h + x5 * yy.l) - (wh - zh * yy.h);
15055b2ba9d3SPiotr Jasiukajtis 		rr.h = wh * xh;
15065b2ba9d3SPiotr Jasiukajtis 		rr.l = z * wl + xl * wh;
15075b2ba9d3SPiotr Jasiukajtis 		break;
15085b2ba9d3SPiotr Jasiukajtis 	case 7:		/* ((x+1)*(x+2)*(x+3)*(x+4)*(x+5)*(x+6))*yy */
15095b2ba9d3SPiotr Jasiukajtis 		z1 = x + 3.0;
15105b2ba9d3SPiotr Jasiukajtis 		z2 = x + 4.0;
15115b2ba9d3SPiotr Jasiukajtis 		z = z2 * z1;
15125b2ba9d3SPiotr Jasiukajtis 		zh = (double) ((float) z1);
15135b2ba9d3SPiotr Jasiukajtis 		yh = (double) ((float) z);	/* yh+yl = (x+3)(x+4) */
15145b2ba9d3SPiotr Jasiukajtis 		yl = (x - (zh - 3.0)) * (z2 + zh) - (yh - (zh * (zh + one)));
15155b2ba9d3SPiotr Jasiukajtis 		z1 = x + 6.0;
15165b2ba9d3SPiotr Jasiukajtis 		z2 = z - 2.0;	/* z2 = (x+2)*(x+5) */
15175b2ba9d3SPiotr Jasiukajtis 		z *= z2;
15185b2ba9d3SPiotr Jasiukajtis 		xh = (double) ((float) z);
15195b2ba9d3SPiotr Jasiukajtis 		xl = yl * (z2 + yh) - (xh - yh * (yh - 2.0));
15205b2ba9d3SPiotr Jasiukajtis 						/* xh+xl=(x+2)*...*(x+5) */
15215b2ba9d3SPiotr Jasiukajtis 		/* wh+wl=(x+1)(x+6)*yy */
15225b2ba9d3SPiotr Jasiukajtis 		z2 -= 4.0;	/* z2 = (x+1)(x+6) */
15235b2ba9d3SPiotr Jasiukajtis 		wh = (double) ((float) (z2 * (yy.h + yy.l)));
15245b2ba9d3SPiotr Jasiukajtis 		wl = (z2 * yy.l + yl * yy.h) - (wh - (yh - 6.0) * yy.h);
15255b2ba9d3SPiotr Jasiukajtis 		rr.h = wh * xh;
15265b2ba9d3SPiotr Jasiukajtis 		rr.l = z * wl + xl * wh;
15275b2ba9d3SPiotr Jasiukajtis 	}
15285b2ba9d3SPiotr Jasiukajtis 	return (rr);
15295b2ba9d3SPiotr Jasiukajtis }
15305b2ba9d3SPiotr Jasiukajtis 
15315b2ba9d3SPiotr Jasiukajtis double
tgamma(double x)15325b2ba9d3SPiotr Jasiukajtis tgamma(double x) {
15335b2ba9d3SPiotr Jasiukajtis 	struct Double ss, ww;
15345b2ba9d3SPiotr Jasiukajtis 	double t, t1, t2, t3, t4, t5, w, y, z, z1, z2, z3, z5;
15355b2ba9d3SPiotr Jasiukajtis 	int i, j, k, m, ix, hx, xk;
15365b2ba9d3SPiotr Jasiukajtis 	unsigned lx;
15375b2ba9d3SPiotr Jasiukajtis 
15385b2ba9d3SPiotr Jasiukajtis 	hx = __HI(x);
15395b2ba9d3SPiotr Jasiukajtis 	lx = __LO(x);
15405b2ba9d3SPiotr Jasiukajtis 	ix = hx & 0x7fffffff;
15415b2ba9d3SPiotr Jasiukajtis 	y = x;
15425b2ba9d3SPiotr Jasiukajtis 
15435b2ba9d3SPiotr Jasiukajtis 	if (ix < 0x3ca00000)
15445b2ba9d3SPiotr Jasiukajtis 		return (one / x);	/* |x| < 2**-53 */
15455b2ba9d3SPiotr Jasiukajtis 	if (ix >= 0x7ff00000)
15465b2ba9d3SPiotr Jasiukajtis 			/* +Inf -> +Inf, -Inf or NaN -> NaN */
15475b2ba9d3SPiotr Jasiukajtis 		return (x * ((hx < 0)? 0.0 : x));
15485b2ba9d3SPiotr Jasiukajtis 	if (hx > 0x406573fa ||	/* x > 171.62... overflow to +inf */
15495b2ba9d3SPiotr Jasiukajtis 	    (hx == 0x406573fa && lx > 0xE561F647)) {
15505b2ba9d3SPiotr Jasiukajtis 		z = x / tiny;
15515b2ba9d3SPiotr Jasiukajtis 		return (z * z);
15525b2ba9d3SPiotr Jasiukajtis 	}
15535b2ba9d3SPiotr Jasiukajtis 	if (hx >= 0x40200000) {	/* x >= 8 */
15545b2ba9d3SPiotr Jasiukajtis 		ww = large_gam(x, &m);
15555b2ba9d3SPiotr Jasiukajtis 		w = ww.h + ww.l;
15565b2ba9d3SPiotr Jasiukajtis 		__HI(w) += m << 20;
15575b2ba9d3SPiotr Jasiukajtis 		return (w);
15585b2ba9d3SPiotr Jasiukajtis 	}
15595b2ba9d3SPiotr Jasiukajtis 	if (hx > 0) {		/* 0 < x < 8 */
15605b2ba9d3SPiotr Jasiukajtis 		i = (int) x;
15615b2ba9d3SPiotr Jasiukajtis 		ww = gam_n(i, x - (double) i);
15625b2ba9d3SPiotr Jasiukajtis 		return (ww.h + ww.l);
15635b2ba9d3SPiotr Jasiukajtis 	}
15645b2ba9d3SPiotr Jasiukajtis 
15655b2ba9d3SPiotr Jasiukajtis 	/* negative x */
15665b2ba9d3SPiotr Jasiukajtis 	/* INDENT OFF */
15675b2ba9d3SPiotr Jasiukajtis 	/*
15685b2ba9d3SPiotr Jasiukajtis 	 * compute: xk =
15695b2ba9d3SPiotr Jasiukajtis 	 *	-2 ... x is an even int (-inf is even)
15705b2ba9d3SPiotr Jasiukajtis 	 *	-1 ... x is an odd int
15715b2ba9d3SPiotr Jasiukajtis 	 *	+0 ... x is not an int but chopped to an even int
15725b2ba9d3SPiotr Jasiukajtis 	 *	+1 ... x is not an int but chopped to an odd int
15735b2ba9d3SPiotr Jasiukajtis 	 */
15745b2ba9d3SPiotr Jasiukajtis 	/* INDENT ON */
15755b2ba9d3SPiotr Jasiukajtis 	xk = 0;
15765b2ba9d3SPiotr Jasiukajtis 	if (ix >= 0x43300000) {
15775b2ba9d3SPiotr Jasiukajtis 		if (ix >= 0x43400000)
15785b2ba9d3SPiotr Jasiukajtis 			xk = -2;
15795b2ba9d3SPiotr Jasiukajtis 		else
15805b2ba9d3SPiotr Jasiukajtis 			xk = -2 + (lx & 1);
15815b2ba9d3SPiotr Jasiukajtis 	} else if (ix >= 0x3ff00000) {
15825b2ba9d3SPiotr Jasiukajtis 		k = (ix >> 20) - 0x3ff;
15835b2ba9d3SPiotr Jasiukajtis 		if (k > 20) {
15845b2ba9d3SPiotr Jasiukajtis 			j = lx >> (52 - k);
15855b2ba9d3SPiotr Jasiukajtis 			if ((j << (52 - k)) == lx)
15865b2ba9d3SPiotr Jasiukajtis 				xk = -2 + (j & 1);
15875b2ba9d3SPiotr Jasiukajtis 			else
15885b2ba9d3SPiotr Jasiukajtis 				xk = j & 1;
15895b2ba9d3SPiotr Jasiukajtis 		} else {
15905b2ba9d3SPiotr Jasiukajtis 			j = ix >> (20 - k);
15915b2ba9d3SPiotr Jasiukajtis 			if ((j << (20 - k)) == ix && lx == 0)
15925b2ba9d3SPiotr Jasiukajtis 				xk = -2 + (j & 1);
15935b2ba9d3SPiotr Jasiukajtis 			else
15945b2ba9d3SPiotr Jasiukajtis 				xk = j & 1;
15955b2ba9d3SPiotr Jasiukajtis 		}
15965b2ba9d3SPiotr Jasiukajtis 	}
15975b2ba9d3SPiotr Jasiukajtis 	if (xk < 0)
15985b2ba9d3SPiotr Jasiukajtis 		/* ideally gamma(-n)= (-1)**(n+1) * inf, but c99 expect NaN */
15995b2ba9d3SPiotr Jasiukajtis 		return ((x - x) / (x - x));		/* 0/0 = NaN */
16005b2ba9d3SPiotr Jasiukajtis 
16015b2ba9d3SPiotr Jasiukajtis 
16025b2ba9d3SPiotr Jasiukajtis 	/* negative underflow thresold */
16035b2ba9d3SPiotr Jasiukajtis 	if (ix > 0x4066e000 || (ix == 0x4066e000 && lx > 11)) {
16045b2ba9d3SPiotr Jasiukajtis 		/* x < -183.0 - 11ulp */
16055b2ba9d3SPiotr Jasiukajtis 		z = tiny / x;
16065b2ba9d3SPiotr Jasiukajtis 		if (xk == 1)
16075b2ba9d3SPiotr Jasiukajtis 			z = -z;
16085b2ba9d3SPiotr Jasiukajtis 		return (z * tiny);
16095b2ba9d3SPiotr Jasiukajtis 	}
16105b2ba9d3SPiotr Jasiukajtis 
16115b2ba9d3SPiotr Jasiukajtis 	/* now compute gamma(x) by  -1/((sin(pi*y)/pi)*gamma(1+y)), y = -x */
16125b2ba9d3SPiotr Jasiukajtis 
16135b2ba9d3SPiotr Jasiukajtis 	/*
16145b2ba9d3SPiotr Jasiukajtis 	 * First compute ss = -sin(pi*y)/pi , so that
16155b2ba9d3SPiotr Jasiukajtis 	 * gamma(x) = 1/(ss*gamma(1+y))
16165b2ba9d3SPiotr Jasiukajtis 	 */
16175b2ba9d3SPiotr Jasiukajtis 	y = -x;
16185b2ba9d3SPiotr Jasiukajtis 	j = (int) y;
16195b2ba9d3SPiotr Jasiukajtis 	z = y - (double) j;
16205b2ba9d3SPiotr Jasiukajtis 	if (z > 0.3183098861837906715377675)
16215b2ba9d3SPiotr Jasiukajtis 		if (z > 0.6816901138162093284622325)
16225b2ba9d3SPiotr Jasiukajtis 			ss = kpsin(one - z);
16235b2ba9d3SPiotr Jasiukajtis 		else
16245b2ba9d3SPiotr Jasiukajtis 			ss = kpcos(0.5 - z);
16255b2ba9d3SPiotr Jasiukajtis 	else
16265b2ba9d3SPiotr Jasiukajtis 		ss = kpsin(z);
16275b2ba9d3SPiotr Jasiukajtis 	if (xk == 0) {
16285b2ba9d3SPiotr Jasiukajtis 		ss.h = -ss.h;
16295b2ba9d3SPiotr Jasiukajtis 		ss.l = -ss.l;
16305b2ba9d3SPiotr Jasiukajtis 	}
16315b2ba9d3SPiotr Jasiukajtis 
16325b2ba9d3SPiotr Jasiukajtis 	/* Then compute ww = gamma(1+y), note that result scale to 2**m */
16335b2ba9d3SPiotr Jasiukajtis 	m = 0;
16345b2ba9d3SPiotr Jasiukajtis 	if (j < 7) {
16355b2ba9d3SPiotr Jasiukajtis 		ww = gam_n(j + 1, z);
16365b2ba9d3SPiotr Jasiukajtis 	} else {
16375b2ba9d3SPiotr Jasiukajtis 		w = y + one;
16385b2ba9d3SPiotr Jasiukajtis 		if ((lx & 1) == 0) {	/* y+1 exact (note that y<184) */
16395b2ba9d3SPiotr Jasiukajtis 			ww = large_gam(w, &m);
16405b2ba9d3SPiotr Jasiukajtis 		} else {
16415b2ba9d3SPiotr Jasiukajtis 			t = w - one;
16425b2ba9d3SPiotr Jasiukajtis 			if (t == y) {	/* y+one exact */
16435b2ba9d3SPiotr Jasiukajtis 				ww = large_gam(w, &m);
16445b2ba9d3SPiotr Jasiukajtis 			} else {	/* use y*gamma(y) */
16455b2ba9d3SPiotr Jasiukajtis 				if (j == 7)
16465b2ba9d3SPiotr Jasiukajtis 					ww = gam_n(j, z);
16475b2ba9d3SPiotr Jasiukajtis 				else
16485b2ba9d3SPiotr Jasiukajtis 					ww = large_gam(y, &m);
16495b2ba9d3SPiotr Jasiukajtis 				t4 = ww.h + ww.l;
16505b2ba9d3SPiotr Jasiukajtis 				t1 = (double) ((float) y);
16515b2ba9d3SPiotr Jasiukajtis 				t2 = (double) ((float) t4);
16525b2ba9d3SPiotr Jasiukajtis 						/* t4 will not be too large */
16535b2ba9d3SPiotr Jasiukajtis 				ww.l = y * (ww.l - (t2 - ww.h)) + (y - t1) * t2;
16545b2ba9d3SPiotr Jasiukajtis 				ww.h = t1 * t2;
16555b2ba9d3SPiotr Jasiukajtis 			}
16565b2ba9d3SPiotr Jasiukajtis 		}
16575b2ba9d3SPiotr Jasiukajtis 	}
16585b2ba9d3SPiotr Jasiukajtis 
16595b2ba9d3SPiotr Jasiukajtis 	/* compute 1/(ss*ww) */
16605b2ba9d3SPiotr Jasiukajtis 	t3 = ss.h + ss.l;
16615b2ba9d3SPiotr Jasiukajtis 	t4 = ww.h + ww.l;
16625b2ba9d3SPiotr Jasiukajtis 	t1 = (double) ((float) t3);
16635b2ba9d3SPiotr Jasiukajtis 	t2 = (double) ((float) t4);
16645b2ba9d3SPiotr Jasiukajtis 	z1 = ss.l - (t1 - ss.h);	/* (t1,z1) = ss */
16655b2ba9d3SPiotr Jasiukajtis 	z2 = ww.l - (t2 - ww.h);	/* (t2,z2) = ww */
16665b2ba9d3SPiotr Jasiukajtis 	t3 = t3 * t4;			/* t3 = ss*ww */
16675b2ba9d3SPiotr Jasiukajtis 	z3 = one / t3;			/* z3 = 1/(ss*ww) */
16685b2ba9d3SPiotr Jasiukajtis 	t5 = t1 * t2;
16695b2ba9d3SPiotr Jasiukajtis 	z5 = z1 * t4 + t1 * z2;		/* (t5,z5) = ss*ww */
16705b2ba9d3SPiotr Jasiukajtis 	t1 = (double) ((float) t3);	/* (t1,z1) = ss*ww */
16715b2ba9d3SPiotr Jasiukajtis 	z1 = z5 - (t1 - t5);
16725b2ba9d3SPiotr Jasiukajtis 	t2 = (double) ((float) z3);	/* leading 1/(ss*ww) */
16735b2ba9d3SPiotr Jasiukajtis 	z2 = z3 * (t2 * z1 - (one - t2 * t1));
16745b2ba9d3SPiotr Jasiukajtis 	z = t2 - z2;
16755b2ba9d3SPiotr Jasiukajtis 
16765b2ba9d3SPiotr Jasiukajtis 	/* check whether z*2**-m underflow */
16775b2ba9d3SPiotr Jasiukajtis 	if (m != 0) {
16785b2ba9d3SPiotr Jasiukajtis 		hx = __HI(z);
16795b2ba9d3SPiotr Jasiukajtis 		i = hx & 0x80000000;
16805b2ba9d3SPiotr Jasiukajtis 		ix = hx ^ i;
16815b2ba9d3SPiotr Jasiukajtis 		j = ix >> 20;
16825b2ba9d3SPiotr Jasiukajtis 		if (j > m) {
16835b2ba9d3SPiotr Jasiukajtis 			ix -= m << 20;
16845b2ba9d3SPiotr Jasiukajtis 			__HI(z) = ix ^ i;
16855b2ba9d3SPiotr Jasiukajtis 		} else if ((m - j) > 52) {
16865b2ba9d3SPiotr Jasiukajtis 			/* underflow */
16875b2ba9d3SPiotr Jasiukajtis 			if (xk == 0)
16885b2ba9d3SPiotr Jasiukajtis 				z = -tiny * tiny;
16895b2ba9d3SPiotr Jasiukajtis 			else
16905b2ba9d3SPiotr Jasiukajtis 				z = tiny * tiny;
16915b2ba9d3SPiotr Jasiukajtis 		} else {
16925b2ba9d3SPiotr Jasiukajtis 			/* subnormal */
16935b2ba9d3SPiotr Jasiukajtis 			m -= 60;
16945b2ba9d3SPiotr Jasiukajtis 			t = one;
16955b2ba9d3SPiotr Jasiukajtis 			__HI(t) -= 60 << 20;
16965b2ba9d3SPiotr Jasiukajtis 			ix -= m << 20;
16975b2ba9d3SPiotr Jasiukajtis 			__HI(z) = ix ^ i;
16985b2ba9d3SPiotr Jasiukajtis 			z *= t;
16995b2ba9d3SPiotr Jasiukajtis 		}
17005b2ba9d3SPiotr Jasiukajtis 	}
17015b2ba9d3SPiotr Jasiukajtis 	return (z);
17025b2ba9d3SPiotr Jasiukajtis }
1703