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