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
108static _Float128
109neval (_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
126static _Float128
127deval (_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
143static const _Float128
144tiny = 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
155static 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
168static 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 */
186static const _Float128 erf_const = L(0.845062911510467529296875);
187#define NTN2 8
188static 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
201static 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
220static 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
233static 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. */
246static const _Float128 C13a = L(0.723663330078125);
247static 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
254static 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
267static 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. */
280static const _Float128 C14a = L(0.5958709716796875);
281static 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
287static 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
300static 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. */
313static const _Float128 C15a = L(0.4794921875);
314static 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
320static 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
333static 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. */
346static const _Float128 C16a = L(0.3767547607421875);
347static 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
353static 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
366static 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. */
379static const _Float128 C17a = L(0.2888336181640625);
380static 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
387static 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
400static 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. */
413static const _Float128 C18a = L(0.215911865234375);
414static 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
420static 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
433static 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. */
446static const _Float128 C19a = L(0.15728759765625);
447static 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
453static 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
466static 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. */
479static const _Float128 C20a = L(0.111602783203125);
480static 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
486static 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
500static 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
518static 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
532static const _Float128 RDr7[NRDr7 + 1] =
533{
534L(-1.709305024718358874701575813642933561169E3),
535L(-3.280033887481333199580464617020514788369E4),
536L(-2.345284228022521885093072363418750835214E5),
537L(-8.086758123097763971926711729242327554917E5),
538L(-1.456900414510108718402423999575992450138E6),
539L(-1.391654264881255068392389037292702041855E6),
540L(-6.842360801869939983674527468509852583855E5),
541L(-1.597430214446573566179675395199807533371E5),
542L(-1.488876130609876681421645314851760773480E4),
543L(-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
551static 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
565static const _Float128 RDr6[NRDr6 + 1] =
566{
567L(-1.664557643928263091879301304019826629067E2),
568L(-3.800035902507656624590531122291160668452E3),
569L(-3.277028191591734928360050685359277076056E4),
570L(-1.381359471502885446400589109566587443987E5),
571L(-3.082204287382581873532528989283748656546E5),
572L(-3.691071488256738343008271448234631037095E5),
573L(-2.300482443038349815750714219117566715043E5),
574L(-6.873955300927636236692803579555752171530E4),
575L(-8.262158817978334142081581542749986845399E3),
576L(-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
584static const _Float128 RNr5[NRNr5 + 1] =
585{
586L(-3.332258927455285458355550878136506961608E-3),
587L(-2.697100758900280402659586595884478660721E-1),
588L(-6.083328551139621521416618424949137195536E0),
589L(-6.119863528983308012970821226810162441263E1),
590L(-3.176535282475593173248810678636522589861E2),
591L(-8.933395175080560925809992467187963260693E2),
592L(-1.360019508488475978060917477620199499560E3),
593L(-1.075075579828188621541398761300910213280E3),
594L(-4.017346561586014822824459436695197089916E2),
595L(-5.857581368145266249509589726077645791341E1),
596L(-2.077715925587834606379119585995758954399E0)
597};
598#define NRDr5 9
599static 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
618static 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
633static const _Float128 RDr4[NRDr4 + 1] =
634{
635L(-3.303141981514540274165450687270180479586E-1),
636L(-1.353768629363605300707949368917687066724E1),
637L(-2.206127630303621521950193783894598987033E2),
638L(-1.861800338758066696514480386180875607204E3),
639L(-8.889048775872605708249140016201753255599E3),
640L(-2.465888106627948210478692168261494857089E4),
641L(-3.934642211710774494879042116768390014289E4),
642L(-3.455077258242252974937480623730228841003E4),
643L(-1.524083977439690284820586063729912653196E4),
644L(-2.810541887397984804237552337349093953857E3),
645L(-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
653static const _Float128 RNr3[NRNr3 + 1] =
654{
655L(-1.952401126551202208698629992497306292987E-6),
656L(-2.130881743066372952515162564941682716125E-4),
657L(-8.376493958090190943737529486107282224387E-3),
658L(-1.650592646560987700661598877522831234791E-1),
659L(-1.839290818933317338111364667708678163199E0),
660L(-1.216278715570882422410442318517814388470E1),
661L(-4.818759344462360427612133632533779091386E1),
662L(-1.120994661297476876804405329172164436784E2),
663L(-1.452850765662319264191141091859300126931E2),
664L(-9.485207851128957108648038238656777241333E1),
665L(-2.563663855025796641216191848818620020073E1),
666L(-1.787995944187565676837847610706317833247E0)
667};
668#define NRDr3 10
669static 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
689static const _Float128 RNr2[NRNr2 + 1] =
690{
691L(-2.638914383420287212401687401284326363787E-8),
692L(-3.479198370260633977258201271399116766619E-6),
693L(-1.783985295335697686382487087502222519983E-4),
694L(-4.777876933122576014266349277217559356276E-3),
695L(-7.450634738987325004070761301045014986520E-2),
696L(-7.068318854874733315971973707247467326619E-1),
697L(-4.113919921935944795764071670806867038732E0),
698L(-1.440447573226906222417767283691888875082E1),
699L(-2.883484031530718428417168042141288943905E1),
700L(-2.990886974328476387277797361464279931446E1),
701L(-1.325283914915104866248279787536128997331E1),
702L(-1.572436106228070195510230310658206154374E0)
703};
704#define NRDr2 10
705static 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
725static const _Float128 RNr1[NRNr1 + 1] =
726{
727L(-4.250780883202361946697751475473042685782E-8),
728L(-5.375777053288612282487696975623206383019E-6),
729L(-2.573645949220896816208565944117382460452E-4),
730L(-6.199032928113542080263152610799113086319E-3),
731L(-8.262721198693404060380104048479916247786E-2),
732L(-6.242615227257324746371284637695778043982E-1),
733L(-2.609874739199595400225113299437099626386E0),
734L(-5.581967563336676737146358534602770006970E0),
735L(-5.124398923356022609707490956634280573882E0),
736L(-1.290865243944292370661544030414667556649E0)
737};
738#define NRDr1 8
739static 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
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
808libm_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
950libm_alias_ldouble (__erfc, erfc)
951

source code of glibc/sysdeps/ieee754/ldbl-128/s_erfl.c