Beispiel #1
0
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);
  }
}
Beispiel #2
0
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];
  }
}
Beispiel #3
0
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);
	}
    }
}
Beispiel #4
0
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);
    }
}
Beispiel #5
0
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);
    }
}
Beispiel #6
0
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);
 }
}
Beispiel #7
0
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);
  }
}
Beispiel #8
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);
    }
  }
}
Beispiel #9
0
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);
    }
}
Beispiel #10
0
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);
    }
}
Beispiel #11
0
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);
 }
}
Beispiel #12
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);
    }
}