📄 s_erfl.c
字号:
-2.206127630303621521950193783894598987033E2L,-1.861800338758066696514480386180875607204E3L,-8.889048775872605708249140016201753255599E3L,-2.465888106627948210478692168261494857089E4L,-3.934642211710774494879042116768390014289E4L,-3.455077258242252974937480623730228841003E4L,-1.524083977439690284820586063729912653196E4L,-2.810541887397984804237552337349093953857E3L,-1.343929553541159933824901621702567066156E2L /* 1.0E0 */};/* erfc(1/x) = 1/x exp(-1/x^2 - 0.5625 + R(1/x^2)) 1/4 <= 1/x < 3/8 Peak relative error 8.4e-37 */#define NRNr3 11static const long double RNr3[NRNr3 + 1] ={-1.952401126551202208698629992497306292987E-6L,-2.130881743066372952515162564941682716125E-4L,-8.376493958090190943737529486107282224387E-3L,-1.650592646560987700661598877522831234791E-1L,-1.839290818933317338111364667708678163199E0L,-1.216278715570882422410442318517814388470E1L,-4.818759344462360427612133632533779091386E1L,-1.120994661297476876804405329172164436784E2L,-1.452850765662319264191141091859300126931E2L,-9.485207851128957108648038238656777241333E1L,-2.563663855025796641216191848818620020073E1L,-1.787995944187565676837847610706317833247E0L};#define NRDr3 10static const long double RDr3[NRDr3 + 1] ={ 1.979130686770349481460559711878399476903E-4L, 1.156941716128488266238105813374635099057E-2L, 2.752657634309886336431266395637285974292E-1L, 3.482245457248318787349778336603569327521E0L, 2.569347069372696358578399521203959253162E1L, 1.142279000180457419740314694631879921561E2L, 3.056503977190564294341422623108332700840E2L, 4.780844020923794821656358157128719184422E2L, 4.105972727212554277496256802312730410518E2L, 1.724072188063746970865027817017067646246E2L, 2.815939183464818198705278118326590370435E1L /* 1.0E0 */};/* erfc(1/x) = 1/x exp(-1/x^2 - 0.5625 + R(1/x^2)) 1/8 <= 1/x < 1/4 Peak relative error 1.5e-36 */#define NRNr2 11static const long double RNr2[NRNr2 + 1] ={-2.638914383420287212401687401284326363787E-8L,-3.479198370260633977258201271399116766619E-6L,-1.783985295335697686382487087502222519983E-4L,-4.777876933122576014266349277217559356276E-3L,-7.450634738987325004070761301045014986520E-2L,-7.068318854874733315971973707247467326619E-1L,-4.113919921935944795764071670806867038732E0L,-1.440447573226906222417767283691888875082E1L,-2.883484031530718428417168042141288943905E1L,-2.990886974328476387277797361464279931446E1L,-1.325283914915104866248279787536128997331E1L,-1.572436106228070195510230310658206154374E0L};#define NRDr2 10static const long double RDr2[NRDr2 + 1] ={ 2.675042728136731923554119302571867799673E-6L, 2.170997868451812708585443282998329996268E-4L, 7.249969752687540289422684951196241427445E-3L, 1.302040375859768674620410563307838448508E-1L, 1.380202483082910888897654537144485285549E0L, 8.926594113174165352623847870299170069350E0L, 3.521089584782616472372909095331572607185E1L, 8.233547427533181375185259050330809105570E1L, 1.072971579885803033079469639073292840135E2L, 6.943803113337964469736022094105143158033E1L, 1.775695341031607738233608307835017282662E1L /* 1.0E0 */};/* erfc(1/x) = 1/x exp(-1/x^2 - 0.5625 + R(1/x^2)) 1/128 <= 1/x < 1/8 Peak relative error 2.2e-36 */#define NRNr1 9static const long double RNr1[NRNr1 + 1] ={-4.250780883202361946697751475473042685782E-8L,-5.375777053288612282487696975623206383019E-6L,-2.573645949220896816208565944117382460452E-4L,-6.199032928113542080263152610799113086319E-3L,-8.262721198693404060380104048479916247786E-2L,-6.242615227257324746371284637695778043982E-1L,-2.609874739199595400225113299437099626386E0L,-5.581967563336676737146358534602770006970E0L,-5.124398923356022609707490956634280573882E0L,-1.290865243944292370661544030414667556649E0L};#define NRDr1 8static const long double RDr1[NRDr1 + 1] ={ 4.308976661749509034845251315983612976224E-6L, 3.265390126432780184125233455960049294580E-4L, 9.811328839187040701901866531796570418691E-3L, 1.511222515036021033410078631914783519649E-1L, 1.289264341917429958858379585970225092274E0L, 6.147640356182230769548007536914983522270E0L, 1.573966871337739784518246317003956180750E1L, 1.955534123435095067199574045529218238263E1L, 9.472613121363135472247929109615785855865E0L /* 1.0E0 */};#ifdef __STDC__long double__erfl (long double x)#elsedouble__erfl (x) long double x;#endif{ long double a, y, z; int32_t i, ix, sign; ieee854_long_double_shape_type u; u.value = x; sign = u.parts32.w0; ix = sign & 0x7fffffff; if (ix >= 0x7ff00000) { /* erf(nan)=nan */ i = ((sign & 0xfff00000) >> 31) << 1; return (long double) (1 - i) + one / x; /* erf(+-inf)=+-1 */ } if (ix >= 0x3ff00000) /* |x| >= 1.0 */ { y = __erfcl (x); return (one - y); /* return (one - __erfcl (x)); */ } u.parts32.w0 = ix; a = u.value; z = x * x; if (ix < 0x3fec0000) /* a < 0.875 */ { if (ix < 0x3c600000) /* |x|<2**-57 */ { if (ix < 0x00800000) { /* erf (-0) = -0. Unfortunately, for IBM extended double 0.125 * (8.0 * x + efx8 * x) for x = -0 evaluates to 0. */ if (x == 0) return x; return 0.125 * (8.0 * x + efx8 * x); /*avoid underflow */ } return x + efx * x; } y = a + a * neval (z, TN1, NTN1) / deval (z, TD1, NTD1); } else { a = a - one; y = erf_const + neval (a, TN2, NTN2) / deval (a, TD2, NTD2); } if (sign & 0x80000000) /* x < 0 */ y = -y; return( y );}long_double_symbol (libm, __erfl, erfl);#ifdef __STDC__ long double __erfcl (long double x)#else long double __erfcl (x) double x;#endif{ long double y, z, p, r; int32_t i, ix, sign; ieee854_long_double_shape_type u; u.value = x; sign = u.parts32.w0; ix = sign & 0x7fffffff; u.parts32.w0 = ix; if (ix >= 0x7ff00000) { /* erfc(nan)=nan */ /* erfc(+-inf)=0,2 */ return (long double) (((u_int32_t) sign >> 31) << 1) + one / x; } if (ix < 0x3fd00000) /* |x| <1/4 */ { if (ix < 0x38d00000) /* |x|<2**-114 */ return one - x; return one - __erfl (x); } if (ix < 0x3ff40000) /* 1.25 */ { x = u.value; i = 8.0 * x; switch (i) { case 2: z = x - 0.25L; y = C13b + z * neval (z, RNr13, NRNr13) / deval (z, RDr13, NRDr13); y += C13a; break; case 3: z = x - 0.375L; y = C14b + z * neval (z, RNr14, NRNr14) / deval (z, RDr14, NRDr14); y += C14a; break; case 4: z = x - 0.5L; y = C15b + z * neval (z, RNr15, NRNr15) / deval (z, RDr15, NRDr15); y += C15a; break; case 5: z = x - 0.625L; y = C16b + z * neval (z, RNr16, NRNr16) / deval (z, RDr16, NRDr16); y += C16a; break; case 6: z = x - 0.75L; y = C17b + z * neval (z, RNr17, NRNr17) / deval (z, RDr17, NRDr17); y += C17a; break; case 7: z = x - 0.875L; y = C18b + z * neval (z, RNr18, NRNr18) / deval (z, RDr18, NRDr18); y += C18a; break; case 8: z = x - 1.0L; y = C19b + z * neval (z, RNr19, NRNr19) / deval (z, RDr19, NRDr19); y += C19a; break; case 9: z = x - 1.125L; y = C20b + z * neval (z, RNr20, NRNr20) / deval (z, RDr20, NRDr20); y += C20a; break; } if (sign & 0x80000000) y = 2.0L - y; return y; } /* 1.25 < |x| < 107 */ if (ix < 0x405ac000) { /* x < -9 */ if ((ix >= 0x40220000) && (sign & 0x80000000)) return two - tiny; x = fabsl (x); z = one / (x * x); i = 8.0 / x; switch (i) { default: case 0: p = neval (z, RNr1, NRNr1) / deval (z, RDr1, NRDr1); break; case 1: p = neval (z, RNr2, NRNr2) / deval (z, RDr2, NRDr2); break; case 2: p = neval (z, RNr3, NRNr3) / deval (z, RDr3, NRDr3); break; case 3: p = neval (z, RNr4, NRNr4) / deval (z, RDr4, NRDr4); break; case 4: p = neval (z, RNr5, NRNr5) / deval (z, RDr5, NRDr5); break; case 5: p = neval (z, RNr6, NRNr6) / deval (z, RDr6, NRDr6); break; case 6: p = neval (z, RNr7, NRNr7) / deval (z, RDr7, NRDr7); break; case 7: p = neval (z, RNr8, NRNr8) / deval (z, RDr8, NRDr8); break; } u.value = x; u.parts32.w3 = 0; u.parts32.w2 &= 0xffffe000; z = u.value; r = __ieee754_expl (-z * z - 0.5625) * __ieee754_expl ((z - x) * (z + x) + p); if ((sign & 0x80000000) == 0) return r / x; else return two - r / x; } else { if ((sign & 0x80000000) == 0) return tiny * tiny; else return two - tiny; }}long_double_symbol (libm, __erfcl, erfcl);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -