#include <float.h>
#include "fpmath.h"
#include "math.h"
#include "math_private.h"
static const volatile long double tiny = 0x1p-10000L;
static const double
half= 0.5,
one = 1,
two = 2;
static const long double
efx = 1.28379167095512573896158903121545167e-01L,
efx8 = 1.02703333676410059116927122497236133e+00L,
pp0 = 1.28379167095512573896158903121545167e-01L,
pp1 = -3.14931554396568573802046931159683404e-01L,
pp2 = -5.27514920282183487103576956956725309e-02L,
pp3 = -1.13202828509005281355609495523452713e-02L,
pp4 = -9.18626155872522453865998391206048506e-04L,
pp5 = -7.87518862406176274922506447157284230e-05L,
pp6 = -3.42357944472240436548115331090560881e-06L,
pp7 = -1.37317432573890412634717890726745428e-07L,
pp8 = -2.71115170113861755855049008732113726e-09L,
pp9 = -3.37925756196555959454018189718117864e-11L,
qq1 = 4.76672625471551170489978555182449450e-01L,
qq2 = 1.06713144672281502058807525850732240e-01L,
qq3 = 1.47747613127513761102189201923147490e-02L,
qq4 = 1.39939377672028671891148770908874816e-03L,
qq5 = 9.44302939359455241271983309378738276e-05L,
qq6 = 4.56199342312522842161301671745365650e-06L,
qq7 = 1.53019260483764773845294600092361197e-07L,
qq8 = 3.25542691121324805094777901250005508e-09L,
qq9 = 3.37405581964478060434410167262684979e-11L;
static const long double
erx = 8.42700792949714894142232424201210961e-01L,
pa0 = -2.48010117891186017024438233323795897e-17L,
pa1 = 4.15107497420594680894327969504526489e-01L,
pa2 = -3.94180628087084846724448515851892609e-02L,
pa3 = 4.48897599625192107295954790681677462e-02L,
pa4 = 8.02069252143016600110972019232995528e-02L,
pa5 = -1.02729816533435279443621120242391295e-02L,
pa6 = 5.70777694530755634864821094419982095e-03L,
pa7 = 1.22635150233075521018231779267077071e-03L,
pa8 = 5.36100234820204569428412542856666503e-04L,
pa9 = -1.97753571846365167177187858667583165e-04L,
pa10 = 6.19333039900846970674794789568415105e-05L,
pa11 = -5.40531400436645861492290270311751349e-06L,
qa1 = 9.05041313265490487793231810291907851e-01L,
qa2 = 6.79848064708886864767240880834868092e-01L,
qa3 = 4.04720609926471677581066689316516445e-01L,
qa4 = 1.69183273898369996364661075664302225e-01L,
qa5 = 7.44476185988067992342479750486764248e-02L,
qa6 = 2.02981172725892407200420389604788573e-02L,
qa7 = 6.94281866271607668268269403102277234e-03L,
qa8 = 1.12952275469171559611651594706820034e-03L,
qa9 = 3.13736683241992737197226578597710179e-04L,
qa10 = 1.17037675204033225470121134087771410e-05L,
qa11 = 4.61312518293853991439362806880973592e-06L,
qa12 = -1.02158572037456893687737553657431771e-06L;
static const long double
ra0 = -9.86494292470069009555706994426014461e-03L,
ra1 = -1.13580436992565640457579040117568870e+00L,
ra2 = -4.89744330295291950661185707066921755e+01L,
ra3 = -1.10766149300215937173768072715352140e+03L,
ra4 = -1.49991031232170934967642795601952100e+04L,
ra5 = -1.29805749738318462882524181556996692e+05L,
ra6 = -7.42828497044940065828871976644647850e+05L,
ra7 = -2.85637299581890734287995171242421106e+06L,
ra8 = -7.40674797129824999383748865571026084e+06L,
ra9 = -1.28653420911930973914078724204151759e+07L,
ra10 = -1.47198163599330179552932489109452638e+07L,
ra11 = -1.07812992258382800318665248311522624e+07L,
ra12 = -4.83545565681708642630419905537756076e+06L,
ra13 = -1.23956521201673964822976917356685286e+06L,
ra14 = -1.62289333553652417591275333240371812e+05L,
ra15 = -8.82890392601176969729168894389833110e+03L,
ra16 = -1.22591866337261720023681535568334619e+02L,
sa1 = 6.44508918884710829371852723353794047e+01L,
sa2 = 1.76118475473171481523704824327358534e+03L,
sa3 = 2.69448346969488374857087646131950188e+04L,
sa4 = 2.56826633369941456778326497384543763e+05L,
sa5 = 1.60647413092257206847700054645905859e+06L,
sa6 = 6.76963075165099718574753447122393797e+06L,
sa7 = 1.94295690905361884290986932493647741e+07L,
sa8 = 3.79774781017759149060839255547073541e+07L,
sa9 = 5.00659831846029484248302236457727397e+07L,
sa10 = 4.36486287620506484276130525941972541e+07L,
sa11 = 2.43779678791333894255510508253951934e+07L,
sa12 = 8.30732360384443202039372372212966542e+06L,
sa13 = 1.60160846942050515734192397495105693e+06L,
sa14 = 1.54255505242533291014555153757001825e+05L,
sa15 = 5.87949220002375547561467275493888824e+03L,
sa16 = 4.97272976346793193860385983372237710e+01L;
static const long double
rb0 = -9.86494292470008707171371994479162369e-3L,
rb1 = -1.57047326624110727986326503729442830L,
rb2 = -1.03228196364885474342132255440317065e2L,
rb3 = -3.74000570653418227179358710865224376e3L,
rb4 = -8.35435477739098044190860390632813956e4L,
rb5 = -1.21398672055223642118716640216747152e6L,
rb6 = -1.17669175877248796101665344873273970e7L,
rb7 = -7.66108006086998253606773064264599615e7L,
rb8 = -3.32547117558141845968704725353130804e8L,
rb9 = -9.41561252426350696802167711221739746e8L,
rb10 = -1.67157110805390944549427329626281063e9L,
rb11 = -1.74339631004410841337645931421427373e9L,
rb12 = -9.57655233596934915727573141357471703e8L,
rb13 = -2.26320062731339353035254704082495066e8L,
rb14 = -1.42777302996263256686002973851837039e7L,
sb1 = 1.08512869705594540211033733976348506e2L,
sb2 = 5.02757713761390460534494530537572834e3L,
sb3 = 1.31019107205412870059331647078328430e5L,
sb4 = 2.13021555152296846166736757455018030e6L,
sb5 = 2.26649105281820861953868568619768286e7L,
sb6 = 1.61071939490875921812318684143076081e8L,
sb7 = 7.66895673844301852676056750497991966e8L,
sb8 = 2.41884450436101936436023058196042526e9L,
sb9 = 4.92403055884071695093305291535107666e9L,
sb10 = 6.18627786365587486459633615573786416e9L,
sb11 = 4.45898013426501378097430226324743199e9L,
sb12 = 1.63006115763329848117160344854224975e9L,
sb13 = 2.39216717012421697446304015847567721e8L,
sb14 = 7.84837329009278694937250358810225609e6L;
static const long double
rc0 = -9.86494292470008707171367567652935673e-3L,
rc1 = -1.26229447747315096406518846411562266L,
rc2 = -6.13742634438922591780742637728666162e1L,
rc3 = -1.50455835478908280402912854338421517e3L,
rc4 = -2.04415631865861549920184039902945685e4L,
rc5 = -1.57625662981714582753490610560037638e5L,
rc6 = -6.73473451616752528402917538033283794e5L,
rc7 = -1.47433165421387483167186683764364857e6L,
rc8 = -1.38811981807868828563794929997744139e6L,
rc9 = -3.59659700530831825640766479698155060e5L,
sc1 = 7.72730753022908298637508998072635696e1L,
sc2 = 2.36825757341694050500333261769082182e3L,
sc3 = 3.72210540173034735352888847134073099e4L,
sc4 = 3.24136032646418336712461033591393412e5L,
sc5 = 1.57836135851134393802505823370009175e6L,
sc6 = 4.12881981392063738026679089714182355e6L,
sc7 = 5.24438427289213488410596395361544142e6L,
sc8 = 2.59909544563616121735963429710382149e6L,
sc9 = 2.80930665169282501639651995082335693e5L;
long double
erfl(long double x)
{
long double ax,R,S,P,Q,s,y,z,r;
uint64_t lx, llx;
int32_t i;
uint16_t hx;
EXTRACT_LDBL128_WORDS(hx, lx, llx, x);
if((hx & 0x7fff) == 0x7fff) {
i = (hx>>15)<<1;
return (1-i)+one/x;
}
ax = fabsl(x);
if(ax < 0.84375) {
if(ax < 0x1p-40L) {
if(ax < 0x1p-16373L)
return (8*x+efx8*x)/8;
return x + efx*x;
}
z = x*x;
r = pp0+z*(pp1+z*(pp2+z*(pp3+z*(pp4+z*(pp5+z*(pp6+z*(pp7+
z*(pp8+z*pp9))))))));
s = one+z*(qq1+z*(qq2+z*(qq3+z*(qq4+z*(qq5+z*(qq6+z*(qq7+
z*(qq8+z*qq9))))))));
y = r/s;
return x + x*y;
}
if(ax < 1.25) {
s = ax-one;
P = pa0+s*(pa1+s*(pa2+s*(pa3+s*(pa4+s*(pa5+s*(pa6+s*(pa7+
s*(pa8+s*(pa9+s*(pa10+s*pa11))))))))));
Q = one+s*(qa1+s*(qa2+s*(qa3+s*(qa4+s*(qa5+s*(qa6+s*(qa7+
s*(qa8+s*(qa9+s*(qa10+s*(qa11+s*qa12)))))))))));
if(x>=0) return (erx + P/Q); else return (-erx - P/Q);
}
if (ax >= 9) {
if(x>=0) return (one-tiny); else return (tiny-one);
}
s = one/(ax*ax);
if(ax < 2.85715) {
R=ra0+s*(ra1+s*(ra2+s*(ra3+s*(ra4+s*(ra5+s*(ra6+s*(ra7+
s*(ra8+s*(ra9+s*(ra10+s*(ra11+s*(ra12+s*(ra13+s*(ra14+
s*(ra15+s*ra16)))))))))))))));
S=one+s*(sa1+s*(sa2+s*(sa3+s*(sa4+s*(sa5+s*(sa6+s*(sa7+
s*(sa8+s*(sa9+s*(sa10+s*(sa11+s*(sa12+s*(sa13+s*(sa14+
s*(sa15+s*sa16)))))))))))))));
} else {
R=rb0+s*(rb1+s*(rb2+s*(rb3+s*(rb4+s*(rb5+s*(rb6+s*(rb7+
s*(rb8+s*(rb9+s*(rb10+s*(rb11+s*(rb12+s*(rb13+
s*rb14)))))))))))));
S=one+s*(sb1+s*(sb2+s*(sb3+s*(sb4+s*(sb5+s*(sb6+s*(sb7+
s*(sb8+s*(sb9+s*(sb10+s*(sb11+s*(sb12+s*(sb13+
s*sb14)))))))))))));
}
z = (float)ax;
r = expl(-z*z-0.5625)*expl((z-ax)*(z+ax)+R/S);
if(x>=0) return (one-r/ax); else return (r/ax-one);
}
long double
erfcl(long double x)
{
long double ax,R,S,P,Q,s,y,z,r;
uint64_t lx, llx;
uint16_t hx;
EXTRACT_LDBL128_WORDS(hx, lx, llx, x);
if((hx & 0x7fff) == 0x7fff) {
return ((hx>>15)<<1)+one/x;
}
ax = fabsl(x);
if(ax < 0.84375L) {
if(ax < 0x1p-34L)
return one-x;
z = x*x;
r = pp0+z*(pp1+z*(pp2+z*(pp3+z*(pp4+z*(pp5+z*(pp6+z*(pp7+
z*(pp8+z*pp9))))))));
s = one+z*(qq1+z*(qq2+z*(qq3+z*(qq4+z*(qq5+z*(qq6+z*(qq7+
z*(qq8+z*qq9))))))));
y = r/s;
if(ax < 0.25L) {
return one-(x+x*y);
} else {
r = x*y;
r += (x-half);
return half - r;
}
}
if(ax < 1.25L) {
s = ax-one;
P = pa0+s*(pa1+s*(pa2+s*(pa3+s*(pa4+s*(pa5+s*(pa6+s*(pa7+
s*(pa8+s*(pa9+s*(pa10+s*pa11))))))))));
Q = one+s*(qa1+s*(qa2+s*(qa3+s*(qa4+s*(qa5+s*(qa6+s*(qa7+
s*(qa8+s*(qa9+s*(qa10+s*(qa11+s*qa12)))))))))));
if(x>=0) {
z = one-erx; return z - P/Q;
} else {
z = erx+P/Q; return one+z;
}
}
if(ax < 108) {
s = one/(ax*ax);
if(ax < 2.85715) {
R=ra0+s*(ra1+s*(ra2+s*(ra3+s*(ra4+s*(ra5+s*(ra6+s*(ra7+
s*(ra8+s*(ra9+s*(ra10+s*(ra11+s*(ra12+s*(ra13+s*(ra14+
s*(ra15+s*ra16)))))))))))))));
S=one+s*(sa1+s*(sa2+s*(sa3+s*(sa4+s*(sa5+s*(sa6+s*(sa7+
s*(sa8+s*(sa9+s*(sa10+s*(sa11+s*(sa12+s*(sa13+s*(sa14+
s*(sa15+s*sa16)))))))))))))));
} else if(ax < 9) {
R=rb0+s*(rb1+s*(rb2+s*(rb3+s*(rb4+s*(rb5+s*(rb6+s*(rb7+
s*(rb8+s*(rb9+s*(rb10+s*(rb11+s*(rb12+s*(rb13+
s*rb14)))))))))))));
S=one+s*(sb1+s*(sb2+s*(sb3+s*(sb4+s*(sb5+s*(sb6+s*(sb7+
s*(sb8+s*(sb9+s*(sb10+s*(sb11+s*(sb12+s*(sb13+
s*sb14)))))))))))));
} else {
if(x < -9) return two-tiny;
R=rc0+s*(rc1+s*(rc2+s*(rc3+s*(rc4+s*(rc5+s*(rc6+s*(rc7+
s*(rc8+s*rc9))))))));
S=one+s*(sc1+s*(sc2+s*(sc3+s*(sc4+s*(sc5+s*(sc6+s*(sc7+
s*(sc8+s*sc9))))))));
}
z = (float)ax;
r = expl(-z*z-0.5625)*expl((z-ax)*(z+ax)+R/S);
if(x>0) return r/ax; else return two-r/ax;
} else {
if(x>0) return tiny*tiny; else return two-tiny;
}
}