Home | History | Annotate | Line # | Download | only in math
      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