xref: /illumos-gate/usr/src/lib/libm/common/C/j1.c (revision ddc0e0b5)
125c28e83SPiotr Jasiukajtis /*
225c28e83SPiotr Jasiukajtis  * CDDL HEADER START
325c28e83SPiotr Jasiukajtis  *
425c28e83SPiotr Jasiukajtis  * The contents of this file are subject to the terms of the
525c28e83SPiotr Jasiukajtis  * Common Development and Distribution License (the "License").
625c28e83SPiotr Jasiukajtis  * You may not use this file except in compliance with the License.
725c28e83SPiotr Jasiukajtis  *
825c28e83SPiotr Jasiukajtis  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
925c28e83SPiotr Jasiukajtis  * or http://www.opensolaris.org/os/licensing.
1025c28e83SPiotr Jasiukajtis  * See the License for the specific language governing permissions
1125c28e83SPiotr Jasiukajtis  * and limitations under the License.
1225c28e83SPiotr Jasiukajtis  *
1325c28e83SPiotr Jasiukajtis  * When distributing Covered Code, include this CDDL HEADER in each
1425c28e83SPiotr Jasiukajtis  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
1525c28e83SPiotr Jasiukajtis  * If applicable, add the following below this CDDL HEADER, with the
1625c28e83SPiotr Jasiukajtis  * fields enclosed by brackets "[]" replaced with your own identifying
1725c28e83SPiotr Jasiukajtis  * information: Portions Copyright [yyyy] [name of copyright owner]
1825c28e83SPiotr Jasiukajtis  *
1925c28e83SPiotr Jasiukajtis  * CDDL HEADER END
2025c28e83SPiotr Jasiukajtis  */
2125c28e83SPiotr Jasiukajtis 
2225c28e83SPiotr Jasiukajtis /*
2325c28e83SPiotr Jasiukajtis  * Copyright 2011 Nexenta Systems, Inc.  All rights reserved.
2425c28e83SPiotr Jasiukajtis  */
2525c28e83SPiotr Jasiukajtis /*
2625c28e83SPiotr Jasiukajtis  * Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
2725c28e83SPiotr Jasiukajtis  * Use is subject to license terms.
2825c28e83SPiotr Jasiukajtis  */
2925c28e83SPiotr Jasiukajtis 
3025c28e83SPiotr Jasiukajtis /*
3125c28e83SPiotr Jasiukajtis  * floating point Bessel's function of the first and second kinds
3225c28e83SPiotr Jasiukajtis  * of order zero: j1(x),y1(x);
3325c28e83SPiotr Jasiukajtis  *
3425c28e83SPiotr Jasiukajtis  * Special cases:
3525c28e83SPiotr Jasiukajtis  *	y0(0)=y1(0)=yn(n,0) = -inf with division by zero signal;
3625c28e83SPiotr Jasiukajtis  *	y0(-ve)=y1(-ve)=yn(n,-ve) are NaN with invalid signal.
3725c28e83SPiotr Jasiukajtis  */
3825c28e83SPiotr Jasiukajtis 
39*ddc0e0b5SRichard Lowe #pragma weak __j1 = j1
40*ddc0e0b5SRichard Lowe #pragma weak __y1 = y1
4125c28e83SPiotr Jasiukajtis 
4225c28e83SPiotr Jasiukajtis #include "libm.h"
4325c28e83SPiotr Jasiukajtis #include "libm_protos.h"
4425c28e83SPiotr Jasiukajtis #include <math.h>
4525c28e83SPiotr Jasiukajtis #include <values.h>
4625c28e83SPiotr Jasiukajtis 
4725c28e83SPiotr Jasiukajtis #define	GENERIC double
4825c28e83SPiotr Jasiukajtis static const GENERIC
4925c28e83SPiotr Jasiukajtis zero    = 0.0,
5025c28e83SPiotr Jasiukajtis small	= 1.0e-5,
5125c28e83SPiotr Jasiukajtis tiny 	= 1.0e-20,
5225c28e83SPiotr Jasiukajtis one	= 1.0,
5325c28e83SPiotr Jasiukajtis invsqrtpi = 5.641895835477562869480794515607725858441e-0001,
5425c28e83SPiotr Jasiukajtis tpi	= 0.636619772367581343075535053490057448;
5525c28e83SPiotr Jasiukajtis 
5625c28e83SPiotr Jasiukajtis static GENERIC pone(GENERIC), qone(GENERIC);
5725c28e83SPiotr Jasiukajtis static const GENERIC r0[4] = {
5825c28e83SPiotr Jasiukajtis 	-6.250000000000002203053200981413218949548e-0002,
5925c28e83SPiotr Jasiukajtis 	1.600998455640072901321605101981501263762e-0003,
6025c28e83SPiotr Jasiukajtis 	-1.963888815948313758552511884390162864930e-0005,
6125c28e83SPiotr Jasiukajtis 	8.263917341093549759781339713418201620998e-0008,
6225c28e83SPiotr Jasiukajtis };
6325c28e83SPiotr Jasiukajtis static const GENERIC s0[7] = {
6425c28e83SPiotr Jasiukajtis 	1.0e0,
6525c28e83SPiotr Jasiukajtis 	1.605069137643004242395356851797873766927e-0002,
6625c28e83SPiotr Jasiukajtis 	1.149454623251299996428500249509098499383e-0004,
6725c28e83SPiotr Jasiukajtis 	3.849701673735260970379681807910852327825e-0007,
6825c28e83SPiotr Jasiukajtis };
6925c28e83SPiotr Jasiukajtis static const GENERIC r1[12] = {
7025c28e83SPiotr Jasiukajtis 	4.999999999999999995517408894340485471724e-0001,
7125c28e83SPiotr Jasiukajtis 	-6.003825028120475684835384519945468075423e-0002,
7225c28e83SPiotr Jasiukajtis 	2.301719899263321828388344461995355419832e-0003,
7325c28e83SPiotr Jasiukajtis 	-4.208494869238892934859525221654040304068e-0005,
7425c28e83SPiotr Jasiukajtis 	4.377745135188837783031540029700282443388e-0007,
7525c28e83SPiotr Jasiukajtis 	-2.854106755678624335145364226735677754179e-0009,
7625c28e83SPiotr Jasiukajtis 	1.234002865443952024332943901323798413689e-0011,
7725c28e83SPiotr Jasiukajtis 	-3.645498437039791058951273508838177134310e-0014,
7825c28e83SPiotr Jasiukajtis 	7.404320596071797459925377103787837414422e-0017,
7925c28e83SPiotr Jasiukajtis 	-1.009457448277522275262808398517024439084e-0019,
8025c28e83SPiotr Jasiukajtis 	8.520158355824819796968771418801019930585e-0023,
8125c28e83SPiotr Jasiukajtis 	-3.458159926081163274483854614601091361424e-0026,
8225c28e83SPiotr Jasiukajtis };
8325c28e83SPiotr Jasiukajtis static const GENERIC s1[5] = {
8425c28e83SPiotr Jasiukajtis 	1.0e0,
8525c28e83SPiotr Jasiukajtis 	4.923499437590484879081138588998986303306e-0003,
8625c28e83SPiotr Jasiukajtis 	1.054389489212184156499666953501976688452e-0005,
8725c28e83SPiotr Jasiukajtis 	1.180768373106166527048240364872043816050e-0008,
8825c28e83SPiotr Jasiukajtis 	5.942665743476099355323245707680648588540e-0012,
8925c28e83SPiotr Jasiukajtis };
9025c28e83SPiotr Jasiukajtis 
9125c28e83SPiotr Jasiukajtis GENERIC
j1(GENERIC x)9225c28e83SPiotr Jasiukajtis j1(GENERIC x) {
9325c28e83SPiotr Jasiukajtis 	GENERIC z, d, s, c, ss, cc, r;
9425c28e83SPiotr Jasiukajtis 	int i, sgn;
9525c28e83SPiotr Jasiukajtis 
9625c28e83SPiotr Jasiukajtis 	if (!finite(x))
9725c28e83SPiotr Jasiukajtis 		return (one/x);
9825c28e83SPiotr Jasiukajtis 	sgn = signbit(x);
9925c28e83SPiotr Jasiukajtis 	x = fabs(x);
10025c28e83SPiotr Jasiukajtis 	if (x > 8.00) {
10125c28e83SPiotr Jasiukajtis 		s = sin(x);
10225c28e83SPiotr Jasiukajtis 		c = cos(x);
10325c28e83SPiotr Jasiukajtis 	/*
10425c28e83SPiotr Jasiukajtis 	 * j1(x) = sqrt(2/(pi*x))*(p1(x)*cos(x0)-q1(x)*sin(x0))
10525c28e83SPiotr Jasiukajtis 	 * where x0 = x-3pi/4
10625c28e83SPiotr Jasiukajtis 	 * 	Better formula:
10725c28e83SPiotr Jasiukajtis 	 *		cos(x0) = cos(x)cos(3pi/4)+sin(x)sin(3pi/4)
10825c28e83SPiotr Jasiukajtis 	 *			=  1/sqrt(2) * (sin(x) - cos(x))
10925c28e83SPiotr Jasiukajtis 	 *		sin(x0) = sin(x)cos(3pi/4)-cos(x)sin(3pi/4)
11025c28e83SPiotr Jasiukajtis 	 *			= -1/sqrt(2) * (cos(x) + sin(x))
11125c28e83SPiotr Jasiukajtis 	 * To avoid cancellation, use
11225c28e83SPiotr Jasiukajtis 	 *		sin(x) +- cos(x) = -cos(2x)/(sin(x) -+ cos(x))
11325c28e83SPiotr Jasiukajtis 	 * to compute the worse one.
11425c28e83SPiotr Jasiukajtis 	 */
11525c28e83SPiotr Jasiukajtis 		if (x > 8.9e307) {	/* x+x may overflow */
11625c28e83SPiotr Jasiukajtis 			ss = -s-c;
11725c28e83SPiotr Jasiukajtis 			cc =  s-c;
11825c28e83SPiotr Jasiukajtis 		} else if (signbit(s) != signbit(c)) {
11925c28e83SPiotr Jasiukajtis 			cc = s - c;
12025c28e83SPiotr Jasiukajtis 			ss = cos(x+x)/cc;
12125c28e83SPiotr Jasiukajtis 		} else {
12225c28e83SPiotr Jasiukajtis 			ss = -s-c;
12325c28e83SPiotr Jasiukajtis 			cc = cos(x+x)/ss;
12425c28e83SPiotr Jasiukajtis 		}
12525c28e83SPiotr Jasiukajtis 	/*
12625c28e83SPiotr Jasiukajtis 	 * j1(x) = 1/sqrt(pi*x) * (P(1,x)*cc - Q(1,x)*ss)
12725c28e83SPiotr Jasiukajtis 	 * y1(x) = 1/sqrt(pi*x) * (P(1,x)*ss + Q(1,x)*cc)
12825c28e83SPiotr Jasiukajtis 	 */
12925c28e83SPiotr Jasiukajtis 		if (x > 1.0e40)
13025c28e83SPiotr Jasiukajtis 		    d = (invsqrtpi*cc)/sqrt(x);
13125c28e83SPiotr Jasiukajtis 		else
13225c28e83SPiotr Jasiukajtis 			d =  invsqrtpi*(pone(x)*cc-qone(x)*ss)/sqrt(x);
13325c28e83SPiotr Jasiukajtis 
13425c28e83SPiotr Jasiukajtis 		if (x > X_TLOSS) {
13525c28e83SPiotr Jasiukajtis 		    if (sgn != 0) { d = -d; x = -x; }
13625c28e83SPiotr Jasiukajtis 			return (_SVID_libm_err(x, d, 36));
13725c28e83SPiotr Jasiukajtis 		} else
13825c28e83SPiotr Jasiukajtis 		    if (sgn == 0)
13925c28e83SPiotr Jasiukajtis 				return (d);
14025c28e83SPiotr Jasiukajtis 			else
14125c28e83SPiotr Jasiukajtis 				return (-d);
14225c28e83SPiotr Jasiukajtis 	}
14325c28e83SPiotr Jasiukajtis 	if (x <= small) {
14425c28e83SPiotr Jasiukajtis 		if (x <= tiny)
14525c28e83SPiotr Jasiukajtis 			d = 0.5*x;
14625c28e83SPiotr Jasiukajtis 		else
14725c28e83SPiotr Jasiukajtis 			d =  x*(0.5-x*x*0.125);
14825c28e83SPiotr Jasiukajtis 		if (sgn == 0)
14925c28e83SPiotr Jasiukajtis 			return (d);
15025c28e83SPiotr Jasiukajtis 		else
15125c28e83SPiotr Jasiukajtis 			return (-d);
15225c28e83SPiotr Jasiukajtis 	}
15325c28e83SPiotr Jasiukajtis 	z = x*x;
15425c28e83SPiotr Jasiukajtis 	if (x < 1.28) {
15525c28e83SPiotr Jasiukajtis 	    r = r0[3];
15625c28e83SPiotr Jasiukajtis 	    s = s0[3];
15725c28e83SPiotr Jasiukajtis 	    for (i = 2; i >= 0; i--) {
15825c28e83SPiotr Jasiukajtis 		r = r*z + r0[i];
15925c28e83SPiotr Jasiukajtis 		s = s*z + s0[i];
16025c28e83SPiotr Jasiukajtis 	    }
16125c28e83SPiotr Jasiukajtis 	    d = x*0.5+x*(z*(r/s));
16225c28e83SPiotr Jasiukajtis 	} else {
16325c28e83SPiotr Jasiukajtis 	    r = r1[11];
16425c28e83SPiotr Jasiukajtis 	    for (i = 10; i >= 0; i--) r = r*z + r1[i];
16525c28e83SPiotr Jasiukajtis 	    s = s1[0]+z*(s1[1]+z*(s1[2]+z*(s1[3]+z*s1[4])));
16625c28e83SPiotr Jasiukajtis 	    d = x*(r/s);
16725c28e83SPiotr Jasiukajtis 	}
16825c28e83SPiotr Jasiukajtis 	if (sgn == 0)
16925c28e83SPiotr Jasiukajtis 		return (d);
17025c28e83SPiotr Jasiukajtis 	else
17125c28e83SPiotr Jasiukajtis 		return (-d);
17225c28e83SPiotr Jasiukajtis }
17325c28e83SPiotr Jasiukajtis 
17425c28e83SPiotr Jasiukajtis static const GENERIC u0[4] = {
17525c28e83SPiotr Jasiukajtis 	-1.960570906462389461018983259589655961560e-0001,
17625c28e83SPiotr Jasiukajtis 	4.931824118350661953459180060007970291139e-0002,
17725c28e83SPiotr Jasiukajtis 	-1.626975871565393656845930125424683008677e-0003,
17825c28e83SPiotr Jasiukajtis 	1.359657517926394132692884168082224258360e-0005,
17925c28e83SPiotr Jasiukajtis };
18025c28e83SPiotr Jasiukajtis static const GENERIC v0[5] = {
18125c28e83SPiotr Jasiukajtis 	1.0e0,
18225c28e83SPiotr Jasiukajtis 	2.565807214838390835108224713630901653793e-0002,
18325c28e83SPiotr Jasiukajtis 	3.374175208978404268650522752520906231508e-0004,
18425c28e83SPiotr Jasiukajtis 	2.840368571306070719539936935220728843177e-0006,
18525c28e83SPiotr Jasiukajtis 	1.396387402048998277638900944415752207592e-0008,
18625c28e83SPiotr Jasiukajtis };
18725c28e83SPiotr Jasiukajtis static const GENERIC u1[12] = {
18825c28e83SPiotr Jasiukajtis 	-1.960570906462389473336339614647555351626e-0001,
18925c28e83SPiotr Jasiukajtis 	5.336268030335074494231369159933012844735e-0002,
19025c28e83SPiotr Jasiukajtis 	-2.684137504382748094149184541866332033280e-0003,
19125c28e83SPiotr Jasiukajtis 	5.737671618979185736981543498580051903060e-0005,
19225c28e83SPiotr Jasiukajtis 	-6.642696350686335339171171785557663224892e-0007,
19325c28e83SPiotr Jasiukajtis 	4.692417922568160354012347591960362101664e-0009,
19425c28e83SPiotr Jasiukajtis 	-2.161728635907789319335231338621412258355e-0011,
19525c28e83SPiotr Jasiukajtis 	6.727353419738316107197644431844194668702e-0014,
19625c28e83SPiotr Jasiukajtis 	-1.427502986803861372125234355906790573422e-0016,
19725c28e83SPiotr Jasiukajtis 	2.020392498726806769468143219616642940371e-0019,
19825c28e83SPiotr Jasiukajtis 	-1.761371948595104156753045457888272716340e-0022,
19925c28e83SPiotr Jasiukajtis 	7.352828391941157905175042420249225115816e-0026,
20025c28e83SPiotr Jasiukajtis };
20125c28e83SPiotr Jasiukajtis static const GENERIC v1[5] = {
20225c28e83SPiotr Jasiukajtis 	1.0e0,
20325c28e83SPiotr Jasiukajtis 	5.029187436727947764916247076102283399442e-0003,
20425c28e83SPiotr Jasiukajtis 	1.102693095808242775074856548927801750627e-0005,
20525c28e83SPiotr Jasiukajtis 	1.268035774543174837829534603830227216291e-0008,
20625c28e83SPiotr Jasiukajtis 	6.579416271766610825192542295821308730206e-0012,
20725c28e83SPiotr Jasiukajtis };
20825c28e83SPiotr Jasiukajtis 
20925c28e83SPiotr Jasiukajtis 
21025c28e83SPiotr Jasiukajtis GENERIC
y1(GENERIC x)21125c28e83SPiotr Jasiukajtis y1(GENERIC x) {
21225c28e83SPiotr Jasiukajtis 	GENERIC z, d, s, c, ss, cc, u, v;
21325c28e83SPiotr Jasiukajtis 	int i;
21425c28e83SPiotr Jasiukajtis 
21525c28e83SPiotr Jasiukajtis 	if (isnan(x))
21625c28e83SPiotr Jasiukajtis 		return (x*x);	/* + -> * for Cheetah */
21725c28e83SPiotr Jasiukajtis 	if (x <= zero) {
21825c28e83SPiotr Jasiukajtis 		if (x == zero)
21925c28e83SPiotr Jasiukajtis 		    /* return -one/zero;  */
22025c28e83SPiotr Jasiukajtis 		    return (_SVID_libm_err(x, x, 10));
22125c28e83SPiotr Jasiukajtis 		else
22225c28e83SPiotr Jasiukajtis 		    /* return zero/zero; */
22325c28e83SPiotr Jasiukajtis 		    return (_SVID_libm_err(x, x, 11));
22425c28e83SPiotr Jasiukajtis 	}
22525c28e83SPiotr Jasiukajtis 	if (x > 8.0) {
22625c28e83SPiotr Jasiukajtis 		if (!finite(x))
22725c28e83SPiotr Jasiukajtis 			return (zero);
22825c28e83SPiotr Jasiukajtis 		s = sin(x);
22925c28e83SPiotr Jasiukajtis 		c = cos(x);
23025c28e83SPiotr Jasiukajtis 	/*
23125c28e83SPiotr Jasiukajtis 	 * j1(x) = sqrt(2/(pi*x))*(p1(x)*cos(x0)-q1(x)*sin(x0))
23225c28e83SPiotr Jasiukajtis 	 * where x0 = x-3pi/4
23325c28e83SPiotr Jasiukajtis 	 * 	Better formula:
23425c28e83SPiotr Jasiukajtis 	 *		cos(x0) = cos(x)cos(3pi/4)+sin(x)sin(3pi/4)
23525c28e83SPiotr Jasiukajtis 	 *			=  1/sqrt(2) * (sin(x) - cos(x))
23625c28e83SPiotr Jasiukajtis 	 *		sin(x0) = sin(x)cos(3pi/4)-cos(x)sin(3pi/4)
23725c28e83SPiotr Jasiukajtis 	 *			= -1/sqrt(2) * (cos(x) + sin(x))
23825c28e83SPiotr Jasiukajtis 	 * To avoid cancellation, use
23925c28e83SPiotr Jasiukajtis 	 *		sin(x) +- cos(x) = -cos(2x)/(sin(x) -+ cos(x))
24025c28e83SPiotr Jasiukajtis 	 * to compute the worse one.
24125c28e83SPiotr Jasiukajtis 	 */
24225c28e83SPiotr Jasiukajtis 		if (x > 8.9e307) {	/* x+x may overflow */
24325c28e83SPiotr Jasiukajtis 			ss = -s-c;
24425c28e83SPiotr Jasiukajtis 			cc =  s-c;
24525c28e83SPiotr Jasiukajtis 		} else if (signbit(s) != signbit(c)) {
24625c28e83SPiotr Jasiukajtis 			cc = s - c;
24725c28e83SPiotr Jasiukajtis 			ss = cos(x+x)/cc;
24825c28e83SPiotr Jasiukajtis 		} else {
24925c28e83SPiotr Jasiukajtis 			ss = -s-c;
25025c28e83SPiotr Jasiukajtis 			cc = cos(x+x)/ss;
25125c28e83SPiotr Jasiukajtis 		}
25225c28e83SPiotr Jasiukajtis 	/*
25325c28e83SPiotr Jasiukajtis 	 * j1(x) = 1/sqrt(pi*x) * (P(1,x)*cc - Q(1,x)*ss)
25425c28e83SPiotr Jasiukajtis 	 * y1(x) = 1/sqrt(pi*x) * (P(1,x)*ss + Q(1,x)*cc)
25525c28e83SPiotr Jasiukajtis 	 */
25625c28e83SPiotr Jasiukajtis 		if (x > 1.0e91)
25725c28e83SPiotr Jasiukajtis 		    d =  (invsqrtpi*ss)/sqrt(x);
25825c28e83SPiotr Jasiukajtis 		else
25925c28e83SPiotr Jasiukajtis 			d = invsqrtpi*(pone(x)*ss+qone(x)*cc)/sqrt(x);
26025c28e83SPiotr Jasiukajtis 
26125c28e83SPiotr Jasiukajtis 		if (x > X_TLOSS)
26225c28e83SPiotr Jasiukajtis 			return (_SVID_libm_err(x, d, 37));
26325c28e83SPiotr Jasiukajtis 		else
26425c28e83SPiotr Jasiukajtis 			return (d);
26525c28e83SPiotr Jasiukajtis 	}
26625c28e83SPiotr Jasiukajtis 		if (x <= tiny) {
26725c28e83SPiotr Jasiukajtis 			return (-tpi/x);
26825c28e83SPiotr Jasiukajtis 		}
26925c28e83SPiotr Jasiukajtis 	z = x*x;
27025c28e83SPiotr Jasiukajtis 	if (x < 1.28) {
27125c28e83SPiotr Jasiukajtis 	    u = u0[3]; v = v0[3]+z*v0[4];
27225c28e83SPiotr Jasiukajtis 	    for (i = 2; i >= 0; i--) {
27325c28e83SPiotr Jasiukajtis 		u = u*z + u0[i];
27425c28e83SPiotr Jasiukajtis 		v = v*z + v0[i];
27525c28e83SPiotr Jasiukajtis 	    }
27625c28e83SPiotr Jasiukajtis 	} else {
27725c28e83SPiotr Jasiukajtis 	    for (u = u1[11], i = 10; i >= 0; i--) u = u*z+u1[i];
27825c28e83SPiotr Jasiukajtis 	    v = v1[0]+z*(v1[1]+z*(v1[2]+z*(v1[3]+z*v1[4])));
27925c28e83SPiotr Jasiukajtis 	}
28025c28e83SPiotr Jasiukajtis 	return (x*(u/v) + tpi*(j1(x)*log(x)-one/x));
28125c28e83SPiotr Jasiukajtis }
28225c28e83SPiotr Jasiukajtis 
28325c28e83SPiotr Jasiukajtis static const GENERIC pr0[6] = {
28425c28e83SPiotr Jasiukajtis 	-.4435757816794127857114720794e7,
28525c28e83SPiotr Jasiukajtis 	-.9942246505077641195658377899e7,
28625c28e83SPiotr Jasiukajtis 	-.6603373248364939109255245434e7,
28725c28e83SPiotr Jasiukajtis 	-.1523529351181137383255105722e7,
28825c28e83SPiotr Jasiukajtis 	-.1098240554345934672737413139e6,
28925c28e83SPiotr Jasiukajtis 	-.1611616644324610116477412898e4,
29025c28e83SPiotr Jasiukajtis };
29125c28e83SPiotr Jasiukajtis static const GENERIC ps0[6] = {
29225c28e83SPiotr Jasiukajtis 	-.4435757816794127856828016962e7,
29325c28e83SPiotr Jasiukajtis 	-.9934124389934585658967556309e7,
29425c28e83SPiotr Jasiukajtis 	-.6585339479723087072826915069e7,
29525c28e83SPiotr Jasiukajtis 	-.1511809506634160881644546358e7,
29625c28e83SPiotr Jasiukajtis 	-.1072638599110382011903063867e6,
29725c28e83SPiotr Jasiukajtis 	-.1455009440190496182453565068e4,
29825c28e83SPiotr Jasiukajtis };
29925c28e83SPiotr Jasiukajtis static const GENERIC huge    = 1.0e10;
30025c28e83SPiotr Jasiukajtis 
30125c28e83SPiotr Jasiukajtis static GENERIC
pone(GENERIC x)30225c28e83SPiotr Jasiukajtis pone(GENERIC x) {
30325c28e83SPiotr Jasiukajtis 	GENERIC s, r, t, z;
30425c28e83SPiotr Jasiukajtis 	int i;
30525c28e83SPiotr Jasiukajtis 		/* assume x > 8 */
30625c28e83SPiotr Jasiukajtis 	if (x > huge)
30725c28e83SPiotr Jasiukajtis 		return (one);
30825c28e83SPiotr Jasiukajtis 
30925c28e83SPiotr Jasiukajtis 	t = 8.0/x; z = t*t;
31025c28e83SPiotr Jasiukajtis 	r = pr0[5]; s = ps0[5]+z;
31125c28e83SPiotr Jasiukajtis 	for (i = 4; i >= 0; i--) {
31225c28e83SPiotr Jasiukajtis 		r = z*r + pr0[i];
31325c28e83SPiotr Jasiukajtis 		s = z*s + ps0[i];
31425c28e83SPiotr Jasiukajtis 	}
31525c28e83SPiotr Jasiukajtis 	return (r/s);
31625c28e83SPiotr Jasiukajtis }
31725c28e83SPiotr Jasiukajtis 
31825c28e83SPiotr Jasiukajtis 
31925c28e83SPiotr Jasiukajtis static const GENERIC qr0[6] = {
32025c28e83SPiotr Jasiukajtis 	0.3322091340985722351859704442e5,
32125c28e83SPiotr Jasiukajtis 	0.8514516067533570196555001171e5,
32225c28e83SPiotr Jasiukajtis 	0.6617883658127083517939992166e5,
32325c28e83SPiotr Jasiukajtis 	0.1849426287322386679652009819e5,
32425c28e83SPiotr Jasiukajtis 	0.1706375429020768002061283546e4,
32525c28e83SPiotr Jasiukajtis 	0.3526513384663603218592175580e2,
32625c28e83SPiotr Jasiukajtis };
32725c28e83SPiotr Jasiukajtis static const GENERIC qs0[6] = {
32825c28e83SPiotr Jasiukajtis 	0.7087128194102874357377502472e6,
32925c28e83SPiotr Jasiukajtis 	0.1819458042243997298924553839e7,
33025c28e83SPiotr Jasiukajtis 	0.1419460669603720892855755253e7,
33125c28e83SPiotr Jasiukajtis 	0.4002944358226697511708610813e6,
33225c28e83SPiotr Jasiukajtis 	0.3789022974577220264142952256e5,
33325c28e83SPiotr Jasiukajtis 	0.8638367769604990967475517183e3,
33425c28e83SPiotr Jasiukajtis };
33525c28e83SPiotr Jasiukajtis 
33625c28e83SPiotr Jasiukajtis static GENERIC
qone(GENERIC x)33725c28e83SPiotr Jasiukajtis qone(GENERIC x) {
33825c28e83SPiotr Jasiukajtis 	GENERIC s, r, t, z;
33925c28e83SPiotr Jasiukajtis 	int i;
34025c28e83SPiotr Jasiukajtis 	if (x > huge)
34125c28e83SPiotr Jasiukajtis 		return (0.375/x);
34225c28e83SPiotr Jasiukajtis 
34325c28e83SPiotr Jasiukajtis 	t = 8.0/x; z = t*t;
34425c28e83SPiotr Jasiukajtis 		/* assume x > 8 */
34525c28e83SPiotr Jasiukajtis 	r = qr0[5]; s = qs0[5]+z;
34625c28e83SPiotr Jasiukajtis 	for (i = 4; i >= 0; i--) {
34725c28e83SPiotr Jasiukajtis 		r = z*r + qr0[i];
34825c28e83SPiotr Jasiukajtis 		s = z*s + qs0[i];
34925c28e83SPiotr Jasiukajtis 	}
35025c28e83SPiotr Jasiukajtis 	return (t*(r/s));
35125c28e83SPiotr Jasiukajtis }
352