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 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 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 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 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