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