xref: /freebsd-src/lib/msun/ld80/s_erfl.c (revision 0dd5a5603e7a33d976f8e6015620bbc79839c609)
1*3b5e0d0fSSteve Kargl /*
2*3b5e0d0fSSteve Kargl  * ====================================================
3*3b5e0d0fSSteve Kargl  * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
4*3b5e0d0fSSteve Kargl  *
5*3b5e0d0fSSteve Kargl  * Developed at SunPro, a Sun Microsystems, Inc. business.
6*3b5e0d0fSSteve Kargl  * Permission to use, copy, modify, and distribute this
7*3b5e0d0fSSteve Kargl  * software is freely granted, provided that this notice
8*3b5e0d0fSSteve Kargl  * is preserved.
9*3b5e0d0fSSteve Kargl  * ====================================================
10*3b5e0d0fSSteve Kargl  */
11*3b5e0d0fSSteve Kargl 
12*3b5e0d0fSSteve Kargl /*
13*3b5e0d0fSSteve Kargl  * See s_erf.c for complete comments.
14*3b5e0d0fSSteve Kargl  *
15*3b5e0d0fSSteve Kargl  * Converted to long double by Steven G. Kargl.
16*3b5e0d0fSSteve Kargl  */
17*3b5e0d0fSSteve Kargl #include <float.h>
18*3b5e0d0fSSteve Kargl #ifdef __i386__
19*3b5e0d0fSSteve Kargl #include <ieeefp.h>
20*3b5e0d0fSSteve Kargl #endif
21*3b5e0d0fSSteve Kargl 
22*3b5e0d0fSSteve Kargl #include "fpmath.h"
23*3b5e0d0fSSteve Kargl #include "math.h"
24*3b5e0d0fSSteve Kargl #include "math_private.h"
25*3b5e0d0fSSteve Kargl 
26*3b5e0d0fSSteve Kargl /* XXX Prevent compilers from erroneously constant folding: */
27*3b5e0d0fSSteve Kargl static const volatile long double tiny = 0x1p-10000L;
28*3b5e0d0fSSteve Kargl 
29*3b5e0d0fSSteve Kargl static const double
30*3b5e0d0fSSteve Kargl half= 0.5,
31*3b5e0d0fSSteve Kargl one = 1,
32*3b5e0d0fSSteve Kargl two = 2;
33*3b5e0d0fSSteve Kargl /*
34*3b5e0d0fSSteve Kargl  * In the domain [0, 2**-34], only the first term in the power series
35*3b5e0d0fSSteve Kargl  * expansion of erf(x) is used.  The magnitude of the first neglected
36*3b5e0d0fSSteve Kargl  * terms is less than 2**-102.
37*3b5e0d0fSSteve Kargl  */
38*3b5e0d0fSSteve Kargl static const union IEEEl2bits
39*3b5e0d0fSSteve Kargl efxu  = LD80C(0x8375d410a6db446c, -3,  1.28379167095512573902e-1L),
40*3b5e0d0fSSteve Kargl efx8u = LD80C(0x8375d410a6db446c,  0,  1.02703333676410059122e+0L),
41*3b5e0d0fSSteve Kargl /*
42*3b5e0d0fSSteve Kargl  * Domain [0, 0.84375], range ~[-1.423e-22, 1.423e-22]:
43*3b5e0d0fSSteve Kargl  * |(erf(x) - x)/x - pp(x)/qq(x)| < 2**-72.573
44*3b5e0d0fSSteve Kargl  */
45*3b5e0d0fSSteve Kargl pp0u  = LD80C(0x8375d410a6db446c, -3,   1.28379167095512573902e-1L),
46*3b5e0d0fSSteve Kargl pp1u  = LD80C(0xa46c7d09ec3d0cec, -2,  -3.21140201054840180596e-1L),
47*3b5e0d0fSSteve Kargl pp2u  = LD80C(0x9b31e66325576f86, -5,  -3.78893851760347812082e-2L),
48*3b5e0d0fSSteve Kargl pp3u  = LD80C(0x804ac72c9a0b97dd, -7,  -7.83032847030604679616e-3L),
49*3b5e0d0fSSteve Kargl pp4u  = LD80C(0x9f42bcbc3d5a601d, -12, -3.03765663857082048459e-4L),
50*3b5e0d0fSSteve Kargl pp5u  = LD80C(0x9ec4ad6193470693, -16, -1.89266527398167917502e-5L),
51*3b5e0d0fSSteve Kargl qq1u  = LD80C(0xdb4b8eb713188d6b, -2,   4.28310832832310510579e-1L),
52*3b5e0d0fSSteve Kargl qq2u  = LD80C(0xa5750835b2459bd1, -4,   8.07896272074540216658e-2L),
53*3b5e0d0fSSteve Kargl qq3u  = LD80C(0x8b85d6bd6a90b51c, -7,   8.51579638189385354266e-3L),
54*3b5e0d0fSSteve Kargl qq4u  = LD80C(0x87332f82cff4ff96, -11,  5.15746855583604912827e-4L),
55*3b5e0d0fSSteve Kargl qq5u  = LD80C(0x83466cb6bf9dca00, -16,  1.56492109706256700009e-5L),
56*3b5e0d0fSSteve Kargl qq6u  = LD80C(0xf5bf98c2f996bf63, -24,  1.14435527803073879724e-7L);
57*3b5e0d0fSSteve Kargl #define	efx	(efxu.e)
58*3b5e0d0fSSteve Kargl #define	efx8	(efx8u.e)
59*3b5e0d0fSSteve Kargl #define	pp0	(pp0u.e)
60*3b5e0d0fSSteve Kargl #define	pp1	(pp1u.e)
61*3b5e0d0fSSteve Kargl #define	pp2	(pp2u.e)
62*3b5e0d0fSSteve Kargl #define	pp3	(pp3u.e)
63*3b5e0d0fSSteve Kargl #define	pp4	(pp4u.e)
64*3b5e0d0fSSteve Kargl #define	pp5	(pp5u.e)
65*3b5e0d0fSSteve Kargl #define	qq1	(qq1u.e)
66*3b5e0d0fSSteve Kargl #define	qq2	(qq2u.e)
67*3b5e0d0fSSteve Kargl #define	qq3	(qq3u.e)
68*3b5e0d0fSSteve Kargl #define	qq4	(qq4u.e)
69*3b5e0d0fSSteve Kargl #define	qq5	(qq5u.e)
70*3b5e0d0fSSteve Kargl #define	qq6	(qq6u.e)
71*3b5e0d0fSSteve Kargl static const union IEEEl2bits
72*3b5e0d0fSSteve Kargl erxu  = LD80C(0xd7bb3d0000000000, -1,  8.42700779438018798828e-1L),
73*3b5e0d0fSSteve Kargl /*
74*3b5e0d0fSSteve Kargl  * Domain [0.84375, 1.25], range ~[-8.132e-22, 8.113e-22]:
75*3b5e0d0fSSteve Kargl  * |(erf(x) - erx) - pa(x)/qa(x)| < 2**-71.762
76*3b5e0d0fSSteve Kargl  */
77*3b5e0d0fSSteve Kargl pa0u  = LD80C(0xe8211158da02c692, -27,  1.35116960705131296711e-8L),
78*3b5e0d0fSSteve Kargl pa1u  = LD80C(0xd488f89f36988618, -2,   4.15107507167065612570e-1L),
79*3b5e0d0fSSteve Kargl pa2u  = LD80C(0xece74f8c63fa3942, -4,  -1.15675565215949226989e-1L),
80*3b5e0d0fSSteve Kargl pa3u  = LD80C(0xc8d31e020727c006, -4,   9.80589241379624665791e-2L),
81*3b5e0d0fSSteve Kargl pa4u  = LD80C(0x985d5d5fafb0551f, -5,   3.71984145558422368847e-2L),
82*3b5e0d0fSSteve Kargl pa5u  = LD80C(0xa5b6c4854d2f5452, -8,  -5.05718799340957673661e-3L),
83*3b5e0d0fSSteve Kargl pa6u  = LD80C(0x85c8d58fe3993a47, -8,   4.08277919612202243721e-3L),
84*3b5e0d0fSSteve Kargl pa7u  = LD80C(0xddbfbc23677b35cf, -13,  2.11476292145347530794e-4L),
85*3b5e0d0fSSteve Kargl qa1u  = LD80C(0xb8a977896f5eff3f, -1,   7.21335860303380361298e-1L),
86*3b5e0d0fSSteve Kargl qa2u  = LD80C(0x9fcd662c3d4eac86, -1,   6.24227891731886593333e-1L),
87*3b5e0d0fSSteve Kargl qa3u  = LD80C(0x9d0b618eac67ba07, -2,   3.06727455774491855801e-1L),
88*3b5e0d0fSSteve Kargl qa4u  = LD80C(0x881a4293f6d6c92d, -3,   1.32912674218195890535e-1L),
89*3b5e0d0fSSteve Kargl qa5u  = LD80C(0xbab144f07dea45bf, -5,   4.55792134233613027584e-2L),
90*3b5e0d0fSSteve Kargl qa6u  = LD80C(0xa6c34ba438bdc900, -7,   1.01783980070527682680e-2L),
91*3b5e0d0fSSteve Kargl qa7u  = LD80C(0x8fa866dc20717a91, -9,   2.19204436518951438183e-3L);
92*3b5e0d0fSSteve Kargl #define erx	(erxu.e)
93*3b5e0d0fSSteve Kargl #define pa0	(pa0u.e)
94*3b5e0d0fSSteve Kargl #define pa1	(pa1u.e)
95*3b5e0d0fSSteve Kargl #define pa2	(pa2u.e)
96*3b5e0d0fSSteve Kargl #define pa3	(pa3u.e)
97*3b5e0d0fSSteve Kargl #define pa4	(pa4u.e)
98*3b5e0d0fSSteve Kargl #define pa5	(pa5u.e)
99*3b5e0d0fSSteve Kargl #define pa6	(pa6u.e)
100*3b5e0d0fSSteve Kargl #define pa7	(pa7u.e)
101*3b5e0d0fSSteve Kargl #define qa1	(qa1u.e)
102*3b5e0d0fSSteve Kargl #define qa2	(qa2u.e)
103*3b5e0d0fSSteve Kargl #define qa3	(qa3u.e)
104*3b5e0d0fSSteve Kargl #define qa4	(qa4u.e)
105*3b5e0d0fSSteve Kargl #define qa5	(qa5u.e)
106*3b5e0d0fSSteve Kargl #define qa6	(qa6u.e)
107*3b5e0d0fSSteve Kargl #define qa7	(qa7u.e)
108*3b5e0d0fSSteve Kargl static const union IEEEl2bits
109*3b5e0d0fSSteve Kargl /*
110*3b5e0d0fSSteve Kargl  * Domain [1.25,2.85715], range ~[-2.334e-22,2.334e-22]:
111*3b5e0d0fSSteve Kargl  * |log(x*erfc(x)) + x**2 + 0.5625 - ra(x)/sa(x)| < 2**-71.860
112*3b5e0d0fSSteve Kargl  */
113*3b5e0d0fSSteve Kargl ra0u  = LD80C(0xa1a091e0fb4f335a, -7, -9.86494298915814308249e-3L),
114*3b5e0d0fSSteve Kargl ra1u  = LD80C(0xc2b0d045ae37df6b, -1, -7.60510460864878271275e-1L),
115*3b5e0d0fSSteve Kargl ra2u  = LD80C(0xf2cec3ee7da636c5, 3,  -1.51754798236892278250e+1L),
116*3b5e0d0fSSteve Kargl ra3u  = LD80C(0x813cc205395adc7d, 7,  -1.29237335516455333420e+2L),
117*3b5e0d0fSSteve Kargl ra4u  = LD80C(0x8737c8b7b4062c2f, 9,  -5.40871625829510494776e+2L),
118*3b5e0d0fSSteve Kargl ra5u  = LD80C(0x8ffe5383c08d4943, 10, -1.15194769466026108551e+3L),
119*3b5e0d0fSSteve Kargl ra6u  = LD80C(0x983573e64d5015a9, 10, -1.21767039790249025544e+3L),
120*3b5e0d0fSSteve Kargl ra7u  = LD80C(0x92a794e763a6d4db, 9,  -5.86618463370624636688e+2L),
121*3b5e0d0fSSteve Kargl ra8u  = LD80C(0xd5ad1fae77c3d9a3, 6,  -1.06838132335777049840e+2L),
122*3b5e0d0fSSteve Kargl ra9u  = LD80C(0x934c1a247807bb9c, 2,  -4.60303980944467334806e+0L),
123*3b5e0d0fSSteve Kargl sa1u  = LD80C(0xd342f90012bb1189, 4,   2.64077014928547064865e+1L),
124*3b5e0d0fSSteve Kargl sa2u  = LD80C(0x839be13d9d5da883, 8,   2.63217811300123973067e+2L),
125*3b5e0d0fSSteve Kargl sa3u  = LD80C(0x9f8cba6d1ae1b24b, 10,  1.27639775710344617587e+3L),
126*3b5e0d0fSSteve Kargl sa4u  = LD80C(0xcaa83f403713e33e, 11,  3.24251544209971162003e+3L),
127*3b5e0d0fSSteve Kargl sa5u  = LD80C(0x8796aff2f3c47968, 12,  4.33883591261332837874e+3L),
128*3b5e0d0fSSteve Kargl sa6u  = LD80C(0xb6ef97f9c753157b, 11,  2.92697460344182158454e+3L),
129*3b5e0d0fSSteve Kargl sa7u  = LD80C(0xe02aee5f83773d1c, 9,   8.96670799139389559818e+2L),
130*3b5e0d0fSSteve Kargl sa8u  = LD80C(0xc82b83855b88e07e, 6,   1.00084987800048510018e+2L),
131*3b5e0d0fSSteve Kargl sa9u  = LD80C(0x92f030aefadf28ad, 1,   2.29591004455459083843e+0L);
132*3b5e0d0fSSteve Kargl #define ra0	(ra0u.e)
133*3b5e0d0fSSteve Kargl #define ra1	(ra1u.e)
134*3b5e0d0fSSteve Kargl #define ra2	(ra2u.e)
135*3b5e0d0fSSteve Kargl #define ra3	(ra3u.e)
136*3b5e0d0fSSteve Kargl #define ra4	(ra4u.e)
137*3b5e0d0fSSteve Kargl #define ra5	(ra5u.e)
138*3b5e0d0fSSteve Kargl #define ra6	(ra6u.e)
139*3b5e0d0fSSteve Kargl #define ra7	(ra7u.e)
140*3b5e0d0fSSteve Kargl #define ra8	(ra8u.e)
141*3b5e0d0fSSteve Kargl #define ra9	(ra9u.e)
142*3b5e0d0fSSteve Kargl #define sa1	(sa1u.e)
143*3b5e0d0fSSteve Kargl #define sa2	(sa2u.e)
144*3b5e0d0fSSteve Kargl #define sa3	(sa3u.e)
145*3b5e0d0fSSteve Kargl #define sa4	(sa4u.e)
146*3b5e0d0fSSteve Kargl #define sa5	(sa5u.e)
147*3b5e0d0fSSteve Kargl #define sa6	(sa6u.e)
148*3b5e0d0fSSteve Kargl #define sa7	(sa7u.e)
149*3b5e0d0fSSteve Kargl #define sa8	(sa8u.e)
150*3b5e0d0fSSteve Kargl #define sa9	(sa9u.e)
151*3b5e0d0fSSteve Kargl /*
152*3b5e0d0fSSteve Kargl  * Domain [2.85715,7], range ~[-8.323e-22,8.390e-22]:
153*3b5e0d0fSSteve Kargl  * |log(x*erfc(x)) + x**2 + 0.5625 - rb(x)/sb(x)| < 2**-70.326
154*3b5e0d0fSSteve Kargl  */
155*3b5e0d0fSSteve Kargl static const union IEEEl2bits
156*3b5e0d0fSSteve Kargl rb0u = LD80C(0xa1a091cf43abcd26, -7, -9.86494292470284646962e-3L),
157*3b5e0d0fSSteve Kargl rb1u = LD80C(0xd19d2df1cbb8da0a, -1, -8.18804618389296662837e-1L),
158*3b5e0d0fSSteve Kargl rb2u = LD80C(0x9a4dd1383e5daf5b, 4,  -1.92879967111618594779e+1L),
159*3b5e0d0fSSteve Kargl rb3u = LD80C(0xbff0ae9fc0751de6, 7,  -1.91940164551245394969e+2L),
160*3b5e0d0fSSteve Kargl rb4u = LD80C(0xdde08465310b472b, 9,  -8.87508080766577324539e+2L),
161*3b5e0d0fSSteve Kargl rb5u = LD80C(0xe796e1d38c8c70a9, 10, -1.85271506669474503781e+3L),
162*3b5e0d0fSSteve Kargl rb6u = LD80C(0xbaf655a76e0ab3b5, 10, -1.49569795581333675349e+3L),
163*3b5e0d0fSSteve Kargl rb7u = LD80C(0x95d21e3e75503c21, 8,  -2.99641547972948019157e+2L),
164*3b5e0d0fSSteve Kargl sb1u = LD80C(0x814487ed823c8cbd, 5,   3.23169247732868256569e+1L),
165*3b5e0d0fSSteve Kargl sb2u = LD80C(0xbe4bfbb1301304be, 8,   3.80593618534539961773e+2L),
166*3b5e0d0fSSteve Kargl sb3u = LD80C(0x809c4ade46b927c7, 11,  2.05776827838541292848e+3L),
167*3b5e0d0fSSteve Kargl sb4u = LD80C(0xa55284359f3395a8, 12,  5.29031455540062116327e+3L),
168*3b5e0d0fSSteve Kargl sb5u = LD80C(0xbcfa72da9b820874, 12,  6.04730608102312640462e+3L),
169*3b5e0d0fSSteve Kargl sb6u = LD80C(0x9d09a35988934631, 11,  2.51260238030767176221e+3L),
170*3b5e0d0fSSteve Kargl sb7u = LD80C(0xd675bbe542c159fa, 7,   2.14459898308561015684e+2L);
171*3b5e0d0fSSteve Kargl #define rb0	(rb0u.e)
172*3b5e0d0fSSteve Kargl #define rb1	(rb1u.e)
173*3b5e0d0fSSteve Kargl #define rb2	(rb2u.e)
174*3b5e0d0fSSteve Kargl #define rb3	(rb3u.e)
175*3b5e0d0fSSteve Kargl #define rb4	(rb4u.e)
176*3b5e0d0fSSteve Kargl #define rb5	(rb5u.e)
177*3b5e0d0fSSteve Kargl #define rb6	(rb6u.e)
178*3b5e0d0fSSteve Kargl #define rb7	(rb7u.e)
179*3b5e0d0fSSteve Kargl #define sb1	(sb1u.e)
180*3b5e0d0fSSteve Kargl #define sb2	(sb2u.e)
181*3b5e0d0fSSteve Kargl #define sb3	(sb3u.e)
182*3b5e0d0fSSteve Kargl #define sb4	(sb4u.e)
183*3b5e0d0fSSteve Kargl #define sb5	(sb5u.e)
184*3b5e0d0fSSteve Kargl #define sb6	(sb6u.e)
185*3b5e0d0fSSteve Kargl #define sb7	(sb7u.e)
186*3b5e0d0fSSteve Kargl /*
187*3b5e0d0fSSteve Kargl  * Domain [7,108], range ~[-4.422e-22,4.422e-22]:
188*3b5e0d0fSSteve Kargl  * |log(x*erfc(x)) + x**2 + 0.5625 - rc(x)/sc(x)| < 2**-70.938
189*3b5e0d0fSSteve Kargl  */
190*3b5e0d0fSSteve Kargl static const union IEEEl2bits
191*3b5e0d0fSSteve Kargl /* err = -4.422092275318925082e-22 -70.937689 */
192*3b5e0d0fSSteve Kargl rc0u = LD80C(0xa1a091cf437a17ad, -7, -9.86494292470008707260e-3L),
193*3b5e0d0fSSteve Kargl rc1u = LD80C(0xbe79c5a978122b00, -1, -7.44045595049165939261e-1L),
194*3b5e0d0fSSteve Kargl rc2u = LD80C(0xdb26f9bbe31a2794, 3,  -1.36970155085888424425e+1L),
195*3b5e0d0fSSteve Kargl rc3u = LD80C(0xb5f69a38f5747ac8, 6,  -9.09816453742625888546e+1L),
196*3b5e0d0fSSteve Kargl rc4u = LD80C(0xd79676d970d0a21a, 7,  -2.15587750997584074147e+2L),
197*3b5e0d0fSSteve Kargl rc5u = LD80C(0xfe528153c45ec97c, 6,  -1.27161142938347796666e+2L),
198*3b5e0d0fSSteve Kargl sc1u = LD80C(0xc5e8cd46d5604a96, 4,   2.47386727842204312937e+1L),
199*3b5e0d0fSSteve Kargl sc2u = LD80C(0xc5f0f5a5484520eb, 7,   1.97941248254913378865e+2L),
200*3b5e0d0fSSteve Kargl sc3u = LD80C(0x964e3c7b34db9170, 9,   6.01222441484087787522e+2L),
201*3b5e0d0fSSteve Kargl sc4u = LD80C(0x99be1b89faa0596a, 9,   6.14970430845978077827e+2L),
202*3b5e0d0fSSteve Kargl sc5u = LD80C(0xf80dfcbf37ffc5ea, 6,   1.24027318931184605891e+2L);
203*3b5e0d0fSSteve Kargl #define rc0	(rc0u.e)
204*3b5e0d0fSSteve Kargl #define rc1	(rc1u.e)
205*3b5e0d0fSSteve Kargl #define rc2	(rc2u.e)
206*3b5e0d0fSSteve Kargl #define rc3	(rc3u.e)
207*3b5e0d0fSSteve Kargl #define rc4	(rc4u.e)
208*3b5e0d0fSSteve Kargl #define rc5	(rc5u.e)
209*3b5e0d0fSSteve Kargl #define sc1	(sc1u.e)
210*3b5e0d0fSSteve Kargl #define sc2	(sc2u.e)
211*3b5e0d0fSSteve Kargl #define sc3	(sc3u.e)
212*3b5e0d0fSSteve Kargl #define sc4	(sc4u.e)
213*3b5e0d0fSSteve Kargl #define sc5	(sc5u.e)
214*3b5e0d0fSSteve Kargl 
215*3b5e0d0fSSteve Kargl long double
erfl(long double x)216*3b5e0d0fSSteve Kargl erfl(long double x)
217*3b5e0d0fSSteve Kargl {
218*3b5e0d0fSSteve Kargl 	long double ax,R,S,P,Q,s,y,z,r;
219*3b5e0d0fSSteve Kargl 	uint64_t lx;
220*3b5e0d0fSSteve Kargl 	int32_t i;
221*3b5e0d0fSSteve Kargl 	uint16_t hx;
222*3b5e0d0fSSteve Kargl 
223*3b5e0d0fSSteve Kargl 	EXTRACT_LDBL80_WORDS(hx, lx, x);
224*3b5e0d0fSSteve Kargl 
225*3b5e0d0fSSteve Kargl 	if((hx & 0x7fff) == 0x7fff) {	/* erfl(nan)=nan */
226*3b5e0d0fSSteve Kargl 		i = (hx>>15)<<1;
227*3b5e0d0fSSteve Kargl 		return (1-i)+one/x;	/* erfl(+-inf)=+-1 */
228*3b5e0d0fSSteve Kargl 	}
229*3b5e0d0fSSteve Kargl 
230*3b5e0d0fSSteve Kargl 	ENTERI();
231*3b5e0d0fSSteve Kargl 
232*3b5e0d0fSSteve Kargl 	ax = fabsl(x);
233*3b5e0d0fSSteve Kargl 	if(ax < 0.84375) {
234*3b5e0d0fSSteve Kargl 	    if(ax < 0x1p-34L) {
235*3b5e0d0fSSteve Kargl 	        if(ax < 0x1p-16373L)
236*3b5e0d0fSSteve Kargl 		    RETURNI((8*x+efx8*x)/8);	/* avoid spurious underflow */
237*3b5e0d0fSSteve Kargl 		RETURNI(x + efx*x);
238*3b5e0d0fSSteve Kargl 	    }
239*3b5e0d0fSSteve Kargl 	    z = x*x;
240*3b5e0d0fSSteve Kargl 	    r = pp0+z*(pp1+z*(pp2+z*(pp3+z*(pp4+z*pp5))));
241*3b5e0d0fSSteve Kargl 	    s = one+z*(qq1+z*(qq2+z*(qq3+z*(qq4+z*(qq5+z*qq6)))));
242*3b5e0d0fSSteve Kargl 	    y = r/s;
243*3b5e0d0fSSteve Kargl 	    RETURNI(x + x*y);
244*3b5e0d0fSSteve Kargl 	}
245*3b5e0d0fSSteve Kargl 	if(ax < 1.25) {
246*3b5e0d0fSSteve Kargl 	    s = ax-one;
247*3b5e0d0fSSteve Kargl 	    P = pa0+s*(pa1+s*(pa2+s*(pa3+s*(pa4+s*(pa5+s*(pa6+s*pa7))))));
248*3b5e0d0fSSteve Kargl 	    Q = one+s*(qa1+s*(qa2+s*(qa3+s*(qa4+s*(qa5+s*(qa6+s*qa7))))));
249*3b5e0d0fSSteve Kargl 	    if(x>=0) RETURNI(erx + P/Q); else RETURNI(-erx - P/Q);
250*3b5e0d0fSSteve Kargl 	}
251*3b5e0d0fSSteve Kargl 	if(ax >= 7) {			/* inf>|x|>= 7 */
252*3b5e0d0fSSteve Kargl 	    if(x>=0) RETURNI(one-tiny); else RETURNI(tiny-one);
253*3b5e0d0fSSteve Kargl 	}
254*3b5e0d0fSSteve Kargl 	s = one/(ax*ax);
255*3b5e0d0fSSteve Kargl 	if(ax < 2.85715) {	/* |x| < 2.85715 */
256*3b5e0d0fSSteve Kargl 	    R=ra0+s*(ra1+s*(ra2+s*(ra3+s*(ra4+s*(ra5+s*(ra6+s*(ra7+
257*3b5e0d0fSSteve Kargl 		s*(ra8+s*ra9))))))));
258*3b5e0d0fSSteve Kargl 	    S=one+s*(sa1+s*(sa2+s*(sa3+s*(sa4+s*(sa5+s*(sa6+s*(sa7+
259*3b5e0d0fSSteve Kargl 		s*(sa8+s*sa9))))))));
260*3b5e0d0fSSteve Kargl 	} else {	/* |x| >= 2.85715 */
261*3b5e0d0fSSteve Kargl 	    R=rb0+s*(rb1+s*(rb2+s*(rb3+s*(rb4+s*(rb5+s*(rb6+s*rb7))))));
262*3b5e0d0fSSteve Kargl 	    S=one+s*(sb1+s*(sb2+s*(sb3+s*(sb4+s*(sb5+s*(sb6+s*sb7))))));
263*3b5e0d0fSSteve Kargl 	}
264*3b5e0d0fSSteve Kargl 	z=(float)ax;
265*3b5e0d0fSSteve Kargl 	r=expl(-z*z-0.5625)*expl((z-ax)*(z+ax)+R/S);
266*3b5e0d0fSSteve Kargl 	if(x>=0) RETURNI(one-r/ax); else RETURNI(r/ax-one);
267*3b5e0d0fSSteve Kargl }
268*3b5e0d0fSSteve Kargl 
269*3b5e0d0fSSteve Kargl long double
erfcl(long double x)270*3b5e0d0fSSteve Kargl erfcl(long double x)
271*3b5e0d0fSSteve Kargl {
272*3b5e0d0fSSteve Kargl 	long double ax,R,S,P,Q,s,y,z,r;
273*3b5e0d0fSSteve Kargl 	uint64_t lx;
274*3b5e0d0fSSteve Kargl 	uint16_t hx;
275*3b5e0d0fSSteve Kargl 
276*3b5e0d0fSSteve Kargl 	EXTRACT_LDBL80_WORDS(hx, lx, x);
277*3b5e0d0fSSteve Kargl 
278*3b5e0d0fSSteve Kargl 	if((hx & 0x7fff) == 0x7fff) {	/* erfcl(nan)=nan */
279*3b5e0d0fSSteve Kargl 					/* erfcl(+-inf)=0,2 */
280*3b5e0d0fSSteve Kargl 	    return ((hx>>15)<<1)+one/x;
281*3b5e0d0fSSteve Kargl 	}
282*3b5e0d0fSSteve Kargl 
283*3b5e0d0fSSteve Kargl 	ENTERI();
284*3b5e0d0fSSteve Kargl 
285*3b5e0d0fSSteve Kargl 	ax = fabsl(x);
286*3b5e0d0fSSteve Kargl 	if(ax < 0.84375L) {
287*3b5e0d0fSSteve Kargl 	    if(ax < 0x1p-34L)
288*3b5e0d0fSSteve Kargl 		RETURNI(one-x);
289*3b5e0d0fSSteve Kargl 	    z = x*x;
290*3b5e0d0fSSteve Kargl 	    r = pp0+z*(pp1+z*(pp2+z*(pp3+z*(pp4+z*pp5))));
291*3b5e0d0fSSteve Kargl 	    s = one+z*(qq1+z*(qq2+z*(qq3+z*(qq4+z*(qq5+z*qq6)))));
292*3b5e0d0fSSteve Kargl 	    y = r/s;
293*3b5e0d0fSSteve Kargl 	    if(ax < 0.25L) {  	/* x<1/4 */
294*3b5e0d0fSSteve Kargl 		RETURNI(one-(x+x*y));
295*3b5e0d0fSSteve Kargl 	    } else {
296*3b5e0d0fSSteve Kargl 		r = x*y;
297*3b5e0d0fSSteve Kargl 		r += (x-half);
298*3b5e0d0fSSteve Kargl 	       RETURNI(half - r);
299*3b5e0d0fSSteve Kargl 	    }
300*3b5e0d0fSSteve Kargl 	}
301*3b5e0d0fSSteve Kargl 	if(ax < 1.25L) {
302*3b5e0d0fSSteve Kargl 	    s = ax-one;
303*3b5e0d0fSSteve Kargl 	    P = pa0+s*(pa1+s*(pa2+s*(pa3+s*(pa4+s*(pa5+s*(pa6+s*pa7))))));
304*3b5e0d0fSSteve Kargl 	    Q = one+s*(qa1+s*(qa2+s*(qa3+s*(qa4+s*(qa5+s*(qa6+s*qa7))))));
305*3b5e0d0fSSteve Kargl 	    if(x>=0) {
306*3b5e0d0fSSteve Kargl 	        z  = one-erx; RETURNI(z - P/Q);
307*3b5e0d0fSSteve Kargl 	    } else {
308*3b5e0d0fSSteve Kargl 		z = (erx+P/Q); RETURNI(one+z);
309*3b5e0d0fSSteve Kargl 	    }
310*3b5e0d0fSSteve Kargl 	}
311*3b5e0d0fSSteve Kargl 
312*3b5e0d0fSSteve Kargl 	if(ax < 108) {			/* |x| < 108 */
313*3b5e0d0fSSteve Kargl  	    s = one/(ax*ax);
314*3b5e0d0fSSteve Kargl 	    if(ax < 2.85715) {		/* |x| < 2.85715 */
315*3b5e0d0fSSteve Kargl 		R=ra0+s*(ra1+s*(ra2+s*(ra3+s*(ra4+s*(ra5+s*(ra6+s*(ra7+
316*3b5e0d0fSSteve Kargl 		    s*(ra8+s*ra9))))))));
317*3b5e0d0fSSteve Kargl 		S=one+s*(sa1+s*(sa2+s*(sa3+s*(sa4+s*(sa5+s*(sa6+s*(sa7+
318*3b5e0d0fSSteve Kargl 		    s*(sa8+s*sa9))))))));
319*3b5e0d0fSSteve Kargl 	    } else if(ax < 7) {		/* | |x| < 7 */
320*3b5e0d0fSSteve Kargl 		R=rb0+s*(rb1+s*(rb2+s*(rb3+s*(rb4+s*(rb5+s*(rb6+s*rb7))))));
321*3b5e0d0fSSteve Kargl 		S=one+s*(sb1+s*(sb2+s*(sb3+s*(sb4+s*(sb5+s*(sb6+s*sb7))))));
322*3b5e0d0fSSteve Kargl 	    } else {
323*3b5e0d0fSSteve Kargl 		if(x < -7) RETURNI(two-tiny);/* x < -7 */
324*3b5e0d0fSSteve Kargl 		R=rc0+s*(rc1+s*(rc2+s*(rc3+s*(rc4+s*rc5))));
325*3b5e0d0fSSteve Kargl 		S=one+s*(sc1+s*(sc2+s*(sc3+s*(sc4+s*sc5))));
326*3b5e0d0fSSteve Kargl 	    }
327*3b5e0d0fSSteve Kargl 	    z = (float)ax;
328*3b5e0d0fSSteve Kargl 	    r = expl(-z*z-0.5625)*expl((z-ax)*(z+ax)+R/S);
329*3b5e0d0fSSteve Kargl 	    if(x>0) RETURNI(r/ax); else RETURNI(two-r/ax);
330*3b5e0d0fSSteve Kargl 	} else {
331*3b5e0d0fSSteve Kargl 	    if(x>0) RETURNI(tiny*tiny); else RETURNI(two-tiny);
332*3b5e0d0fSSteve Kargl 	}
333*3b5e0d0fSSteve Kargl }
334