s_erfl.c 29 KB

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