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