1:
2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
12:
13:
14:
15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100: 101: 102: 103: 104: 105: 106: 107:
108:
109: #include <sys/cdefs.h>
110: #include <float.h>
111: #include <math.h>
112:
113: #include "math_private.h"
114:
115: static const double
116: tiny = 1e-300,
117: half= 5.00000000000000000000e-01,
118: one = 1.00000000000000000000e+00,
119: two = 2.00000000000000000000e+00,
120:
121: erx = 8.45062911510467529297e-01,
122: 123: 124:
125: efx = 1.28379167095512586316e-01,
126: efx8= 1.02703333676410069053e+00,
127: pp0 = 1.28379167095512558561e-01,
128: pp1 = -3.25042107247001499370e-01,
129: pp2 = -2.84817495755985104766e-02,
130: pp3 = -5.77027029648944159157e-03,
131: pp4 = -2.37630166566501626084e-05,
132: qq1 = 3.97917223959155352819e-01,
133: qq2 = 6.50222499887672944485e-02,
134: qq3 = 5.08130628187576562776e-03,
135: qq4 = 1.32494738004321644526e-04,
136: qq5 = -3.96022827877536812320e-06,
137: 138: 139:
140: pa0 = -2.36211856075265944077e-03,
141: pa1 = 4.14856118683748331666e-01,
142: pa2 = -3.72207876035701323847e-01,
143: pa3 = 3.18346619901161753674e-01,
144: pa4 = -1.10894694282396677476e-01,
145: pa5 = 3.54783043256182359371e-02,
146: pa6 = -2.16637559486879084300e-03,
147: qa1 = 1.06420880400844228286e-01,
148: qa2 = 5.40397917702171048937e-01,
149: qa3 = 7.18286544141962662868e-02,
150: qa4 = 1.26171219808761642112e-01,
151: qa5 = 1.36370839120290507362e-02,
152: qa6 = 1.19844998467991074170e-02,
153: 154: 155:
156: ra0 = -9.86494403484714822705e-03,
157: ra1 = -6.93858572707181764372e-01,
158: ra2 = -1.05586262253232909814e+01,
159: ra3 = -6.23753324503260060396e+01,
160: ra4 = -1.62396669462573470355e+02,
161: ra5 = -1.84605092906711035994e+02,
162: ra6 = -8.12874355063065934246e+01,
163: ra7 = -9.81432934416914548592e+00,
164: sa1 = 1.96512716674392571292e+01,
165: sa2 = 1.37657754143519042600e+02,
166: sa3 = 4.34565877475229228821e+02,
167: sa4 = 6.45387271733267880336e+02,
168: sa5 = 4.29008140027567833386e+02,
169: sa6 = 1.08635005541779435134e+02,
170: sa7 = 6.57024977031928170135e+00,
171: sa8 = -6.04244152148580987438e-02,
172: 173: 174:
175: rb0 = -9.86494292470009928597e-03,
176: rb1 = -7.99283237680523006574e-01,
177: rb2 = -1.77579549177547519889e+01,
178: rb3 = -1.60636384855821916062e+02,
179: rb4 = -6.37566443368389627722e+02,
180: rb5 = -1.02509513161107724954e+03,
181: rb6 = -4.83519191608651397019e+02,
182: sb1 = 3.03380607434824582924e+01,
183: sb2 = 3.25792512996573918826e+02,
184: sb3 = 1.53672958608443695994e+03,
185: sb4 = 3.19985821950859553908e+03,
186: sb5 = 2.55305040643316442583e+03,
187: sb6 = 4.74528541206955367215e+02,
188: sb7 = -2.24409524465858183362e+01;
189:
190: double
191: erf(double x)
192: {
193: int32_t hx,ix,i;
194: double R,S,P,Q,s,y,z,r;
195: GET_HIGH_WORD(hx,x);
196: ix = hx&0x7fffffff;
197: if(ix>=0x7ff00000) {
198: i = ((u_int32_t)hx>>31)<<1;
199: return (double)(1-i)+one/x;
200: }
201:
202: if(ix < 0x3feb0000) {
203: if(ix < 0x3e300000) {
204: if (ix < 0x00800000)
205: return 0.125*(8.0*x+efx8*x);
206: return x + efx*x;
207: }
208: z = x*x;
209: r = pp0+z*(pp1+z*(pp2+z*(pp3+z*pp4)));
210: s = one+z*(qq1+z*(qq2+z*(qq3+z*(qq4+z*qq5))));
211: y = r/s;
212: return x + x*y;
213: }
214: if(ix < 0x3ff40000) {
215: s = fabs(x)-one;
216: P = pa0+s*(pa1+s*(pa2+s*(pa3+s*(pa4+s*(pa5+s*pa6)))));
217: Q = one+s*(qa1+s*(qa2+s*(qa3+s*(qa4+s*(qa5+s*qa6)))));
218: if(hx>=0) return erx + P/Q; else return -erx - P/Q;
219: }
220: if (ix >= 0x40180000) {
221: if(hx>=0) return one-tiny; else return tiny-one;
222: }
223: x = fabs(x);
224: s = one/(x*x);
225: if(ix< 0x4006DB6E) {
226: R=ra0+s*(ra1+s*(ra2+s*(ra3+s*(ra4+s*(
227: ra5+s*(ra6+s*ra7))))));
228: S=one+s*(sa1+s*(sa2+s*(sa3+s*(sa4+s*(
229: sa5+s*(sa6+s*(sa7+s*sa8)))))));
230: } else {
231: R=rb0+s*(rb1+s*(rb2+s*(rb3+s*(rb4+s*(
232: rb5+s*rb6)))));
233: S=one+s*(sb1+s*(sb2+s*(sb3+s*(sb4+s*(
234: sb5+s*(sb6+s*sb7))))));
235: }
236: z = x;
237: SET_LOW_WORD(z,0);
238: r = exp(-z*z-0.5625)*exp((z-x)*(z+x)+R/S);
239: if(hx>=0) return one-r/x; else return r/x-one;
240: }
241:
242: double
243: erfc(double x)
244: {
245: int32_t hx,ix;
246: double R,S,P,Q,s,y,z,r;
247: GET_HIGH_WORD(hx,x);
248: ix = hx&0x7fffffff;
249: if(ix>=0x7ff00000) {
250:
251: return (double)(((u_int32_t)hx>>31)<<1)+one/x;
252: }
253:
254: if(ix < 0x3feb0000) {
255: if(ix < 0x3c700000)
256: return one-x;
257: z = x*x;
258: r = pp0+z*(pp1+z*(pp2+z*(pp3+z*pp4)));
259: s = one+z*(qq1+z*(qq2+z*(qq3+z*(qq4+z*qq5))));
260: y = r/s;
261: if(hx < 0x3fd00000) {
262: return one-(x+x*y);
263: } else {
264: r = x*y;
265: r += (x-half);
266: return half - r ;
267: }
268: }
269: if(ix < 0x3ff40000) {
270: s = fabs(x)-one;
271: P = pa0+s*(pa1+s*(pa2+s*(pa3+s*(pa4+s*(pa5+s*pa6)))));
272: Q = one+s*(qa1+s*(qa2+s*(qa3+s*(qa4+s*(qa5+s*qa6)))));
273: if(hx>=0) {
274: z = one-erx; return z - P/Q;
275: } else {
276: z = erx+P/Q; return one+z;
277: }
278: }
279: if (ix < 0x403c0000) {
280: x = fabs(x);
281: s = one/(x*x);
282: if(ix< 0x4006DB6D) {
283: R=ra0+s*(ra1+s*(ra2+s*(ra3+s*(ra4+s*(
284: ra5+s*(ra6+s*ra7))))));
285: S=one+s*(sa1+s*(sa2+s*(sa3+s*(sa4+s*(
286: sa5+s*(sa6+s*(sa7+s*sa8)))))));
287: } else {
288: if(hx<0&&ix>=0x40180000) return two-tiny;
289: R=rb0+s*(rb1+s*(rb2+s*(rb3+s*(rb4+s*(
290: rb5+s*rb6)))));
291: S=one+s*(sb1+s*(sb2+s*(sb3+s*(sb4+s*(
292: sb5+s*(sb6+s*sb7))))));
293: }
294: z = x;
295: SET_LOW_WORD(z,0);
296: r = exp(-z*z-0.5625) * exp((z-x)*(z+x)+R/S);
297: if(hx>0) return r/x; else return two-r/x;
298: } else {
299: if(hx>0) return tiny*tiny; else return two-tiny;
300: }
301: }
302:
303: #if LDBL_MANT_DIG == 53
304: #ifdef lint
305:
306: long double erfl(long double);
307: long double erfcl(long double);
308: #else
309: __weak_alias(erfl, erf);
310: __weak_alias(erfcl, erfc);
311: #endif
312: #endif