static double bsloww(double x,double dx, double orig,int n) { static const double th2_36 = 206158430208.0; /* 1.5*2**37 */ double y,x1,x2,xx,r,t,res,cor,w[2]; #if 0 double a,da,xn; union {int4 i[2]; double x;} v; #endif x1=(x+th2_36)-th2_36; y = aa.x*x1*x1*x1; r=x+y; x2=(x-x1)+dx; xx=x*x; t = (((((s5.x*xx + s4.x)*xx + s3.x)*xx + s2.x)*xx + bb.x)*xx + 3.0*aa.x*x1*x2)*x +aa.x*x2*x2*x2+dx; t=((x-r)+y)+t; res=r+t; cor = (r-res)+t; cor = (cor>0)? 1.0005*cor+1.1e-24 : 1.0005*cor-1.1e-24; if (res == res + cor) return res; else { (x>0)? __dubsin(x,dx,w) : __dubsin(-x,-dx,w); cor = (w[1]>0)? 1.000000001*w[1] + 1.1e-24 : 1.000000001*w[1] - 1.1e-24; if (w[0] == w[0]+cor) return (x>0)?w[0]:-w[0]; else return (n&1)?__mpcos1(orig):__mpsin1(orig); } }
void __docos(double x, double dx, double v[]) { double y,yy,p,w[2]; if (x>0) {y=x; yy=dx;} else {y=-x; yy=-dx;} if (y<0.5*hp0.x) /* y< PI/4 */ {__dubcos(y,yy,w); v[0]=w[0]; v[1]=w[1];} else if (y<1.5*hp0.x) { /* y< 3/4 * PI */ p=hp0.x-y; /* p = PI/2 - y */ yy=hp1.x-yy; y=p+yy; yy=(p-y)+yy; if (y>0) {__dubsin(y,yy,w); v[0]=w[0]; v[1]=w[1];} /* cos(x) = sin ( 90 - x ) */ else {__dubsin(-y,-yy,w); v[0]=-w[0]; v[1]=-w[1]; } } else { /* y>= 3/4 * PI */ p=2.0*hp0.x-y; /* p = PI- y */ yy=2.0*hp1.x-yy; y=p+yy; yy=(p-y)+yy; __dubcos(y,yy,w); v[0]=-w[0]; v[1]=-w[1]; } }
static double SECTION sloww (double x, double dx, double orig) { double y, t, res, cor, w[2], a, da, xn; mynumber v; int4 n; res = TAYLOR_SLOW (x, dx, cor); if (cor > 0) cor = 1.0005 * cor + fabs (orig) * 3.1e-30; else cor = 1.0005 * cor - fabs (orig) * 3.1e-30; if (res == res + cor) return res; else { (x > 0) ? __dubsin (x, dx, w) : __dubsin (-x, -dx, w); if (w[1] > 0) cor = 1.000000001 * w[1] + fabs (orig) * 1.1e-30; else cor = 1.000000001 * w[1] - fabs (orig) * 1.1e-30; if (w[0] == w[0] + cor) return (x > 0) ? w[0] : -w[0]; else { t = (orig * hpinv + toint); xn = t - toint; v.x = t; y = (orig - xn * mp1) - xn * mp2; n = v.i[LOW_HALF] & 3; da = xn * pp3; t = y - da; da = (y - t) - da; y = xn * pp4; a = t - y; da = ((t - a) - y) + da; if (n & 2) { a = -a; da = -da; } (a > 0) ? __dubsin (a, da, w) : __dubsin (-a, -da, w); if (w[1] > 0) cor = 1.000000001 * w[1] + fabs (orig) * 1.1e-40; else cor = 1.000000001 * w[1] - fabs (orig) * 1.1e-40; if (w[0] == w[0] + cor) return (a > 0) ? w[0] : -w[0]; else return __mpsin (orig, 0, true); } } }
static double SECTION sloww1 (double x, double dx, double orig, int m) { mynumber u; double w[2], y, cor, res; u.x = big + x; y = x - (u.x - big); res = do_sin_slow (u, y, dx, 3.1e-30 * fabs (orig), &cor); if (res == res + cor) return (m > 0) ? res : -res; else { __dubsin (x, dx, w); if (w[1] > 0) cor = 1.000000005 * w[1] + 1.1e-30 * fabs (orig); else cor = 1.000000005 * w[1] - 1.1e-30 * fabs (orig); if (w[0] == w[0] + cor) return (m > 0) ? w[0] : -w[0]; else return __mpsin (orig, 0, true); } }
static double SECTION bsloww1 (double x, double dx, double orig, int n) { mynumber u; double w[2], y, cor, res; y = fabs (x); u.x = big + y; y = y - (u.x - big); dx = (x > 0) ? dx : -dx; res = do_sin_slow (u, y, dx, 1.1e-24, &cor); if (res == res + cor) return (x > 0) ? res : -res; else { __dubsin (fabs (x), dx, w); if (w[1] > 0) cor = 1.000000005 * w[1] + 1.1e-24; else cor = 1.000000005 * w[1] - 1.1e-24; if (w[0] == w[0] + cor) return (x > 0) ? w[0] : -w[0]; else return (n & 1) ? __mpcos (orig, 0, true) : __mpsin (orig, 0, true); } }
static double bsloww1(double x, double dx, double orig,int n) { mynumber u; double sn,ssn,cs,ccs,s,c,w[2],y,y1,y2,c1,c2,xx,cor,res; static const double t22 = 6291456.0; int4 k; y=ABS(x); u.x=big.x+y; y=y-(u.x-big.x); dx=(x>0)?dx:-dx; xx=y*y; s = y*xx*(sn3 +xx*sn5); c = xx*(cs2 +xx*(cs4 + xx*cs6)); k=u.i[LOW_HALF]<<2; sn=sincos.x[k]; ssn=sincos.x[k+1]; cs=sincos.x[k+2]; ccs=sincos.x[k+3]; y1 = (y+t22)-t22; y2 = (y - y1)+dx; c1 = (cs+t22)-t22; c2=(cs-c1)+ccs; cor=(ssn+s*ccs+cs*s+c2*y+c1*y2-sn*y*dx)-sn*c; y=sn+c1*y1; cor = cor+((sn-y)+c1*y1); res=y+cor; cor=(y-res)+cor; cor = (cor>0)? 1.0005*cor+1.1e-24 : 1.0005*cor-1.1e-24; if (res == res + cor) return (x>0)?res:-res; else { __dubsin(ABS(x),dx,w); cor = (w[1]>0)? 1.000000005*w[1]+1.1e-24: 1.000000005*w[1]-1.1e-24; if (w[0] == w[0]+cor) return (x>0)?w[0]:-w[0]; else return (n&1)?__mpcos1(orig):__mpsin1(orig); } }
static double slow1(double x) { mynumber u; double sn,ssn,cs,ccs,s,c,w[2],y,y1,y2,c1,c2,xx,cor,res; static const double t22 = 6291456.0; int4 k; y=ABS(x); u.x=big.x+y; y=y-(u.x-big.x); xx=y*y; s = y*xx*(sn3 +xx*sn5); c = xx*(cs2 +xx*(cs4 + xx*cs6)); k=u.i[LOW_HALF]<<2; sn=sincos.x[k]; /* Data */ ssn=sincos.x[k+1]; /* from */ cs=sincos.x[k+2]; /* tables */ ccs=sincos.x[k+3]; /* sincos.tbl */ y1 = (y+t22)-t22; y2 = y - y1; c1 = (cs+t22)-t22; c2=(cs-c1)+ccs; cor=(ssn+s*ccs+cs*s+c2*y+c1*y2)-sn*c; y=sn+c1*y1; cor = cor+((sn-y)+c1*y1); res=y+cor; cor=(y-res)+cor; if (res == res+1.0005*cor) return (x>0)?res:-res; else { __dubsin(ABS(x),0,w); if (w[0] == w[0]+1.000000005*w[1]) return (x>0)?w[0]:-w[0]; else return (x>0)?__mpsin(x,0):-__mpsin(-x,0); } }
static double csloww(double x,double dx, double orig) { static const double th2_36 = 206158430208.0; /* 1.5*2**37 */ double y,x1,x2,xx,r,t,res,cor,w[2],a,da,xn; union {int4 i[2]; double x;} v; int4 n; x1=(x+th2_36)-th2_36; y = aa.x*x1*x1*x1; r=x+y; x2=(x-x1)+dx; xx=x*x; /* Taylor series */ t = (((((s5.x*xx + s4.x)*xx + s3.x)*xx + s2.x)*xx + bb.x)*xx + 3.0*aa.x*x1*x2)*x +aa.x*x2*x2*x2+dx; t=((x-r)+y)+t; res=r+t; cor = (r-res)+t; cor = (cor>0)? 1.0005*cor+ABS(orig)*3.1e-30 : 1.0005*cor-ABS(orig)*3.1e-30; if (res == res + cor) return res; else { (x>0)? __dubsin(x,dx,w) : __dubsin(-x,-dx,w); cor = (w[1]>0)? 1.000000001*w[1] + ABS(orig)*1.1e-30 : 1.000000001*w[1] - ABS(orig)*1.1e-30; if (w[0] == w[0]+cor) return (x>0)?w[0]:-w[0]; else { t = (orig*hpinv.x + toint.x); xn = t - toint.x; v.x = t; y = (orig - xn*mp1.x) - xn*mp2.x; n =v.i[LOW_HALF]&3; da = xn*pp3.x; t=y-da; da = (y-t)-da; y = xn*pp4.x; a = t - y; da = ((t-a)-y)+da; if (n==1) {a=-a; da=-da;} (a>0)? __dubsin(a,da,w) : __dubsin(-a,-da,w); cor = (w[1]>0)? 1.000000001*w[1] + ABS(orig)*1.1e-40 : 1.000000001*w[1] - ABS(orig)*1.1e-40; if (w[0] == w[0]+cor) return (a>0)?w[0]:-w[0]; else return __mpcos1(orig); } } }
static double SECTION bsloww (double x, double dx, double orig, int n) { double res, cor, w[2]; res = TAYLOR_SLOW (x, dx, cor); cor = (cor > 0) ? 1.0005 * cor + 1.1e-24 : 1.0005 * cor - 1.1e-24; if (res == res + cor) return res; else { (x > 0) ? __dubsin (x, dx, w) : __dubsin (-x, -dx, w); if (w[1] > 0) cor = 1.000000001 * w[1] + 1.1e-24; else cor = 1.000000001 * w[1] - 1.1e-24; if (w[0] == w[0] + cor) return (x > 0) ? w[0] : -w[0]; else return (n & 1) ? __mpcos (orig, 0, true) : __mpsin (orig, 0, true); } }
static double SECTION slow (double x) { double res, cor, w[2]; res = TAYLOR_SLOW (x, 0, cor); if (res == res + 1.0007 * cor) return res; else { __dubsin (fabs (x), 0, w); if (w[0] == w[0] + 1.000000001 * w[1]) return (x > 0) ? w[0] : -w[0]; else return (x > 0) ? __mpsin (x, 0, false) : -__mpsin (-x, 0, false); } }
static double slow(double x) { static const double th2_36 = 206158430208.0; /* 1.5*2**37 */ double y,x1,x2,xx,r,t,res,cor,w[2]; x1=(x+th2_36)-th2_36; y = aa.x*x1*x1*x1; r=x+y; x2=x-x1; xx=x*x; t = (((((s5.x*xx + s4.x)*xx + s3.x)*xx + s2.x)*xx + bb.x)*xx + 3.0*aa.x*x1*x2)*x +aa.x*x2*x2*x2; t=((x-r)+y)+t; res=r+t; cor = (r-res)+t; if (res == res + 1.0007*cor) return res; else { __dubsin(ABS(x),0,w); if (w[0] == w[0]+1.000000001*w[1]) return (x>0)?w[0]:-w[0]; else return (x>0)?__mpsin(x,0):-__mpsin(-x,0); } }
static double SECTION slow1 (double x) { mynumber u; double w[2], y, cor, res; y = fabs (x); u.x = big + y; y = y - (u.x - big); res = do_sin_slow (u, y, 0, 0, &cor); if (res == res + cor) return (x > 0) ? res : -res; else { __dubsin (fabs (x), 0, w); if (w[0] == w[0] + 1.000000005 * w[1]) return (x > 0) ? w[0] : -w[0]; else return (x > 0) ? __mpsin (x, 0, false) : -__mpsin (-x, 0, false); } }