1*81418a27Smrg /*
2*81418a27Smrg  * ====================================================
3*81418a27Smrg  * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
4*81418a27Smrg  *
5*81418a27Smrg  * Developed at SunPro, a Sun Microsystems, Inc. business.
6*81418a27Smrg  * Permission to use, copy, modify, and distribute this
7*81418a27Smrg  * software is freely granted, provided that this notice
8*81418a27Smrg  * is preserved.
9*81418a27Smrg  * ====================================================
10*81418a27Smrg  */
11*81418a27Smrg 
12*81418a27Smrg /* Modifications and expansions for 128-bit long double are
13*81418a27Smrg    Copyright (C) 2001 Stephen L. Moshier <moshier@na-net.ornl.gov>
14*81418a27Smrg    and are incorporated herein by permission of the author.  The author
15*81418a27Smrg    reserves the right to distribute this material elsewhere under different
16*81418a27Smrg    copying permissions.  These modifications are distributed here under
17*81418a27Smrg    the following terms:
18*81418a27Smrg 
19*81418a27Smrg     This library is free software; you can redistribute it and/or
20*81418a27Smrg     modify it under the terms of the GNU Lesser General Public
21*81418a27Smrg     License as published by the Free Software Foundation; either
22*81418a27Smrg     version 2.1 of the License, or (at your option) any later version.
23*81418a27Smrg 
24*81418a27Smrg     This library is distributed in the hope that it will be useful,
25*81418a27Smrg     but WITHOUT ANY WARRANTY; without even the implied warranty of
26*81418a27Smrg     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
27*81418a27Smrg     Lesser General Public License for more details.
28*81418a27Smrg 
29*81418a27Smrg     You should have received a copy of the GNU Lesser General Public
30*81418a27Smrg     License along with this library; if not, see
31*81418a27Smrg     <http://www.gnu.org/licenses/>.  */
32*81418a27Smrg 
33*81418a27Smrg /* double erf(double x)
34*81418a27Smrg  * double erfc(double x)
35*81418a27Smrg  *			     x
36*81418a27Smrg  *		      2      |\
37*81418a27Smrg  *     erf(x)  =  ---------  | exp(-t*t)dt
38*81418a27Smrg  *		   sqrt(pi) \|
39*81418a27Smrg  *			     0
40*81418a27Smrg  *
41*81418a27Smrg  *     erfc(x) =  1-erf(x)
42*81418a27Smrg  *  Note that
43*81418a27Smrg  *		erf(-x) = -erf(x)
44*81418a27Smrg  *		erfc(-x) = 2 - erfc(x)
45*81418a27Smrg  *
46*81418a27Smrg  * Method:
47*81418a27Smrg  *	1.  erf(x)  = x + x*R(x^2) for |x| in [0, 7/8]
48*81418a27Smrg  *	   Remark. The formula is derived by noting
49*81418a27Smrg  *          erf(x) = (2/sqrt(pi))*(x - x^3/3 + x^5/10 - x^7/42 + ....)
50*81418a27Smrg  *	   and that
51*81418a27Smrg  *          2/sqrt(pi) = 1.128379167095512573896158903121545171688
52*81418a27Smrg  *	   is close to one.
53*81418a27Smrg  *
54*81418a27Smrg  *      1a. erf(x)  = 1 - erfc(x), for |x| > 1.0
55*81418a27Smrg  *          erfc(x) = 1 - erf(x)  if |x| < 1/4
56*81418a27Smrg  *
57*81418a27Smrg  *      2. For |x| in [7/8, 1], let s = |x| - 1, and
58*81418a27Smrg  *         c = 0.84506291151 rounded to single (24 bits)
59*81418a27Smrg  *	erf(s + c)  = sign(x) * (c  + P1(s)/Q1(s))
60*81418a27Smrg  *	   Remark: here we use the taylor series expansion at x=1.
61*81418a27Smrg  *		erf(1+s) = erf(1) + s*Poly(s)
62*81418a27Smrg  *			 = 0.845.. + P1(s)/Q1(s)
63*81418a27Smrg  *	   Note that |P1/Q1|< 0.078 for x in [0.84375,1.25]
64*81418a27Smrg  *
65*81418a27Smrg  *      3. For x in [1/4, 5/4],
66*81418a27Smrg  *	erfc(s + const)  = erfc(const)  + s P1(s)/Q1(s)
67*81418a27Smrg  *              for const = 1/4, 3/8, ..., 9/8
68*81418a27Smrg  *              and 0 <= s <= 1/8 .
69*81418a27Smrg  *
70*81418a27Smrg  *      4. For x in [5/4, 107],
71*81418a27Smrg  *	erfc(x) = (1/x)*exp(-x*x-0.5625 + R(z))
72*81418a27Smrg  *              z=1/x^2
73*81418a27Smrg  *         The interval is partitioned into several segments
74*81418a27Smrg  *         of width 1/8 in 1/x.
75*81418a27Smrg  *
76*81418a27Smrg  *      Note1:
77*81418a27Smrg  *	   To compute exp(-x*x-0.5625+R/S), let s be a single
78*81418a27Smrg  *	   precision number and s := x; then
79*81418a27Smrg  *		-x*x = -s*s + (s-x)*(s+x)
80*81418a27Smrg  *	        exp(-x*x-0.5626+R/S) =
81*81418a27Smrg  *			exp(-s*s-0.5625)*exp((s-x)*(s+x)+R/S);
82*81418a27Smrg  *      Note2:
83*81418a27Smrg  *	   Here 4 and 5 make use of the asymptotic series
84*81418a27Smrg  *			  exp(-x*x)
85*81418a27Smrg  *		erfc(x) ~ ---------- * ( 1 + Poly(1/x^2) )
86*81418a27Smrg  *			  x*sqrt(pi)
87*81418a27Smrg  *
88*81418a27Smrg  *      5. For inf > x >= 107
89*81418a27Smrg  *	erf(x)  = sign(x) *(1 - tiny)  (raise inexact)
90*81418a27Smrg  *	erfc(x) = tiny*tiny (raise underflow) if x > 0
91*81418a27Smrg  *			= 2 - tiny if x<0
92*81418a27Smrg  *
93*81418a27Smrg  *      7. Special case:
94*81418a27Smrg  *	erf(0)  = 0, erf(inf)  = 1, erf(-inf) = -1,
95*81418a27Smrg  *	erfc(0) = 1, erfc(inf) = 0, erfc(-inf) = 2,
96*81418a27Smrg  *		erfc/erf(NaN) is NaN
97*81418a27Smrg  */
98*81418a27Smrg 
99*81418a27Smrg #include "quadmath-imp.h"
100*81418a27Smrg 
101*81418a27Smrg /* Evaluate P[n] x^n  +  P[n-1] x^(n-1)  +  ...  +  P[0] */
102*81418a27Smrg 
103*81418a27Smrg static __float128
neval(__float128 x,const __float128 * p,int n)104*81418a27Smrg neval (__float128 x, const __float128 *p, int n)
105*81418a27Smrg {
106*81418a27Smrg   __float128 y;
107*81418a27Smrg 
108*81418a27Smrg   p += n;
109*81418a27Smrg   y = *p--;
110*81418a27Smrg   do
111*81418a27Smrg     {
112*81418a27Smrg       y = y * x + *p--;
113*81418a27Smrg     }
114*81418a27Smrg   while (--n > 0);
115*81418a27Smrg   return y;
116*81418a27Smrg }
117*81418a27Smrg 
118*81418a27Smrg 
119*81418a27Smrg /* Evaluate x^n+1  +  P[n] x^(n)  +  P[n-1] x^(n-1)  +  ...  +  P[0] */
120*81418a27Smrg 
121*81418a27Smrg static __float128
deval(__float128 x,const __float128 * p,int n)122*81418a27Smrg deval (__float128 x, const __float128 *p, int n)
123*81418a27Smrg {
124*81418a27Smrg   __float128 y;
125*81418a27Smrg 
126*81418a27Smrg   p += n;
127*81418a27Smrg   y = x + *p--;
128*81418a27Smrg   do
129*81418a27Smrg     {
130*81418a27Smrg       y = y * x + *p--;
131*81418a27Smrg     }
132*81418a27Smrg   while (--n > 0);
133*81418a27Smrg   return y;
134*81418a27Smrg }
135*81418a27Smrg 
136*81418a27Smrg 
137*81418a27Smrg 
138*81418a27Smrg static const __float128
139*81418a27Smrg tiny = 1e-4931Q,
140*81418a27Smrg   one = 1,
141*81418a27Smrg   two = 2,
142*81418a27Smrg   /* 2/sqrt(pi) - 1 */
143*81418a27Smrg   efx = 1.2837916709551257389615890312154517168810E-1Q;
144*81418a27Smrg 
145*81418a27Smrg 
146*81418a27Smrg /* erf(x)  = x  + x R(x^2)
147*81418a27Smrg    0 <= x <= 7/8
148*81418a27Smrg    Peak relative error 1.8e-35  */
149*81418a27Smrg #define NTN1 8
150*81418a27Smrg static const __float128 TN1[NTN1 + 1] =
151*81418a27Smrg {
152*81418a27Smrg  -3.858252324254637124543172907442106422373E10Q,
153*81418a27Smrg   9.580319248590464682316366876952214879858E10Q,
154*81418a27Smrg   1.302170519734879977595901236693040544854E10Q,
155*81418a27Smrg   2.922956950426397417800321486727032845006E9Q,
156*81418a27Smrg   1.764317520783319397868923218385468729799E8Q,
157*81418a27Smrg   1.573436014601118630105796794840834145120E7Q,
158*81418a27Smrg   4.028077380105721388745632295157816229289E5Q,
159*81418a27Smrg   1.644056806467289066852135096352853491530E4Q,
160*81418a27Smrg   3.390868480059991640235675479463287886081E1Q
161*81418a27Smrg };
162*81418a27Smrg #define NTD1 8
163*81418a27Smrg static const __float128 TD1[NTD1 + 1] =
164*81418a27Smrg {
165*81418a27Smrg   -3.005357030696532927149885530689529032152E11Q,
166*81418a27Smrg   -1.342602283126282827411658673839982164042E11Q,
167*81418a27Smrg   -2.777153893355340961288511024443668743399E10Q,
168*81418a27Smrg   -3.483826391033531996955620074072768276974E9Q,
169*81418a27Smrg   -2.906321047071299585682722511260895227921E8Q,
170*81418a27Smrg   -1.653347985722154162439387878512427542691E7Q,
171*81418a27Smrg   -6.245520581562848778466500301865173123136E5Q,
172*81418a27Smrg   -1.402124304177498828590239373389110545142E4Q,
173*81418a27Smrg   -1.209368072473510674493129989468348633579E2Q
174*81418a27Smrg /* 1.0E0 */
175*81418a27Smrg };
176*81418a27Smrg 
177*81418a27Smrg 
178*81418a27Smrg /* erf(z+1)  = erf_const + P(z)/Q(z)
179*81418a27Smrg    -.125 <= z <= 0
180*81418a27Smrg    Peak relative error 7.3e-36  */
181*81418a27Smrg static const __float128 erf_const = 0.845062911510467529296875Q;
182*81418a27Smrg #define NTN2 8
183*81418a27Smrg static const __float128 TN2[NTN2 + 1] =
184*81418a27Smrg {
185*81418a27Smrg  -4.088889697077485301010486931817357000235E1Q,
186*81418a27Smrg   7.157046430681808553842307502826960051036E3Q,
187*81418a27Smrg  -2.191561912574409865550015485451373731780E3Q,
188*81418a27Smrg   2.180174916555316874988981177654057337219E3Q,
189*81418a27Smrg   2.848578658049670668231333682379720943455E2Q,
190*81418a27Smrg   1.630362490952512836762810462174798925274E2Q,
191*81418a27Smrg   6.317712353961866974143739396865293596895E0Q,
192*81418a27Smrg   2.450441034183492434655586496522857578066E1Q,
193*81418a27Smrg   5.127662277706787664956025545897050896203E-1Q
194*81418a27Smrg };
195*81418a27Smrg #define NTD2 8
196*81418a27Smrg static const __float128 TD2[NTD2 + 1] =
197*81418a27Smrg {
198*81418a27Smrg   1.731026445926834008273768924015161048885E4Q,
199*81418a27Smrg   1.209682239007990370796112604286048173750E4Q,
200*81418a27Smrg   1.160950290217993641320602282462976163857E4Q,
201*81418a27Smrg   5.394294645127126577825507169061355698157E3Q,
202*81418a27Smrg   2.791239340533632669442158497532521776093E3Q,
203*81418a27Smrg   8.989365571337319032943005387378993827684E2Q,
204*81418a27Smrg   2.974016493766349409725385710897298069677E2Q,
205*81418a27Smrg   6.148192754590376378740261072533527271947E1Q,
206*81418a27Smrg   1.178502892490738445655468927408440847480E1Q
207*81418a27Smrg  /* 1.0E0 */
208*81418a27Smrg };
209*81418a27Smrg 
210*81418a27Smrg 
211*81418a27Smrg /* erfc(x + 0.25) = erfc(0.25) + x R(x)
212*81418a27Smrg    0 <= x < 0.125
213*81418a27Smrg    Peak relative error 1.4e-35  */
214*81418a27Smrg #define NRNr13 8
215*81418a27Smrg static const __float128 RNr13[NRNr13 + 1] =
216*81418a27Smrg {
217*81418a27Smrg  -2.353707097641280550282633036456457014829E3Q,
218*81418a27Smrg   3.871159656228743599994116143079870279866E2Q,
219*81418a27Smrg  -3.888105134258266192210485617504098426679E2Q,
220*81418a27Smrg  -2.129998539120061668038806696199343094971E1Q,
221*81418a27Smrg  -8.125462263594034672468446317145384108734E1Q,
222*81418a27Smrg   8.151549093983505810118308635926270319660E0Q,
223*81418a27Smrg  -5.033362032729207310462422357772568553670E0Q,
224*81418a27Smrg  -4.253956621135136090295893547735851168471E-2Q,
225*81418a27Smrg  -8.098602878463854789780108161581050357814E-2Q
226*81418a27Smrg };
227*81418a27Smrg #define NRDr13 7
228*81418a27Smrg static const __float128 RDr13[NRDr13 + 1] =
229*81418a27Smrg {
230*81418a27Smrg   2.220448796306693503549505450626652881752E3Q,
231*81418a27Smrg   1.899133258779578688791041599040951431383E2Q,
232*81418a27Smrg   1.061906712284961110196427571557149268454E3Q,
233*81418a27Smrg   7.497086072306967965180978101974566760042E1Q,
234*81418a27Smrg   2.146796115662672795876463568170441327274E2Q,
235*81418a27Smrg   1.120156008362573736664338015952284925592E1Q,
236*81418a27Smrg   2.211014952075052616409845051695042741074E1Q,
237*81418a27Smrg   6.469655675326150785692908453094054988938E-1Q
238*81418a27Smrg  /* 1.0E0 */
239*81418a27Smrg };
240*81418a27Smrg /* erfc(0.25) = C13a + C13b to extra precision.  */
241*81418a27Smrg static const __float128 C13a = 0.723663330078125Q;
242*81418a27Smrg static const __float128 C13b = 1.0279753638067014931732235184287934646022E-5Q;
243*81418a27Smrg 
244*81418a27Smrg 
245*81418a27Smrg /* erfc(x + 0.375) = erfc(0.375) + x R(x)
246*81418a27Smrg    0 <= x < 0.125
247*81418a27Smrg    Peak relative error 1.2e-35  */
248*81418a27Smrg #define NRNr14 8
249*81418a27Smrg static const __float128 RNr14[NRNr14 + 1] =
250*81418a27Smrg {
251*81418a27Smrg  -2.446164016404426277577283038988918202456E3Q,
252*81418a27Smrg   6.718753324496563913392217011618096698140E2Q,
253*81418a27Smrg  -4.581631138049836157425391886957389240794E2Q,
254*81418a27Smrg  -2.382844088987092233033215402335026078208E1Q,
255*81418a27Smrg  -7.119237852400600507927038680970936336458E1Q,
256*81418a27Smrg   1.313609646108420136332418282286454287146E1Q,
257*81418a27Smrg  -6.188608702082264389155862490056401365834E0Q,
258*81418a27Smrg  -2.787116601106678287277373011101132659279E-2Q,
259*81418a27Smrg  -2.230395570574153963203348263549700967918E-2Q
260*81418a27Smrg };
261*81418a27Smrg #define NRDr14 7
262*81418a27Smrg static const __float128 RDr14[NRDr14 + 1] =
263*81418a27Smrg {
264*81418a27Smrg   2.495187439241869732696223349840963702875E3Q,
265*81418a27Smrg   2.503549449872925580011284635695738412162E2Q,
266*81418a27Smrg   1.159033560988895481698051531263861842461E3Q,
267*81418a27Smrg   9.493751466542304491261487998684383688622E1Q,
268*81418a27Smrg   2.276214929562354328261422263078480321204E2Q,
269*81418a27Smrg   1.367697521219069280358984081407807931847E1Q,
270*81418a27Smrg   2.276988395995528495055594829206582732682E1Q,
271*81418a27Smrg   7.647745753648996559837591812375456641163E-1Q
272*81418a27Smrg  /* 1.0E0 */
273*81418a27Smrg };
274*81418a27Smrg /* erfc(0.375) = C14a + C14b to extra precision.  */
275*81418a27Smrg static const __float128 C14a = 0.5958709716796875Q;
276*81418a27Smrg static const __float128 C14b = 1.2118885490201676174914080878232469565953E-5Q;
277*81418a27Smrg 
278*81418a27Smrg /* erfc(x + 0.5) = erfc(0.5) + x R(x)
279*81418a27Smrg    0 <= x < 0.125
280*81418a27Smrg    Peak relative error 4.7e-36  */
281*81418a27Smrg #define NRNr15 8
282*81418a27Smrg static const __float128 RNr15[NRNr15 + 1] =
283*81418a27Smrg {
284*81418a27Smrg  -2.624212418011181487924855581955853461925E3Q,
285*81418a27Smrg   8.473828904647825181073831556439301342756E2Q,
286*81418a27Smrg  -5.286207458628380765099405359607331669027E2Q,
287*81418a27Smrg  -3.895781234155315729088407259045269652318E1Q,
288*81418a27Smrg  -6.200857908065163618041240848728398496256E1Q,
289*81418a27Smrg   1.469324610346924001393137895116129204737E1Q,
290*81418a27Smrg  -6.961356525370658572800674953305625578903E0Q,
291*81418a27Smrg   5.145724386641163809595512876629030548495E-3Q,
292*81418a27Smrg   1.990253655948179713415957791776180406812E-2Q
293*81418a27Smrg };
294*81418a27Smrg #define NRDr15 7
295*81418a27Smrg static const __float128 RDr15[NRDr15 + 1] =
296*81418a27Smrg {
297*81418a27Smrg   2.986190760847974943034021764693341524962E3Q,
298*81418a27Smrg   5.288262758961073066335410218650047725985E2Q,
299*81418a27Smrg   1.363649178071006978355113026427856008978E3Q,
300*81418a27Smrg   1.921707975649915894241864988942255320833E2Q,
301*81418a27Smrg   2.588651100651029023069013885900085533226E2Q,
302*81418a27Smrg   2.628752920321455606558942309396855629459E1Q,
303*81418a27Smrg   2.455649035885114308978333741080991380610E1Q,
304*81418a27Smrg   1.378826653595128464383127836412100939126E0Q
305*81418a27Smrg   /* 1.0E0 */
306*81418a27Smrg };
307*81418a27Smrg /* erfc(0.5) = C15a + C15b to extra precision.  */
308*81418a27Smrg static const __float128 C15a = 0.4794921875Q;
309*81418a27Smrg static const __float128 C15b = 7.9346869534623172533461080354712635484242E-6Q;
310*81418a27Smrg 
311*81418a27Smrg /* erfc(x + 0.625) = erfc(0.625) + x R(x)
312*81418a27Smrg    0 <= x < 0.125
313*81418a27Smrg    Peak relative error 5.1e-36  */
314*81418a27Smrg #define NRNr16 8
315*81418a27Smrg static const __float128 RNr16[NRNr16 + 1] =
316*81418a27Smrg {
317*81418a27Smrg  -2.347887943200680563784690094002722906820E3Q,
318*81418a27Smrg   8.008590660692105004780722726421020136482E2Q,
319*81418a27Smrg  -5.257363310384119728760181252132311447963E2Q,
320*81418a27Smrg  -4.471737717857801230450290232600243795637E1Q,
321*81418a27Smrg  -4.849540386452573306708795324759300320304E1Q,
322*81418a27Smrg   1.140885264677134679275986782978655952843E1Q,
323*81418a27Smrg  -6.731591085460269447926746876983786152300E0Q,
324*81418a27Smrg   1.370831653033047440345050025876085121231E-1Q,
325*81418a27Smrg   2.022958279982138755020825717073966576670E-2Q,
326*81418a27Smrg };
327*81418a27Smrg #define NRDr16 7
328*81418a27Smrg static const __float128 RDr16[NRDr16 + 1] =
329*81418a27Smrg {
330*81418a27Smrg   3.075166170024837215399323264868308087281E3Q,
331*81418a27Smrg   8.730468942160798031608053127270430036627E2Q,
332*81418a27Smrg   1.458472799166340479742581949088453244767E3Q,
333*81418a27Smrg   3.230423687568019709453130785873540386217E2Q,
334*81418a27Smrg   2.804009872719893612081109617983169474655E2Q,
335*81418a27Smrg   4.465334221323222943418085830026979293091E1Q,
336*81418a27Smrg   2.612723259683205928103787842214809134746E1Q,
337*81418a27Smrg   2.341526751185244109722204018543276124997E0Q,
338*81418a27Smrg   /* 1.0E0 */
339*81418a27Smrg };
340*81418a27Smrg /* erfc(0.625) = C16a + C16b to extra precision.  */
341*81418a27Smrg static const __float128 C16a = 0.3767547607421875Q;
342*81418a27Smrg static const __float128 C16b = 4.3570693945275513594941232097252997287766E-6Q;
343*81418a27Smrg 
344*81418a27Smrg /* erfc(x + 0.75) = erfc(0.75) + x R(x)
345*81418a27Smrg    0 <= x < 0.125
346*81418a27Smrg    Peak relative error 1.7e-35  */
347*81418a27Smrg #define NRNr17 8
348*81418a27Smrg static const __float128 RNr17[NRNr17 + 1] =
349*81418a27Smrg {
350*81418a27Smrg   -1.767068734220277728233364375724380366826E3Q,
351*81418a27Smrg   6.693746645665242832426891888805363898707E2Q,
352*81418a27Smrg   -4.746224241837275958126060307406616817753E2Q,
353*81418a27Smrg   -2.274160637728782675145666064841883803196E1Q,
354*81418a27Smrg   -3.541232266140939050094370552538987982637E1Q,
355*81418a27Smrg   6.988950514747052676394491563585179503865E0Q,
356*81418a27Smrg   -5.807687216836540830881352383529281215100E0Q,
357*81418a27Smrg   3.631915988567346438830283503729569443642E-1Q,
358*81418a27Smrg   -1.488945487149634820537348176770282391202E-2Q
359*81418a27Smrg };
360*81418a27Smrg #define NRDr17 7
361*81418a27Smrg static const __float128 RDr17[NRDr17 + 1] =
362*81418a27Smrg {
363*81418a27Smrg   2.748457523498150741964464942246913394647E3Q,
364*81418a27Smrg   1.020213390713477686776037331757871252652E3Q,
365*81418a27Smrg   1.388857635935432621972601695296561952738E3Q,
366*81418a27Smrg   3.903363681143817750895999579637315491087E2Q,
367*81418a27Smrg   2.784568344378139499217928969529219886578E2Q,
368*81418a27Smrg   5.555800830216764702779238020065345401144E1Q,
369*81418a27Smrg   2.646215470959050279430447295801291168941E1Q,
370*81418a27Smrg   2.984905282103517497081766758550112011265E0Q,
371*81418a27Smrg   /* 1.0E0 */
372*81418a27Smrg };
373*81418a27Smrg /* erfc(0.75) = C17a + C17b to extra precision.  */
374*81418a27Smrg static const __float128 C17a = 0.2888336181640625Q;
375*81418a27Smrg static const __float128 C17b = 1.0748182422368401062165408589222625794046E-5Q;
376*81418a27Smrg 
377*81418a27Smrg 
378*81418a27Smrg /* erfc(x + 0.875) = erfc(0.875) + x R(x)
379*81418a27Smrg    0 <= x < 0.125
380*81418a27Smrg    Peak relative error 2.2e-35  */
381*81418a27Smrg #define NRNr18 8
382*81418a27Smrg static const __float128 RNr18[NRNr18 + 1] =
383*81418a27Smrg {
384*81418a27Smrg  -1.342044899087593397419622771847219619588E3Q,
385*81418a27Smrg   6.127221294229172997509252330961641850598E2Q,
386*81418a27Smrg  -4.519821356522291185621206350470820610727E2Q,
387*81418a27Smrg   1.223275177825128732497510264197915160235E1Q,
388*81418a27Smrg  -2.730789571382971355625020710543532867692E1Q,
389*81418a27Smrg   4.045181204921538886880171727755445395862E0Q,
390*81418a27Smrg  -4.925146477876592723401384464691452700539E0Q,
391*81418a27Smrg   5.933878036611279244654299924101068088582E-1Q,
392*81418a27Smrg  -5.557645435858916025452563379795159124753E-2Q
393*81418a27Smrg };
394*81418a27Smrg #define NRDr18 7
395*81418a27Smrg static const __float128 RDr18[NRDr18 + 1] =
396*81418a27Smrg {
397*81418a27Smrg   2.557518000661700588758505116291983092951E3Q,
398*81418a27Smrg   1.070171433382888994954602511991940418588E3Q,
399*81418a27Smrg   1.344842834423493081054489613250688918709E3Q,
400*81418a27Smrg   4.161144478449381901208660598266288188426E2Q,
401*81418a27Smrg   2.763670252219855198052378138756906980422E2Q,
402*81418a27Smrg   5.998153487868943708236273854747564557632E1Q,
403*81418a27Smrg   2.657695108438628847733050476209037025318E1Q,
404*81418a27Smrg   3.252140524394421868923289114410336976512E0Q,
405*81418a27Smrg   /* 1.0E0 */
406*81418a27Smrg };
407*81418a27Smrg /* erfc(0.875) = C18a + C18b to extra precision.  */
408*81418a27Smrg static const __float128 C18a = 0.215911865234375Q;
409*81418a27Smrg static const __float128 C18b = 1.3073705765341685464282101150637224028267E-5Q;
410*81418a27Smrg 
411*81418a27Smrg /* erfc(x + 1.0) = erfc(1.0) + x R(x)
412*81418a27Smrg    0 <= x < 0.125
413*81418a27Smrg    Peak relative error 1.6e-35  */
414*81418a27Smrg #define NRNr19 8
415*81418a27Smrg static const __float128 RNr19[NRNr19 + 1] =
416*81418a27Smrg {
417*81418a27Smrg  -1.139180936454157193495882956565663294826E3Q,
418*81418a27Smrg   6.134903129086899737514712477207945973616E2Q,
419*81418a27Smrg  -4.628909024715329562325555164720732868263E2Q,
420*81418a27Smrg   4.165702387210732352564932347500364010833E1Q,
421*81418a27Smrg  -2.286979913515229747204101330405771801610E1Q,
422*81418a27Smrg   1.870695256449872743066783202326943667722E0Q,
423*81418a27Smrg  -4.177486601273105752879868187237000032364E0Q,
424*81418a27Smrg   7.533980372789646140112424811291782526263E-1Q,
425*81418a27Smrg  -8.629945436917752003058064731308767664446E-2Q
426*81418a27Smrg };
427*81418a27Smrg #define NRDr19 7
428*81418a27Smrg static const __float128 RDr19[NRDr19 + 1] =
429*81418a27Smrg {
430*81418a27Smrg   2.744303447981132701432716278363418643778E3Q,
431*81418a27Smrg   1.266396359526187065222528050591302171471E3Q,
432*81418a27Smrg   1.466739461422073351497972255511919814273E3Q,
433*81418a27Smrg   4.868710570759693955597496520298058147162E2Q,
434*81418a27Smrg   2.993694301559756046478189634131722579643E2Q,
435*81418a27Smrg   6.868976819510254139741559102693828237440E1Q,
436*81418a27Smrg   2.801505816247677193480190483913753613630E1Q,
437*81418a27Smrg   3.604439909194350263552750347742663954481E0Q,
438*81418a27Smrg   /* 1.0E0 */
439*81418a27Smrg };
440*81418a27Smrg /* erfc(1.0) = C19a + C19b to extra precision.  */
441*81418a27Smrg static const __float128 C19a = 0.15728759765625Q;
442*81418a27Smrg static const __float128 C19b = 1.1609394035130658779364917390740703933002E-5Q;
443*81418a27Smrg 
444*81418a27Smrg /* erfc(x + 1.125) = erfc(1.125) + x R(x)
445*81418a27Smrg    0 <= x < 0.125
446*81418a27Smrg    Peak relative error 3.6e-36  */
447*81418a27Smrg #define NRNr20 8
448*81418a27Smrg static const __float128 RNr20[NRNr20 + 1] =
449*81418a27Smrg {
450*81418a27Smrg  -9.652706916457973956366721379612508047640E2Q,
451*81418a27Smrg   5.577066396050932776683469951773643880634E2Q,
452*81418a27Smrg  -4.406335508848496713572223098693575485978E2Q,
453*81418a27Smrg   5.202893466490242733570232680736966655434E1Q,
454*81418a27Smrg  -1.931311847665757913322495948705563937159E1Q,
455*81418a27Smrg  -9.364318268748287664267341457164918090611E-2Q,
456*81418a27Smrg  -3.306390351286352764891355375882586201069E0Q,
457*81418a27Smrg   7.573806045289044647727613003096916516475E-1Q,
458*81418a27Smrg  -9.611744011489092894027478899545635991213E-2Q
459*81418a27Smrg };
460*81418a27Smrg #define NRDr20 7
461*81418a27Smrg static const __float128 RDr20[NRDr20 + 1] =
462*81418a27Smrg {
463*81418a27Smrg   3.032829629520142564106649167182428189014E3Q,
464*81418a27Smrg   1.659648470721967719961167083684972196891E3Q,
465*81418a27Smrg   1.703545128657284619402511356932569292535E3Q,
466*81418a27Smrg   6.393465677731598872500200253155257708763E2Q,
467*81418a27Smrg   3.489131397281030947405287112726059221934E2Q,
468*81418a27Smrg   8.848641738570783406484348434387611713070E1Q,
469*81418a27Smrg   3.132269062552392974833215844236160958502E1Q,
470*81418a27Smrg   4.430131663290563523933419966185230513168E0Q
471*81418a27Smrg  /* 1.0E0 */
472*81418a27Smrg };
473*81418a27Smrg /* erfc(1.125) = C20a + C20b to extra precision.  */
474*81418a27Smrg static const __float128 C20a = 0.111602783203125Q;
475*81418a27Smrg static const __float128 C20b = 8.9850951672359304215530728365232161564636E-6Q;
476*81418a27Smrg 
477*81418a27Smrg /* erfc(1/x) = 1/x exp (-1/x^2 - 0.5625 + R(1/x^2))
478*81418a27Smrg    7/8 <= 1/x < 1
479*81418a27Smrg    Peak relative error 1.4e-35  */
480*81418a27Smrg #define NRNr8 9
481*81418a27Smrg static const __float128 RNr8[NRNr8 + 1] =
482*81418a27Smrg {
483*81418a27Smrg   3.587451489255356250759834295199296936784E1Q,
484*81418a27Smrg   5.406249749087340431871378009874875889602E2Q,
485*81418a27Smrg   2.931301290625250886238822286506381194157E3Q,
486*81418a27Smrg   7.359254185241795584113047248898753470923E3Q,
487*81418a27Smrg   9.201031849810636104112101947312492532314E3Q,
488*81418a27Smrg   5.749697096193191467751650366613289284777E3Q,
489*81418a27Smrg   1.710415234419860825710780802678697889231E3Q,
490*81418a27Smrg   2.150753982543378580859546706243022719599E2Q,
491*81418a27Smrg   8.740953582272147335100537849981160931197E0Q,
492*81418a27Smrg   4.876422978828717219629814794707963640913E-2Q
493*81418a27Smrg };
494*81418a27Smrg #define NRDr8 8
495*81418a27Smrg static const __float128 RDr8[NRDr8 + 1] =
496*81418a27Smrg {
497*81418a27Smrg   6.358593134096908350929496535931630140282E1Q,
498*81418a27Smrg   9.900253816552450073757174323424051765523E2Q,
499*81418a27Smrg   5.642928777856801020545245437089490805186E3Q,
500*81418a27Smrg   1.524195375199570868195152698617273739609E4Q,
501*81418a27Smrg   2.113829644500006749947332935305800887345E4Q,
502*81418a27Smrg   1.526438562626465706267943737310282977138E4Q,
503*81418a27Smrg   5.561370922149241457131421914140039411782E3Q,
504*81418a27Smrg   9.394035530179705051609070428036834496942E2Q,
505*81418a27Smrg   6.147019596150394577984175188032707343615E1Q
506*81418a27Smrg   /* 1.0E0 */
507*81418a27Smrg };
508*81418a27Smrg 
509*81418a27Smrg /* erfc(1/x) = 1/x exp (-1/x^2 - 0.5625 + R(1/x^2))
510*81418a27Smrg    0.75 <= 1/x <= 0.875
511*81418a27Smrg    Peak relative error 2.0e-36  */
512*81418a27Smrg #define NRNr7 9
513*81418a27Smrg static const __float128 RNr7[NRNr7 + 1] =
514*81418a27Smrg {
515*81418a27Smrg  1.686222193385987690785945787708644476545E1Q,
516*81418a27Smrg  1.178224543567604215602418571310612066594E3Q,
517*81418a27Smrg  1.764550584290149466653899886088166091093E4Q,
518*81418a27Smrg  1.073758321890334822002849369898232811561E5Q,
519*81418a27Smrg  3.132840749205943137619839114451290324371E5Q,
520*81418a27Smrg  4.607864939974100224615527007793867585915E5Q,
521*81418a27Smrg  3.389781820105852303125270837910972384510E5Q,
522*81418a27Smrg  1.174042187110565202875011358512564753399E5Q,
523*81418a27Smrg  1.660013606011167144046604892622504338313E4Q,
524*81418a27Smrg  6.700393957480661937695573729183733234400E2Q
525*81418a27Smrg };
526*81418a27Smrg #define NRDr7 9
527*81418a27Smrg static const __float128 RDr7[NRDr7 + 1] =
528*81418a27Smrg {
529*81418a27Smrg -1.709305024718358874701575813642933561169E3Q,
530*81418a27Smrg -3.280033887481333199580464617020514788369E4Q,
531*81418a27Smrg -2.345284228022521885093072363418750835214E5Q,
532*81418a27Smrg -8.086758123097763971926711729242327554917E5Q,
533*81418a27Smrg -1.456900414510108718402423999575992450138E6Q,
534*81418a27Smrg -1.391654264881255068392389037292702041855E6Q,
535*81418a27Smrg -6.842360801869939983674527468509852583855E5Q,
536*81418a27Smrg -1.597430214446573566179675395199807533371E5Q,
537*81418a27Smrg -1.488876130609876681421645314851760773480E4Q,
538*81418a27Smrg -3.511762950935060301403599443436465645703E2Q
539*81418a27Smrg  /* 1.0E0 */
540*81418a27Smrg };
541*81418a27Smrg 
542*81418a27Smrg /* erfc(1/x) = 1/x exp(-1/x^2 - 0.5625 + R(1/x^2))
543*81418a27Smrg    5/8 <= 1/x < 3/4
544*81418a27Smrg    Peak relative error 1.9e-35  */
545*81418a27Smrg #define NRNr6 9
546*81418a27Smrg static const __float128 RNr6[NRNr6 + 1] =
547*81418a27Smrg {
548*81418a27Smrg  1.642076876176834390623842732352935761108E0Q,
549*81418a27Smrg  1.207150003611117689000664385596211076662E2Q,
550*81418a27Smrg  2.119260779316389904742873816462800103939E3Q,
551*81418a27Smrg  1.562942227734663441801452930916044224174E4Q,
552*81418a27Smrg  5.656779189549710079988084081145693580479E4Q,
553*81418a27Smrg  1.052166241021481691922831746350942786299E5Q,
554*81418a27Smrg  9.949798524786000595621602790068349165758E4Q,
555*81418a27Smrg  4.491790734080265043407035220188849562856E4Q,
556*81418a27Smrg  8.377074098301530326270432059434791287601E3Q,
557*81418a27Smrg  4.506934806567986810091824791963991057083E2Q
558*81418a27Smrg };
559*81418a27Smrg #define NRDr6 9
560*81418a27Smrg static const __float128 RDr6[NRDr6 + 1] =
561*81418a27Smrg {
562*81418a27Smrg -1.664557643928263091879301304019826629067E2Q,
563*81418a27Smrg -3.800035902507656624590531122291160668452E3Q,
564*81418a27Smrg -3.277028191591734928360050685359277076056E4Q,
565*81418a27Smrg -1.381359471502885446400589109566587443987E5Q,
566*81418a27Smrg -3.082204287382581873532528989283748656546E5Q,
567*81418a27Smrg -3.691071488256738343008271448234631037095E5Q,
568*81418a27Smrg -2.300482443038349815750714219117566715043E5Q,
569*81418a27Smrg -6.873955300927636236692803579555752171530E4Q,
570*81418a27Smrg -8.262158817978334142081581542749986845399E3Q,
571*81418a27Smrg -2.517122254384430859629423488157361983661E2Q
572*81418a27Smrg  /* 1.00 */
573*81418a27Smrg };
574*81418a27Smrg 
575*81418a27Smrg /* erfc(1/x) = 1/x exp(-1/x^2 - 0.5625 + R(1/x^2))
576*81418a27Smrg    1/2 <= 1/x < 5/8
577*81418a27Smrg    Peak relative error 4.6e-36  */
578*81418a27Smrg #define NRNr5 10
579*81418a27Smrg static const __float128 RNr5[NRNr5 + 1] =
580*81418a27Smrg {
581*81418a27Smrg -3.332258927455285458355550878136506961608E-3Q,
582*81418a27Smrg -2.697100758900280402659586595884478660721E-1Q,
583*81418a27Smrg -6.083328551139621521416618424949137195536E0Q,
584*81418a27Smrg -6.119863528983308012970821226810162441263E1Q,
585*81418a27Smrg -3.176535282475593173248810678636522589861E2Q,
586*81418a27Smrg -8.933395175080560925809992467187963260693E2Q,
587*81418a27Smrg -1.360019508488475978060917477620199499560E3Q,
588*81418a27Smrg -1.075075579828188621541398761300910213280E3Q,
589*81418a27Smrg -4.017346561586014822824459436695197089916E2Q,
590*81418a27Smrg -5.857581368145266249509589726077645791341E1Q,
591*81418a27Smrg -2.077715925587834606379119585995758954399E0Q
592*81418a27Smrg };
593*81418a27Smrg #define NRDr5 9
594*81418a27Smrg static const __float128 RDr5[NRDr5 + 1] =
595*81418a27Smrg {
596*81418a27Smrg  3.377879570417399341550710467744693125385E-1Q,
597*81418a27Smrg  1.021963322742390735430008860602594456187E1Q,
598*81418a27Smrg  1.200847646592942095192766255154827011939E2Q,
599*81418a27Smrg  7.118915528142927104078182863387116942836E2Q,
600*81418a27Smrg  2.318159380062066469386544552429625026238E3Q,
601*81418a27Smrg  4.238729853534009221025582008928765281620E3Q,
602*81418a27Smrg  4.279114907284825886266493994833515580782E3Q,
603*81418a27Smrg  2.257277186663261531053293222591851737504E3Q,
604*81418a27Smrg  5.570475501285054293371908382916063822957E2Q,
605*81418a27Smrg  5.142189243856288981145786492585432443560E1Q
606*81418a27Smrg  /* 1.0E0 */
607*81418a27Smrg };
608*81418a27Smrg 
609*81418a27Smrg /* erfc(1/x) = 1/x exp(-1/x^2 - 0.5625 + R(1/x^2))
610*81418a27Smrg    3/8 <= 1/x < 1/2
611*81418a27Smrg    Peak relative error 2.0e-36  */
612*81418a27Smrg #define NRNr4 10
613*81418a27Smrg static const __float128 RNr4[NRNr4 + 1] =
614*81418a27Smrg {
615*81418a27Smrg  3.258530712024527835089319075288494524465E-3Q,
616*81418a27Smrg  2.987056016877277929720231688689431056567E-1Q,
617*81418a27Smrg  8.738729089340199750734409156830371528862E0Q,
618*81418a27Smrg  1.207211160148647782396337792426311125923E2Q,
619*81418a27Smrg  8.997558632489032902250523945248208224445E2Q,
620*81418a27Smrg  3.798025197699757225978410230530640879762E3Q,
621*81418a27Smrg  9.113203668683080975637043118209210146846E3Q,
622*81418a27Smrg  1.203285891339933238608683715194034900149E4Q,
623*81418a27Smrg  8.100647057919140328536743641735339740855E3Q,
624*81418a27Smrg  2.383888249907144945837976899822927411769E3Q,
625*81418a27Smrg  2.127493573166454249221983582495245662319E2Q
626*81418a27Smrg };
627*81418a27Smrg #define NRDr4 10
628*81418a27Smrg static const __float128 RDr4[NRDr4 + 1] =
629*81418a27Smrg {
630*81418a27Smrg -3.303141981514540274165450687270180479586E-1Q,
631*81418a27Smrg -1.353768629363605300707949368917687066724E1Q,
632*81418a27Smrg -2.206127630303621521950193783894598987033E2Q,
633*81418a27Smrg -1.861800338758066696514480386180875607204E3Q,
634*81418a27Smrg -8.889048775872605708249140016201753255599E3Q,
635*81418a27Smrg -2.465888106627948210478692168261494857089E4Q,
636*81418a27Smrg -3.934642211710774494879042116768390014289E4Q,
637*81418a27Smrg -3.455077258242252974937480623730228841003E4Q,
638*81418a27Smrg -1.524083977439690284820586063729912653196E4Q,
639*81418a27Smrg -2.810541887397984804237552337349093953857E3Q,
640*81418a27Smrg -1.343929553541159933824901621702567066156E2Q
641*81418a27Smrg  /* 1.0E0 */
642*81418a27Smrg };
643*81418a27Smrg 
644*81418a27Smrg /* erfc(1/x) = 1/x exp(-1/x^2 - 0.5625 + R(1/x^2))
645*81418a27Smrg    1/4 <= 1/x < 3/8
646*81418a27Smrg    Peak relative error 8.4e-37  */
647*81418a27Smrg #define NRNr3 11
648*81418a27Smrg static const __float128 RNr3[NRNr3 + 1] =
649*81418a27Smrg {
650*81418a27Smrg -1.952401126551202208698629992497306292987E-6Q,
651*81418a27Smrg -2.130881743066372952515162564941682716125E-4Q,
652*81418a27Smrg -8.376493958090190943737529486107282224387E-3Q,
653*81418a27Smrg -1.650592646560987700661598877522831234791E-1Q,
654*81418a27Smrg -1.839290818933317338111364667708678163199E0Q,
655*81418a27Smrg -1.216278715570882422410442318517814388470E1Q,
656*81418a27Smrg -4.818759344462360427612133632533779091386E1Q,
657*81418a27Smrg -1.120994661297476876804405329172164436784E2Q,
658*81418a27Smrg -1.452850765662319264191141091859300126931E2Q,
659*81418a27Smrg -9.485207851128957108648038238656777241333E1Q,
660*81418a27Smrg -2.563663855025796641216191848818620020073E1Q,
661*81418a27Smrg -1.787995944187565676837847610706317833247E0Q
662*81418a27Smrg };
663*81418a27Smrg #define NRDr3 10
664*81418a27Smrg static const __float128 RDr3[NRDr3 + 1] =
665*81418a27Smrg {
666*81418a27Smrg  1.979130686770349481460559711878399476903E-4Q,
667*81418a27Smrg  1.156941716128488266238105813374635099057E-2Q,
668*81418a27Smrg  2.752657634309886336431266395637285974292E-1Q,
669*81418a27Smrg  3.482245457248318787349778336603569327521E0Q,
670*81418a27Smrg  2.569347069372696358578399521203959253162E1Q,
671*81418a27Smrg  1.142279000180457419740314694631879921561E2Q,
672*81418a27Smrg  3.056503977190564294341422623108332700840E2Q,
673*81418a27Smrg  4.780844020923794821656358157128719184422E2Q,
674*81418a27Smrg  4.105972727212554277496256802312730410518E2Q,
675*81418a27Smrg  1.724072188063746970865027817017067646246E2Q,
676*81418a27Smrg  2.815939183464818198705278118326590370435E1Q
677*81418a27Smrg  /* 1.0E0 */
678*81418a27Smrg };
679*81418a27Smrg 
680*81418a27Smrg /* erfc(1/x) = 1/x exp(-1/x^2 - 0.5625 + R(1/x^2))
681*81418a27Smrg    1/8 <= 1/x < 1/4
682*81418a27Smrg    Peak relative error 1.5e-36  */
683*81418a27Smrg #define NRNr2 11
684*81418a27Smrg static const __float128 RNr2[NRNr2 + 1] =
685*81418a27Smrg {
686*81418a27Smrg -2.638914383420287212401687401284326363787E-8Q,
687*81418a27Smrg -3.479198370260633977258201271399116766619E-6Q,
688*81418a27Smrg -1.783985295335697686382487087502222519983E-4Q,
689*81418a27Smrg -4.777876933122576014266349277217559356276E-3Q,
690*81418a27Smrg -7.450634738987325004070761301045014986520E-2Q,
691*81418a27Smrg -7.068318854874733315971973707247467326619E-1Q,
692*81418a27Smrg -4.113919921935944795764071670806867038732E0Q,
693*81418a27Smrg -1.440447573226906222417767283691888875082E1Q,
694*81418a27Smrg -2.883484031530718428417168042141288943905E1Q,
695*81418a27Smrg -2.990886974328476387277797361464279931446E1Q,
696*81418a27Smrg -1.325283914915104866248279787536128997331E1Q,
697*81418a27Smrg -1.572436106228070195510230310658206154374E0Q
698*81418a27Smrg };
699*81418a27Smrg #define NRDr2 10
700*81418a27Smrg static const __float128 RDr2[NRDr2 + 1] =
701*81418a27Smrg {
702*81418a27Smrg  2.675042728136731923554119302571867799673E-6Q,
703*81418a27Smrg  2.170997868451812708585443282998329996268E-4Q,
704*81418a27Smrg  7.249969752687540289422684951196241427445E-3Q,
705*81418a27Smrg  1.302040375859768674620410563307838448508E-1Q,
706*81418a27Smrg  1.380202483082910888897654537144485285549E0Q,
707*81418a27Smrg  8.926594113174165352623847870299170069350E0Q,
708*81418a27Smrg  3.521089584782616472372909095331572607185E1Q,
709*81418a27Smrg  8.233547427533181375185259050330809105570E1Q,
710*81418a27Smrg  1.072971579885803033079469639073292840135E2Q,
711*81418a27Smrg  6.943803113337964469736022094105143158033E1Q,
712*81418a27Smrg  1.775695341031607738233608307835017282662E1Q
713*81418a27Smrg  /* 1.0E0 */
714*81418a27Smrg };
715*81418a27Smrg 
716*81418a27Smrg /* erfc(1/x) = 1/x exp(-1/x^2 - 0.5625 + R(1/x^2))
717*81418a27Smrg    1/128 <= 1/x < 1/8
718*81418a27Smrg    Peak relative error 2.2e-36  */
719*81418a27Smrg #define NRNr1 9
720*81418a27Smrg static const __float128 RNr1[NRNr1 + 1] =
721*81418a27Smrg {
722*81418a27Smrg -4.250780883202361946697751475473042685782E-8Q,
723*81418a27Smrg -5.375777053288612282487696975623206383019E-6Q,
724*81418a27Smrg -2.573645949220896816208565944117382460452E-4Q,
725*81418a27Smrg -6.199032928113542080263152610799113086319E-3Q,
726*81418a27Smrg -8.262721198693404060380104048479916247786E-2Q,
727*81418a27Smrg -6.242615227257324746371284637695778043982E-1Q,
728*81418a27Smrg -2.609874739199595400225113299437099626386E0Q,
729*81418a27Smrg -5.581967563336676737146358534602770006970E0Q,
730*81418a27Smrg -5.124398923356022609707490956634280573882E0Q,
731*81418a27Smrg -1.290865243944292370661544030414667556649E0Q
732*81418a27Smrg };
733*81418a27Smrg #define NRDr1 8
734*81418a27Smrg static const __float128 RDr1[NRDr1 + 1] =
735*81418a27Smrg {
736*81418a27Smrg  4.308976661749509034845251315983612976224E-6Q,
737*81418a27Smrg  3.265390126432780184125233455960049294580E-4Q,
738*81418a27Smrg  9.811328839187040701901866531796570418691E-3Q,
739*81418a27Smrg  1.511222515036021033410078631914783519649E-1Q,
740*81418a27Smrg  1.289264341917429958858379585970225092274E0Q,
741*81418a27Smrg  6.147640356182230769548007536914983522270E0Q,
742*81418a27Smrg  1.573966871337739784518246317003956180750E1Q,
743*81418a27Smrg  1.955534123435095067199574045529218238263E1Q,
744*81418a27Smrg  9.472613121363135472247929109615785855865E0Q
745*81418a27Smrg   /* 1.0E0 */
746*81418a27Smrg };
747*81418a27Smrg 
748*81418a27Smrg 
749*81418a27Smrg __float128
erfq(__float128 x)750*81418a27Smrg erfq (__float128 x)
751*81418a27Smrg {
752*81418a27Smrg   __float128 a, y, z;
753*81418a27Smrg   int32_t i, ix, sign;
754*81418a27Smrg   ieee854_float128 u;
755*81418a27Smrg 
756*81418a27Smrg   u.value = x;
757*81418a27Smrg   sign = u.words32.w0;
758*81418a27Smrg   ix = sign & 0x7fffffff;
759*81418a27Smrg 
760*81418a27Smrg   if (ix >= 0x7fff0000)
761*81418a27Smrg     {				/* erf(nan)=nan */
762*81418a27Smrg       i = ((sign & 0xffff0000) >> 31) << 1;
763*81418a27Smrg       return (__float128) (1 - i) + one / x;	/* erf(+-inf)=+-1 */
764*81418a27Smrg     }
765*81418a27Smrg 
766*81418a27Smrg   if (ix >= 0x3fff0000) /* |x| >= 1.0 */
767*81418a27Smrg     {
768*81418a27Smrg       if (ix >= 0x40030000 && sign > 0)
769*81418a27Smrg 	return one; /* x >= 16, avoid spurious underflow from erfc.  */
770*81418a27Smrg       y = erfcq (x);
771*81418a27Smrg       return (one - y);
772*81418a27Smrg       /*    return (one - erfcq (x)); */
773*81418a27Smrg     }
774*81418a27Smrg   u.words32.w0 = ix;
775*81418a27Smrg   a = u.value;
776*81418a27Smrg   z = x * x;
777*81418a27Smrg   if (ix < 0x3ffec000)  /* a < 0.875 */
778*81418a27Smrg     {
779*81418a27Smrg       if (ix < 0x3fc60000) /* |x|<2**-57 */
780*81418a27Smrg 	{
781*81418a27Smrg 	  if (ix < 0x00080000)
782*81418a27Smrg 	    {
783*81418a27Smrg 	      /* Avoid spurious underflow.  */
784*81418a27Smrg 	      __float128 ret =  0.0625 * (16.0 * x + (16.0 * efx) * x);
785*81418a27Smrg 	      math_check_force_underflow (ret);
786*81418a27Smrg 	      return ret;
787*81418a27Smrg 	    }
788*81418a27Smrg 	  return x + efx * x;
789*81418a27Smrg 	}
790*81418a27Smrg       y = a + a * neval (z, TN1, NTN1) / deval (z, TD1, NTD1);
791*81418a27Smrg     }
792*81418a27Smrg   else
793*81418a27Smrg     {
794*81418a27Smrg       a = a - one;
795*81418a27Smrg       y = erf_const + neval (a, TN2, NTN2) / deval (a, TD2, NTD2);
796*81418a27Smrg     }
797*81418a27Smrg 
798*81418a27Smrg   if (sign & 0x80000000) /* x < 0 */
799*81418a27Smrg     y = -y;
800*81418a27Smrg   return( y );
801*81418a27Smrg }
802*81418a27Smrg 
803*81418a27Smrg 
804*81418a27Smrg __float128
erfcq(__float128 x)805*81418a27Smrg erfcq (__float128 x)
806*81418a27Smrg {
807*81418a27Smrg   __float128 y, z, p, r;
808*81418a27Smrg   int32_t i, ix, sign;
809*81418a27Smrg   ieee854_float128 u;
810*81418a27Smrg 
811*81418a27Smrg   u.value = x;
812*81418a27Smrg   sign = u.words32.w0;
813*81418a27Smrg   ix = sign & 0x7fffffff;
814*81418a27Smrg   u.words32.w0 = ix;
815*81418a27Smrg 
816*81418a27Smrg   if (ix >= 0x7fff0000)
817*81418a27Smrg     {				/* erfc(nan)=nan */
818*81418a27Smrg       /* erfc(+-inf)=0,2 */
819*81418a27Smrg       return (__float128) (((uint32_t) sign >> 31) << 1) + one / x;
820*81418a27Smrg     }
821*81418a27Smrg 
822*81418a27Smrg   if (ix < 0x3ffd0000) /* |x| <1/4 */
823*81418a27Smrg     {
824*81418a27Smrg       if (ix < 0x3f8d0000) /* |x|<2**-114 */
825*81418a27Smrg 	return one - x;
826*81418a27Smrg       return one - erfq (x);
827*81418a27Smrg     }
828*81418a27Smrg   if (ix < 0x3fff4000) /* 1.25 */
829*81418a27Smrg     {
830*81418a27Smrg       x = u.value;
831*81418a27Smrg       i = 8.0 * x;
832*81418a27Smrg       switch (i)
833*81418a27Smrg 	{
834*81418a27Smrg 	case 2:
835*81418a27Smrg 	  z = x - 0.25Q;
836*81418a27Smrg 	  y = C13b + z * neval (z, RNr13, NRNr13) / deval (z, RDr13, NRDr13);
837*81418a27Smrg 	  y += C13a;
838*81418a27Smrg 	  break;
839*81418a27Smrg 	case 3:
840*81418a27Smrg 	  z = x - 0.375Q;
841*81418a27Smrg 	  y = C14b + z * neval (z, RNr14, NRNr14) / deval (z, RDr14, NRDr14);
842*81418a27Smrg 	  y += C14a;
843*81418a27Smrg 	  break;
844*81418a27Smrg 	case 4:
845*81418a27Smrg 	  z = x - 0.5Q;
846*81418a27Smrg 	  y = C15b + z * neval (z, RNr15, NRNr15) / deval (z, RDr15, NRDr15);
847*81418a27Smrg 	  y += C15a;
848*81418a27Smrg 	  break;
849*81418a27Smrg 	case 5:
850*81418a27Smrg 	  z = x - 0.625Q;
851*81418a27Smrg 	  y = C16b + z * neval (z, RNr16, NRNr16) / deval (z, RDr16, NRDr16);
852*81418a27Smrg 	  y += C16a;
853*81418a27Smrg 	  break;
854*81418a27Smrg 	case 6:
855*81418a27Smrg 	  z = x - 0.75Q;
856*81418a27Smrg 	  y = C17b + z * neval (z, RNr17, NRNr17) / deval (z, RDr17, NRDr17);
857*81418a27Smrg 	  y += C17a;
858*81418a27Smrg 	  break;
859*81418a27Smrg 	case 7:
860*81418a27Smrg 	  z = x - 0.875Q;
861*81418a27Smrg 	  y = C18b + z * neval (z, RNr18, NRNr18) / deval (z, RDr18, NRDr18);
862*81418a27Smrg 	  y += C18a;
863*81418a27Smrg 	  break;
864*81418a27Smrg 	case 8:
865*81418a27Smrg 	  z = x - 1;
866*81418a27Smrg 	  y = C19b + z * neval (z, RNr19, NRNr19) / deval (z, RDr19, NRDr19);
867*81418a27Smrg 	  y += C19a;
868*81418a27Smrg 	  break;
869*81418a27Smrg 	default: /* i == 9.  */
870*81418a27Smrg 	  z = x - 1.125Q;
871*81418a27Smrg 	  y = C20b + z * neval (z, RNr20, NRNr20) / deval (z, RDr20, NRDr20);
872*81418a27Smrg 	  y += C20a;
873*81418a27Smrg 	  break;
874*81418a27Smrg 	}
875*81418a27Smrg       if (sign & 0x80000000)
876*81418a27Smrg 	y = 2 - y;
877*81418a27Smrg       return y;
878*81418a27Smrg     }
879*81418a27Smrg   /* 1.25 < |x| < 107 */
880*81418a27Smrg   if (ix < 0x4005ac00)
881*81418a27Smrg     {
882*81418a27Smrg       /* x < -9 */
883*81418a27Smrg       if ((ix >= 0x40022000) && (sign & 0x80000000))
884*81418a27Smrg 	return two - tiny;
885*81418a27Smrg 
886*81418a27Smrg       x = fabsq (x);
887*81418a27Smrg       z = one / (x * x);
888*81418a27Smrg       i = 8.0 / x;
889*81418a27Smrg       switch (i)
890*81418a27Smrg 	{
891*81418a27Smrg 	default:
892*81418a27Smrg 	case 0:
893*81418a27Smrg 	  p = neval (z, RNr1, NRNr1) / deval (z, RDr1, NRDr1);
894*81418a27Smrg 	  break;
895*81418a27Smrg 	case 1:
896*81418a27Smrg 	  p = neval (z, RNr2, NRNr2) / deval (z, RDr2, NRDr2);
897*81418a27Smrg 	  break;
898*81418a27Smrg 	case 2:
899*81418a27Smrg 	  p = neval (z, RNr3, NRNr3) / deval (z, RDr3, NRDr3);
900*81418a27Smrg 	  break;
901*81418a27Smrg 	case 3:
902*81418a27Smrg 	  p = neval (z, RNr4, NRNr4) / deval (z, RDr4, NRDr4);
903*81418a27Smrg 	  break;
904*81418a27Smrg 	case 4:
905*81418a27Smrg 	  p = neval (z, RNr5, NRNr5) / deval (z, RDr5, NRDr5);
906*81418a27Smrg 	  break;
907*81418a27Smrg 	case 5:
908*81418a27Smrg 	  p = neval (z, RNr6, NRNr6) / deval (z, RDr6, NRDr6);
909*81418a27Smrg 	  break;
910*81418a27Smrg 	case 6:
911*81418a27Smrg 	  p = neval (z, RNr7, NRNr7) / deval (z, RDr7, NRDr7);
912*81418a27Smrg 	  break;
913*81418a27Smrg 	case 7:
914*81418a27Smrg 	  p = neval (z, RNr8, NRNr8) / deval (z, RDr8, NRDr8);
915*81418a27Smrg 	  break;
916*81418a27Smrg 	}
917*81418a27Smrg       u.value = x;
918*81418a27Smrg       u.words32.w3 = 0;
919*81418a27Smrg       u.words32.w2 &= 0xfe000000;
920*81418a27Smrg       z = u.value;
921*81418a27Smrg       r = expq (-z * z - 0.5625) *
922*81418a27Smrg 	expq ((z - x) * (z + x) + p);
923*81418a27Smrg       if ((sign & 0x80000000) == 0)
924*81418a27Smrg 	{
925*81418a27Smrg 	  __float128 ret = r / x;
926*81418a27Smrg 	  if (ret == 0)
927*81418a27Smrg 	    errno = ERANGE;
928*81418a27Smrg 	  return ret;
929*81418a27Smrg 	}
930*81418a27Smrg       else
931*81418a27Smrg 	return two - r / x;
932*81418a27Smrg     }
933*81418a27Smrg   else
934*81418a27Smrg     {
935*81418a27Smrg       if ((sign & 0x80000000) == 0)
936*81418a27Smrg 	{
937*81418a27Smrg 	  errno = ERANGE;
938*81418a27Smrg 	  return tiny * tiny;
939*81418a27Smrg 	}
940*81418a27Smrg       else
941*81418a27Smrg 	return two - tiny;
942*81418a27Smrg     }
943*81418a27Smrg }
944