示例#1
0
static double
SECTION
csloww2 (double x, double dx, double orig, int n)
{
  mynumber u;
  double w[2], y, cor, res;

  u.x = big + x;
  y = x - (u.x - big);
  res = do_cos_slow (u, y, dx, 3.1e-30 * fabs (orig), &cor);

  if (res == res + cor)
    return (n) ? -res : res;
  else
    {
      __docos (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 (n) ? -w[0] : w[0];
      else
	return __mpcos (orig, 0, true);
    }
}
示例#2
0
static double
SECTION
bsloww2 (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_cos_slow (u, y, dx, 1.1e-24, &cor);
  if (res == res + cor)
    return (n & 2) ? -res : res;
  else
    {
      __docos (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 (n & 2) ? -w[0] : w[0];
      else
	return (n & 1) ? __mpsin (orig, 0, true) : __mpcos (orig, 0, true);
    }
}
示例#3
0
static double cslow2(double x) {
  mynumber u;
  double sn,ssn,cs,ccs,s,c,w[2],y,y1,y2,e1,e2,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];
  ssn=sincos.x[k+1];
  cs=sincos.x[k+2];
  ccs=sincos.x[k+3];
  y1 = (y+t22)-t22;
  y2 = y - y1;
  e1 = (sn+t22)-t22;
  e2=(sn-e1)+ssn;
  cor=(ccs-cs*c-e1*y2-e2*y)-sn*s;
  y=cs-e1*y1;
  cor = cor+((cs-y)-e1*y1);
  res=y+cor;
  cor=(y-res)+cor;
  if (res == res+1.0005*cor)
    return res;
  else {
    y=ABS(x);
    __docos(y,0,w);
    if (w[0] == w[0]+1.000000005*w[1]) return w[0];
    else return __mpcos(x,0);
  }
}
示例#4
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);
    }
}
示例#5
0
static double
SECTION
cslow2 (double x)
{
  mynumber u;
  double w[2], y, cor, res;

  y = fabs (x);
  u.x = big + y;
  y = y - (u.x - big);
  res = do_cos_slow (u, y, 0, 0, &cor);
  if (res == res + cor)
    return res;
  else
    {
      y = fabs (x);
      __docos (y, 0, w);
      if (w[0] == w[0] + 1.000000005 * w[1])
	return w[0];
      else
	return __mpcos (x, 0, false);
    }
}
示例#6
0
static double
SECTION
csloww (double x, double dx, double orig)
{
  double y, t, res, cor, w[2], a, da, xn;
  mynumber v;
  int4 n;

  /* Taylor series */
  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 == 1)
	    {
	      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 __mpcos (orig, 0, true);
	}
    }
}