2 * ====================================================
3 * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
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
9 * ====================================================
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
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.
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.
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 */
33 /* double erf(double x)
34 * double erfc(double x)
37 * erf(x) = --------- | exp(-t*t)dt
44 * erfc(-x) = 2 - erfc(x)
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 + ....)
51 * 2/sqrt(pi) = 1.128379167095512573896158903121545171688
54 * 1a. erf(x) = 1 - erfc(x), for |x| > 1.0
55 * erfc(x) = 1 - erf(x) if |x| < 1/4
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]
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
70 * 4. For x in [5/4, 107],
71 * erfc(x) = (1/x)*exp(-x*x-0.5625 + R(z))
73 * The interval is partitioned into several segments
74 * of width 1/8 in 1/x.
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);
83 * Here 4 and 5 make use of the asymptotic series
85 * erfc(x) ~ ---------- * ( 1 + Poly(1/x^2) )
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
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
100 #include "math_private.h"
101 #include <math_ldbl_opt.h>
103 /* Evaluate P[n] x^n + P[n-1] x^(n-1) + ... + P[0] */
106 neval (long double x
, const long double *p
, int n
)
121 /* Evaluate x^n+1 + P[n] x^(n) + P[n-1] x^(n-1) + ... + P[0] */
124 deval (long double x
, const long double *p
, int n
)
141 static const long double
150 efx
= 1.2837916709551257389615890312154517168810E-1L,
151 /* 8 * (2/sqrt(pi) - 1) */
152 efx8
= 1.0270333367641005911692712249723613735048E0L
;
155 /* erf(x) = x + x R(x^2)
157 Peak relative error 1.8e-35 */
159 static const long double TN1
[NTN1
+ 1] =
161 -3.858252324254637124543172907442106422373E10L
,
162 9.580319248590464682316366876952214879858E10L
,
163 1.302170519734879977595901236693040544854E10L
,
164 2.922956950426397417800321486727032845006E9L
,
165 1.764317520783319397868923218385468729799E8L
,
166 1.573436014601118630105796794840834145120E7L
,
167 4.028077380105721388745632295157816229289E5L
,
168 1.644056806467289066852135096352853491530E4L
,
169 3.390868480059991640235675479463287886081E1L
172 static const long double TD1
[NTD1
+ 1] =
174 -3.005357030696532927149885530689529032152E11L
,
175 -1.342602283126282827411658673839982164042E11L
,
176 -2.777153893355340961288511024443668743399E10L
,
177 -3.483826391033531996955620074072768276974E9L
,
178 -2.906321047071299585682722511260895227921E8L
,
179 -1.653347985722154162439387878512427542691E7L
,
180 -6.245520581562848778466500301865173123136E5L
,
181 -1.402124304177498828590239373389110545142E4L
,
182 -1.209368072473510674493129989468348633579E2L
187 /* erf(z+1) = erf_const + P(z)/Q(z)
189 Peak relative error 7.3e-36 */
190 static const long double erf_const
= 0.845062911510467529296875L;
192 static const long double TN2
[NTN2
+ 1] =
194 -4.088889697077485301010486931817357000235E1L
,
195 7.157046430681808553842307502826960051036E3L
,
196 -2.191561912574409865550015485451373731780E3L
,
197 2.180174916555316874988981177654057337219E3L
,
198 2.848578658049670668231333682379720943455E2L
,
199 1.630362490952512836762810462174798925274E2L
,
200 6.317712353961866974143739396865293596895E0L
,
201 2.450441034183492434655586496522857578066E1L
,
202 5.127662277706787664956025545897050896203E-1L
205 static const long double TD2
[NTD2
+ 1] =
207 1.731026445926834008273768924015161048885E4L
,
208 1.209682239007990370796112604286048173750E4L
,
209 1.160950290217993641320602282462976163857E4L
,
210 5.394294645127126577825507169061355698157E3L
,
211 2.791239340533632669442158497532521776093E3L
,
212 8.989365571337319032943005387378993827684E2L
,
213 2.974016493766349409725385710897298069677E2L
,
214 6.148192754590376378740261072533527271947E1L
,
215 1.178502892490738445655468927408440847480E1L
220 /* erfc(x + 0.25) = erfc(0.25) + x R(x)
222 Peak relative error 1.4e-35 */
224 static const long double RNr13
[NRNr13
+ 1] =
226 -2.353707097641280550282633036456457014829E3L
,
227 3.871159656228743599994116143079870279866E2L
,
228 -3.888105134258266192210485617504098426679E2L
,
229 -2.129998539120061668038806696199343094971E1L
,
230 -8.125462263594034672468446317145384108734E1L
,
231 8.151549093983505810118308635926270319660E0L
,
232 -5.033362032729207310462422357772568553670E0L
,
233 -4.253956621135136090295893547735851168471E-2L,
234 -8.098602878463854789780108161581050357814E-2L
237 static const long double RDr13
[NRDr13
+ 1] =
239 2.220448796306693503549505450626652881752E3L
,
240 1.899133258779578688791041599040951431383E2L
,
241 1.061906712284961110196427571557149268454E3L
,
242 7.497086072306967965180978101974566760042E1L
,
243 2.146796115662672795876463568170441327274E2L
,
244 1.120156008362573736664338015952284925592E1L
,
245 2.211014952075052616409845051695042741074E1L
,
246 6.469655675326150785692908453094054988938E-1L
249 /* erfc(0.25) = C13a + C13b to extra precision. */
250 static const long double C13a
= 0.723663330078125L;
251 static const long double C13b
= 1.0279753638067014931732235184287934646022E-5L;
254 /* erfc(x + 0.375) = erfc(0.375) + x R(x)
256 Peak relative error 1.2e-35 */
258 static const long double RNr14
[NRNr14
+ 1] =
260 -2.446164016404426277577283038988918202456E3L
,
261 6.718753324496563913392217011618096698140E2L
,
262 -4.581631138049836157425391886957389240794E2L
,
263 -2.382844088987092233033215402335026078208E1L
,
264 -7.119237852400600507927038680970936336458E1L
,
265 1.313609646108420136332418282286454287146E1L
,
266 -6.188608702082264389155862490056401365834E0L
,
267 -2.787116601106678287277373011101132659279E-2L,
268 -2.230395570574153963203348263549700967918E-2L
271 static const long double RDr14
[NRDr14
+ 1] =
273 2.495187439241869732696223349840963702875E3L
,
274 2.503549449872925580011284635695738412162E2L
,
275 1.159033560988895481698051531263861842461E3L
,
276 9.493751466542304491261487998684383688622E1L
,
277 2.276214929562354328261422263078480321204E2L
,
278 1.367697521219069280358984081407807931847E1L
,
279 2.276988395995528495055594829206582732682E1L
,
280 7.647745753648996559837591812375456641163E-1L
283 /* erfc(0.375) = C14a + C14b to extra precision. */
284 static const long double C14a
= 0.5958709716796875L;
285 static const long double C14b
= 1.2118885490201676174914080878232469565953E-5L;
287 /* erfc(x + 0.5) = erfc(0.5) + x R(x)
289 Peak relative error 4.7e-36 */
291 static const long double RNr15
[NRNr15
+ 1] =
293 -2.624212418011181487924855581955853461925E3L
,
294 8.473828904647825181073831556439301342756E2L
,
295 -5.286207458628380765099405359607331669027E2L
,
296 -3.895781234155315729088407259045269652318E1L
,
297 -6.200857908065163618041240848728398496256E1L
,
298 1.469324610346924001393137895116129204737E1L
,
299 -6.961356525370658572800674953305625578903E0L
,
300 5.145724386641163809595512876629030548495E-3L,
301 1.990253655948179713415957791776180406812E-2L
304 static const long double RDr15
[NRDr15
+ 1] =
306 2.986190760847974943034021764693341524962E3L
,
307 5.288262758961073066335410218650047725985E2L
,
308 1.363649178071006978355113026427856008978E3L
,
309 1.921707975649915894241864988942255320833E2L
,
310 2.588651100651029023069013885900085533226E2L
,
311 2.628752920321455606558942309396855629459E1L
,
312 2.455649035885114308978333741080991380610E1L
,
313 1.378826653595128464383127836412100939126E0L
316 /* erfc(0.5) = C15a + C15b to extra precision. */
317 static const long double C15a
= 0.4794921875L;
318 static const long double C15b
= 7.9346869534623172533461080354712635484242E-6L;
320 /* erfc(x + 0.625) = erfc(0.625) + x R(x)
322 Peak relative error 5.1e-36 */
324 static const long double RNr16
[NRNr16
+ 1] =
326 -2.347887943200680563784690094002722906820E3L
,
327 8.008590660692105004780722726421020136482E2L
,
328 -5.257363310384119728760181252132311447963E2L
,
329 -4.471737717857801230450290232600243795637E1L
,
330 -4.849540386452573306708795324759300320304E1L
,
331 1.140885264677134679275986782978655952843E1L
,
332 -6.731591085460269447926746876983786152300E0L
,
333 1.370831653033047440345050025876085121231E-1L,
334 2.022958279982138755020825717073966576670E-2L,
337 static const long double RDr16
[NRDr16
+ 1] =
339 3.075166170024837215399323264868308087281E3L
,
340 8.730468942160798031608053127270430036627E2L
,
341 1.458472799166340479742581949088453244767E3L
,
342 3.230423687568019709453130785873540386217E2L
,
343 2.804009872719893612081109617983169474655E2L
,
344 4.465334221323222943418085830026979293091E1L
,
345 2.612723259683205928103787842214809134746E1L
,
346 2.341526751185244109722204018543276124997E0L
,
349 /* erfc(0.625) = C16a + C16b to extra precision. */
350 static const long double C16a
= 0.3767547607421875L;
351 static const long double C16b
= 4.3570693945275513594941232097252997287766E-6L;
353 /* erfc(x + 0.75) = erfc(0.75) + x R(x)
355 Peak relative error 1.7e-35 */
357 static const long double RNr17
[NRNr17
+ 1] =
359 -1.767068734220277728233364375724380366826E3L
,
360 6.693746645665242832426891888805363898707E2L
,
361 -4.746224241837275958126060307406616817753E2L
,
362 -2.274160637728782675145666064841883803196E1L
,
363 -3.541232266140939050094370552538987982637E1L
,
364 6.988950514747052676394491563585179503865E0L
,
365 -5.807687216836540830881352383529281215100E0L
,
366 3.631915988567346438830283503729569443642E-1L,
367 -1.488945487149634820537348176770282391202E-2L
370 static const long double RDr17
[NRDr17
+ 1] =
372 2.748457523498150741964464942246913394647E3L
,
373 1.020213390713477686776037331757871252652E3L
,
374 1.388857635935432621972601695296561952738E3L
,
375 3.903363681143817750895999579637315491087E2L
,
376 2.784568344378139499217928969529219886578E2L
,
377 5.555800830216764702779238020065345401144E1L
,
378 2.646215470959050279430447295801291168941E1L
,
379 2.984905282103517497081766758550112011265E0L
,
382 /* erfc(0.75) = C17a + C17b to extra precision. */
383 static const long double C17a
= 0.2888336181640625L;
384 static const long double C17b
= 1.0748182422368401062165408589222625794046E-5L;
387 /* erfc(x + 0.875) = erfc(0.875) + x R(x)
389 Peak relative error 2.2e-35 */
391 static const long double RNr18
[NRNr18
+ 1] =
393 -1.342044899087593397419622771847219619588E3L
,
394 6.127221294229172997509252330961641850598E2L
,
395 -4.519821356522291185621206350470820610727E2L
,
396 1.223275177825128732497510264197915160235E1L
,
397 -2.730789571382971355625020710543532867692E1L
,
398 4.045181204921538886880171727755445395862E0L
,
399 -4.925146477876592723401384464691452700539E0L
,
400 5.933878036611279244654299924101068088582E-1L,
401 -5.557645435858916025452563379795159124753E-2L
404 static const long double RDr18
[NRDr18
+ 1] =
406 2.557518000661700588758505116291983092951E3L
,
407 1.070171433382888994954602511991940418588E3L
,
408 1.344842834423493081054489613250688918709E3L
,
409 4.161144478449381901208660598266288188426E2L
,
410 2.763670252219855198052378138756906980422E2L
,
411 5.998153487868943708236273854747564557632E1L
,
412 2.657695108438628847733050476209037025318E1L
,
413 3.252140524394421868923289114410336976512E0L
,
416 /* erfc(0.875) = C18a + C18b to extra precision. */
417 static const long double C18a
= 0.215911865234375L;
418 static const long double C18b
= 1.3073705765341685464282101150637224028267E-5L;
420 /* erfc(x + 1.0) = erfc(1.0) + x R(x)
422 Peak relative error 1.6e-35 */
424 static const long double RNr19
[NRNr19
+ 1] =
426 -1.139180936454157193495882956565663294826E3L
,
427 6.134903129086899737514712477207945973616E2L
,
428 -4.628909024715329562325555164720732868263E2L
,
429 4.165702387210732352564932347500364010833E1L
,
430 -2.286979913515229747204101330405771801610E1L
,
431 1.870695256449872743066783202326943667722E0L
,
432 -4.177486601273105752879868187237000032364E0L
,
433 7.533980372789646140112424811291782526263E-1L,
434 -8.629945436917752003058064731308767664446E-2L
437 static const long double RDr19
[NRDr19
+ 1] =
439 2.744303447981132701432716278363418643778E3L
,
440 1.266396359526187065222528050591302171471E3L
,
441 1.466739461422073351497972255511919814273E3L
,
442 4.868710570759693955597496520298058147162E2L
,
443 2.993694301559756046478189634131722579643E2L
,
444 6.868976819510254139741559102693828237440E1L
,
445 2.801505816247677193480190483913753613630E1L
,
446 3.604439909194350263552750347742663954481E0L
,
449 /* erfc(1.0) = C19a + C19b to extra precision. */
450 static const long double C19a
= 0.15728759765625L;
451 static const long double C19b
= 1.1609394035130658779364917390740703933002E-5L;
453 /* erfc(x + 1.125) = erfc(1.125) + x R(x)
455 Peak relative error 3.6e-36 */
457 static const long double RNr20
[NRNr20
+ 1] =
459 -9.652706916457973956366721379612508047640E2L
,
460 5.577066396050932776683469951773643880634E2L
,
461 -4.406335508848496713572223098693575485978E2L
,
462 5.202893466490242733570232680736966655434E1L
,
463 -1.931311847665757913322495948705563937159E1L
,
464 -9.364318268748287664267341457164918090611E-2L,
465 -3.306390351286352764891355375882586201069E0L
,
466 7.573806045289044647727613003096916516475E-1L,
467 -9.611744011489092894027478899545635991213E-2L
470 static const long double RDr20
[NRDr20
+ 1] =
472 3.032829629520142564106649167182428189014E3L
,
473 1.659648470721967719961167083684972196891E3L
,
474 1.703545128657284619402511356932569292535E3L
,
475 6.393465677731598872500200253155257708763E2L
,
476 3.489131397281030947405287112726059221934E2L
,
477 8.848641738570783406484348434387611713070E1L
,
478 3.132269062552392974833215844236160958502E1L
,
479 4.430131663290563523933419966185230513168E0L
482 /* erfc(1.125) = C20a + C20b to extra precision. */
483 static const long double C20a
= 0.111602783203125L;
484 static const long double C20b
= 8.9850951672359304215530728365232161564636E-6L;
486 /* erfc(1/x) = 1/x exp (-1/x^2 - 0.5625 + R(1/x^2))
488 Peak relative error 1.4e-35 */
490 static const long double RNr8
[NRNr8
+ 1] =
492 3.587451489255356250759834295199296936784E1L
,
493 5.406249749087340431871378009874875889602E2L
,
494 2.931301290625250886238822286506381194157E3L
,
495 7.359254185241795584113047248898753470923E3L
,
496 9.201031849810636104112101947312492532314E3L
,
497 5.749697096193191467751650366613289284777E3L
,
498 1.710415234419860825710780802678697889231E3L
,
499 2.150753982543378580859546706243022719599E2L
,
500 8.740953582272147335100537849981160931197E0L
,
501 4.876422978828717219629814794707963640913E-2L
504 static const long double RDr8
[NRDr8
+ 1] =
506 6.358593134096908350929496535931630140282E1L
,
507 9.900253816552450073757174323424051765523E2L
,
508 5.642928777856801020545245437089490805186E3L
,
509 1.524195375199570868195152698617273739609E4L
,
510 2.113829644500006749947332935305800887345E4L
,
511 1.526438562626465706267943737310282977138E4L
,
512 5.561370922149241457131421914140039411782E3L
,
513 9.394035530179705051609070428036834496942E2L
,
514 6.147019596150394577984175188032707343615E1L
518 /* erfc(1/x) = 1/x exp (-1/x^2 - 0.5625 + R(1/x^2))
520 Peak relative error 2.0e-36 */
522 static const long double RNr7
[NRNr7
+ 1] =
524 1.686222193385987690785945787708644476545E1L
,
525 1.178224543567604215602418571310612066594E3L
,
526 1.764550584290149466653899886088166091093E4L
,
527 1.073758321890334822002849369898232811561E5L
,
528 3.132840749205943137619839114451290324371E5L
,
529 4.607864939974100224615527007793867585915E5L
,
530 3.389781820105852303125270837910972384510E5L
,
531 1.174042187110565202875011358512564753399E5L
,
532 1.660013606011167144046604892622504338313E4L
,
533 6.700393957480661937695573729183733234400E2L
536 static const long double RDr7
[NRDr7
+ 1] =
538 -1.709305024718358874701575813642933561169E3L
,
539 -3.280033887481333199580464617020514788369E4L
,
540 -2.345284228022521885093072363418750835214E5L
,
541 -8.086758123097763971926711729242327554917E5L
,
542 -1.456900414510108718402423999575992450138E6L
,
543 -1.391654264881255068392389037292702041855E6L
,
544 -6.842360801869939983674527468509852583855E5L
,
545 -1.597430214446573566179675395199807533371E5L
,
546 -1.488876130609876681421645314851760773480E4L
,
547 -3.511762950935060301403599443436465645703E2L
551 /* erfc(1/x) = 1/x exp(-1/x^2 - 0.5625 + R(1/x^2))
553 Peak relative error 1.9e-35 */
555 static const long double RNr6
[NRNr6
+ 1] =
557 1.642076876176834390623842732352935761108E0L
,
558 1.207150003611117689000664385596211076662E2L
,
559 2.119260779316389904742873816462800103939E3L
,
560 1.562942227734663441801452930916044224174E4L
,
561 5.656779189549710079988084081145693580479E4L
,
562 1.052166241021481691922831746350942786299E5L
,
563 9.949798524786000595621602790068349165758E4L
,
564 4.491790734080265043407035220188849562856E4L
,
565 8.377074098301530326270432059434791287601E3L
,
566 4.506934806567986810091824791963991057083E2L
569 static const long double RDr6
[NRDr6
+ 1] =
571 -1.664557643928263091879301304019826629067E2L
,
572 -3.800035902507656624590531122291160668452E3L
,
573 -3.277028191591734928360050685359277076056E4L
,
574 -1.381359471502885446400589109566587443987E5L
,
575 -3.082204287382581873532528989283748656546E5L
,
576 -3.691071488256738343008271448234631037095E5L
,
577 -2.300482443038349815750714219117566715043E5L
,
578 -6.873955300927636236692803579555752171530E4L
,
579 -8.262158817978334142081581542749986845399E3L
,
580 -2.517122254384430859629423488157361983661E2L
584 /* erfc(1/x) = 1/x exp(-1/x^2 - 0.5625 + R(1/x^2))
586 Peak relative error 4.6e-36 */
588 static const long double RNr5
[NRNr5
+ 1] =
590 -3.332258927455285458355550878136506961608E-3L,
591 -2.697100758900280402659586595884478660721E-1L,
592 -6.083328551139621521416618424949137195536E0L
,
593 -6.119863528983308012970821226810162441263E1L
,
594 -3.176535282475593173248810678636522589861E2L
,
595 -8.933395175080560925809992467187963260693E2L
,
596 -1.360019508488475978060917477620199499560E3L
,
597 -1.075075579828188621541398761300910213280E3L
,
598 -4.017346561586014822824459436695197089916E2L
,
599 -5.857581368145266249509589726077645791341E1L
,
600 -2.077715925587834606379119585995758954399E0L
603 static const long double RDr5
[NRDr5
+ 1] =
605 3.377879570417399341550710467744693125385E-1L,
606 1.021963322742390735430008860602594456187E1L
,
607 1.200847646592942095192766255154827011939E2L
,
608 7.118915528142927104078182863387116942836E2L
,
609 2.318159380062066469386544552429625026238E3L
,
610 4.238729853534009221025582008928765281620E3L
,
611 4.279114907284825886266493994833515580782E3L
,
612 2.257277186663261531053293222591851737504E3L
,
613 5.570475501285054293371908382916063822957E2L
,
614 5.142189243856288981145786492585432443560E1L
618 /* erfc(1/x) = 1/x exp(-1/x^2 - 0.5625 + R(1/x^2))
620 Peak relative error 2.0e-36 */
622 static const long double RNr4
[NRNr4
+ 1] =
624 3.258530712024527835089319075288494524465E-3L,
625 2.987056016877277929720231688689431056567E-1L,
626 8.738729089340199750734409156830371528862E0L
,
627 1.207211160148647782396337792426311125923E2L
,
628 8.997558632489032902250523945248208224445E2L
,
629 3.798025197699757225978410230530640879762E3L
,
630 9.113203668683080975637043118209210146846E3L
,
631 1.203285891339933238608683715194034900149E4L
,
632 8.100647057919140328536743641735339740855E3L
,
633 2.383888249907144945837976899822927411769E3L
,
634 2.127493573166454249221983582495245662319E2L
637 static const long double RDr4
[NRDr4
+ 1] =
639 -3.303141981514540274165450687270180479586E-1L,
640 -1.353768629363605300707949368917687066724E1L
,
641 -2.206127630303621521950193783894598987033E2L
,
642 -1.861800338758066696514480386180875607204E3L
,
643 -8.889048775872605708249140016201753255599E3L
,
644 -2.465888106627948210478692168261494857089E4L
,
645 -3.934642211710774494879042116768390014289E4L
,
646 -3.455077258242252974937480623730228841003E4L
,
647 -1.524083977439690284820586063729912653196E4L
,
648 -2.810541887397984804237552337349093953857E3L
,
649 -1.343929553541159933824901621702567066156E2L
653 /* erfc(1/x) = 1/x exp(-1/x^2 - 0.5625 + R(1/x^2))
655 Peak relative error 8.4e-37 */
657 static const long double RNr3
[NRNr3
+ 1] =
659 -1.952401126551202208698629992497306292987E-6L,
660 -2.130881743066372952515162564941682716125E-4L,
661 -8.376493958090190943737529486107282224387E-3L,
662 -1.650592646560987700661598877522831234791E-1L,
663 -1.839290818933317338111364667708678163199E0L
,
664 -1.216278715570882422410442318517814388470E1L
,
665 -4.818759344462360427612133632533779091386E1L
,
666 -1.120994661297476876804405329172164436784E2L
,
667 -1.452850765662319264191141091859300126931E2L
,
668 -9.485207851128957108648038238656777241333E1L
,
669 -2.563663855025796641216191848818620020073E1L
,
670 -1.787995944187565676837847610706317833247E0L
673 static const long double RDr3
[NRDr3
+ 1] =
675 1.979130686770349481460559711878399476903E-4L,
676 1.156941716128488266238105813374635099057E-2L,
677 2.752657634309886336431266395637285974292E-1L,
678 3.482245457248318787349778336603569327521E0L
,
679 2.569347069372696358578399521203959253162E1L
,
680 1.142279000180457419740314694631879921561E2L
,
681 3.056503977190564294341422623108332700840E2L
,
682 4.780844020923794821656358157128719184422E2L
,
683 4.105972727212554277496256802312730410518E2L
,
684 1.724072188063746970865027817017067646246E2L
,
685 2.815939183464818198705278118326590370435E1L
689 /* erfc(1/x) = 1/x exp(-1/x^2 - 0.5625 + R(1/x^2))
691 Peak relative error 1.5e-36 */
693 static const long double RNr2
[NRNr2
+ 1] =
695 -2.638914383420287212401687401284326363787E-8L,
696 -3.479198370260633977258201271399116766619E-6L,
697 -1.783985295335697686382487087502222519983E-4L,
698 -4.777876933122576014266349277217559356276E-3L,
699 -7.450634738987325004070761301045014986520E-2L,
700 -7.068318854874733315971973707247467326619E-1L,
701 -4.113919921935944795764071670806867038732E0L
,
702 -1.440447573226906222417767283691888875082E1L
,
703 -2.883484031530718428417168042141288943905E1L
,
704 -2.990886974328476387277797361464279931446E1L
,
705 -1.325283914915104866248279787536128997331E1L
,
706 -1.572436106228070195510230310658206154374E0L
709 static const long double RDr2
[NRDr2
+ 1] =
711 2.675042728136731923554119302571867799673E-6L,
712 2.170997868451812708585443282998329996268E-4L,
713 7.249969752687540289422684951196241427445E-3L,
714 1.302040375859768674620410563307838448508E-1L,
715 1.380202483082910888897654537144485285549E0L
,
716 8.926594113174165352623847870299170069350E0L
,
717 3.521089584782616472372909095331572607185E1L
,
718 8.233547427533181375185259050330809105570E1L
,
719 1.072971579885803033079469639073292840135E2L
,
720 6.943803113337964469736022094105143158033E1L
,
721 1.775695341031607738233608307835017282662E1L
725 /* erfc(1/x) = 1/x exp(-1/x^2 - 0.5625 + R(1/x^2))
727 Peak relative error 2.2e-36 */
729 static const long double RNr1
[NRNr1
+ 1] =
731 -4.250780883202361946697751475473042685782E-8L,
732 -5.375777053288612282487696975623206383019E-6L,
733 -2.573645949220896816208565944117382460452E-4L,
734 -6.199032928113542080263152610799113086319E-3L,
735 -8.262721198693404060380104048479916247786E-2L,
736 -6.242615227257324746371284637695778043982E-1L,
737 -2.609874739199595400225113299437099626386E0L
,
738 -5.581967563336676737146358534602770006970E0L
,
739 -5.124398923356022609707490956634280573882E0L
,
740 -1.290865243944292370661544030414667556649E0L
743 static const long double RDr1
[NRDr1
+ 1] =
745 4.308976661749509034845251315983612976224E-6L,
746 3.265390126432780184125233455960049294580E-4L,
747 9.811328839187040701901866531796570418691E-3L,
748 1.511222515036021033410078631914783519649E-1L,
749 1.289264341917429958858379585970225092274E0L
,
750 6.147640356182230769548007536914983522270E0L
,
751 1.573966871337739784518246317003956180750E1L
,
752 1.955534123435095067199574045529218238263E1L
,
753 9.472613121363135472247929109615785855865E0L
760 __erfl (long double x
)
769 ieee854_long_double_shape_type u
;
773 ix
= sign
& 0x7fffffff;
775 if (ix
>= 0x7ff00000)
777 i
= ((sign
& 0xfff00000) >> 31) << 1;
778 return (long double) (1 - i
) + one
/ x
; /* erf(+-inf)=+-1 */
781 if (ix
>= 0x3ff00000) /* |x| >= 1.0 */
785 /* return (one - __erfcl (x)); */
790 if (ix
< 0x3fec0000) /* a < 0.875 */
792 if (ix
< 0x3c600000) /* |x|<2**-57 */
796 /* erf (-0) = -0. Unfortunately, for IBM extended double
797 0.125 * (8.0 * x + efx8 * x) for x = -0 evaluates to 0. */
800 return 0.125 * (8.0 * x
+ efx8
* x
); /*avoid underflow */
804 y
= a
+ a
* neval (z
, TN1
, NTN1
) / deval (z
, TD1
, NTD1
);
809 y
= erf_const
+ neval (a
, TN2
, NTN2
) / deval (a
, TD2
, NTD2
);
812 if (sign
& 0x80000000) /* x < 0 */
817 long_double_symbol (libm
, __erfl
, erfl
);
820 __erfcl (long double x
)
828 long double y
, z
, p
, r
;
830 ieee854_long_double_shape_type u
;
834 ix
= sign
& 0x7fffffff;
837 if (ix
>= 0x7ff00000)
838 { /* erfc(nan)=nan */
839 /* erfc(+-inf)=0,2 */
840 return (long double) (((u_int32_t
) sign
>> 31) << 1) + one
/ x
;
843 if (ix
< 0x3fd00000) /* |x| <1/4 */
845 if (ix
< 0x38d00000) /* |x|<2**-114 */
847 return one
- __erfl (x
);
849 if (ix
< 0x3ff40000) /* 1.25 */
857 y
= C13b
+ z
* neval (z
, RNr13
, NRNr13
) / deval (z
, RDr13
, NRDr13
);
862 y
= C14b
+ z
* neval (z
, RNr14
, NRNr14
) / deval (z
, RDr14
, NRDr14
);
867 y
= C15b
+ z
* neval (z
, RNr15
, NRNr15
) / deval (z
, RDr15
, NRDr15
);
872 y
= C16b
+ z
* neval (z
, RNr16
, NRNr16
) / deval (z
, RDr16
, NRDr16
);
877 y
= C17b
+ z
* neval (z
, RNr17
, NRNr17
) / deval (z
, RDr17
, NRDr17
);
882 y
= C18b
+ z
* neval (z
, RNr18
, NRNr18
) / deval (z
, RDr18
, NRDr18
);
887 y
= C19b
+ z
* neval (z
, RNr19
, NRNr19
) / deval (z
, RDr19
, NRDr19
);
892 y
= C20b
+ z
* neval (z
, RNr20
, NRNr20
) / deval (z
, RDr20
, NRDr20
);
896 if (sign
& 0x80000000)
900 /* 1.25 < |x| < 107 */
904 if ((ix
>= 0x40220000) && (sign
& 0x80000000))
914 p
= neval (z
, RNr1
, NRNr1
) / deval (z
, RDr1
, NRDr1
);
917 p
= neval (z
, RNr2
, NRNr2
) / deval (z
, RDr2
, NRDr2
);
920 p
= neval (z
, RNr3
, NRNr3
) / deval (z
, RDr3
, NRDr3
);
923 p
= neval (z
, RNr4
, NRNr4
) / deval (z
, RDr4
, NRDr4
);
926 p
= neval (z
, RNr5
, NRNr5
) / deval (z
, RDr5
, NRDr5
);
929 p
= neval (z
, RNr6
, NRNr6
) / deval (z
, RDr6
, NRDr6
);
932 p
= neval (z
, RNr7
, NRNr7
) / deval (z
, RDr7
, NRDr7
);
935 p
= neval (z
, RNr8
, NRNr8
) / deval (z
, RDr8
, NRDr8
);
940 u
.parts32
.w2
&= 0xffffe000;
942 r
= __ieee754_expl (-z
* z
- 0.5625) *
943 __ieee754_expl ((z
- x
) * (z
+ x
) + p
);
944 if ((sign
& 0x80000000) == 0)
951 if ((sign
& 0x80000000) == 0)
958 long_double_symbol (libm
, __erfcl
, erfcl
);