int remainder_pio2_kernel(double *x, double *y, int e0, int nx, int prec, const int *ipio2) {
  int jz, jx, jv, jp, jk, carry, n, iq[20], i, j, k, m, q0, ih;
  double z, fw, f[20], fq[20], q[20];

  /* initialize jk*/
  jk = init_jk[prec];
  jp = jk;

  /* determine jx,jv,q0, note that 3>q0 */
  jx =  nx - 1;
  jv = (e0 - 3) / 24;
  if (jv < 0) {
    jv = 0;
  }
  q0 =  e0 - 24 * (jv + 1);

  /* set up f[0] to f[jx+jk] where f[jx+jk] = ipio2[jv+jk] */
  j = jv - jx;
  m = jx + jk;
  for (i = 0; i <= m; i++, j++) {
    f[i] = (j < 0) ? zero_kr : jvm_i2d(ipio2[j]);
  }

  /* compute q[0],q[1],...q[jk] */
  for (i=0; i <= jk; i++) {
    for(j = 0, fw = 0.0; j <= jx; j++) {
      fw = jvm_dadd(fw, jvm_dmul(x[j], f[jx + i - j]));
    }
    q[i] = fw;
  }

  jz = jk;
recompute:
  /* distill q[] into iq[] reversingly */
  for(i = 0, j = jz, z = q[jz]; j > 0; i++,j--) {
    fw    =  jvm_i2d(jvm_d2i(jvm_dmul(twon24, z)));
    iq[i] =  jvm_d2i(jvm_dsub(z, jvm_dmul(two24_kr, fw)));
    z     =  jvm_dadd(q[j-1], fw);
  }

  /* compute n */
  z  = jvm_fplib_scalbn(z,q0);       /* actual value of z */
  z  = jvm_dsub(z, jvm_dmul(8.0, jvm_fplib_floor(jvm_dmul(z,0.125))));     /* trim off integer >= 8 */
  n  = jvm_d2i(z);
  z  = jvm_dsub(z, jvm_i2d(n));
  ih = 0;
  if(q0 > 0) {  /* need iq[jz-1] to determine n */
    i  = (iq[jz-1] >> (24 - q0));
    n += i;
    iq[jz - 1] -= i << (24 - q0);
    ih = iq[jz - 1] >> (23 - q0);
  } else if (q0 == 0) {
Exemplo n.º 2
0
double tangent_kernel(double x, double y, int iy) {
  double z, r, v, w, s;
  int ix, hx;
  hx = __JHI(x);   /* high word of x */
  ix = hx & 0x7fffffff; /* high word of |x| */
  if (ix < 0x3e300000) {           /* x < 2**-28 */
    if (jvm_d2i(x) == 0) {            /* generate inexact */
      if (((ix | __JLO(x)) | (iy + 1)) == 0) {
        return jvm_ddiv(one_t, jvm_fplib_fabs(x));
      } else {
        return (iy == 1)? x: jvm_ddiv(jvm_dneg(one_t), x);
      }
    }
  }
  if (ix >= 0x3FE59428) {            /* |x|>=0.6744 */
    if (hx < 0) {
      x = jvm_dneg(x);
      y = jvm_dneg(y);
    }
    z = jvm_dsub(pio4, x);
    w = jvm_dsub(pio4lo, y);
    x = jvm_dadd(z, w);
    y = 0.0;
  }
  z =  jvm_dmul(x, x);
  w =  jvm_dmul(z, z);
  /* Break x^5*(T[1]+x^2*T[2]+...) into
   *    x^5(T[1]+x^4*T[3]+...+x^20*T[11]) +
   *    x^5(x^2*(T[2]+x^4*T[4]+...+x^22*[T12]))
   */
  //r = T[1]+w*(T[3]+w*(T[5]+w*(T[7]+w*(T[9]+w*T[11]))));
  r = jvm_dadd(T[1], jvm_dmul(w, jvm_dadd(T[3], jvm_dmul(w, jvm_dadd(T[5], jvm_dmul(w, jvm_dadd(T[7], jvm_dmul(w, jvm_dadd(T[9], jvm_dmul(w, T[11]))))))))));
  //v = z*(T[2]+w*(T[4]+w*(T[6]+w*(T[8]+w*(T[10]+w*T[12])))));
  v = jvm_dmul(z, jvm_dadd(T[2], jvm_dmul(w, jvm_dadd(T[4], jvm_dmul(w, jvm_dadd(T[6], jvm_dmul(w, jvm_dadd(T[8], jvm_dmul(w, jvm_dadd(T[10], jvm_dmul(w, T[12])))))))))));
  s = jvm_dmul(z, x);
  r = jvm_dadd(y, jvm_dmul(z, jvm_dmul(s, jvm_dadd(jvm_dadd(r, v), y))));
  r = jvm_dadd(r, jvm_dmul(T[0], s));
  w = jvm_dadd(x, r);
  if(ix >= 0x3FE59428) {
    v = jvm_i2d(iy);
    return jvm_dmul(jvm_i2d((1 - ((hx >> 30) & 2))),
     jvm_dsub(v, jvm_dmul(2.0, jvm_dsub(x, jvm_dsub(jvm_dmul(w, jvm_ddiv( w, jvm_dadd(w, v))), r)))));
  }
Exemplo n.º 3
0
double jvm_fplib_acos(double x) {
  double z,p,q,r,w,s,c,df;
  int hx,ix;
  hx = __JHI(x);
  ix = hx&0x7fffffff;
  if(ix>=0x3ff00000) {	/* |x| >= 1 */
    if(((ix-0x3ff00000)|__JLO(x))==0) {	/* |x|==1 */
      if(hx>0) return 0.0;		/* acos(1) = 0  */
      else return ac_pi+2.0*ac_pio2_lo;	/* acos(-1)= pi */
    }
    return jvm_ddiv(jvm_dsub(x, x), jvm_dsub(x, x));		/* acos(|x|>1) is NaN */
  }
  if(ix<0x3fe00000) {	/* |x| < 0.5 */
    if(ix<=0x3c600000) return ac_pio2_hi+ac_pio2_lo;/*if|x|<2**-57*/
    z = jvm_dmul(x, x);
    p = jvm_dmul(z, jvm_dadd(ac_pS0, jvm_dmul(z, jvm_dadd(ac_pS1, jvm_dmul(z, jvm_dadd(ac_pS2, jvm_dmul(z, jvm_dadd(ac_pS3, jvm_dmul(z, jvm_dadd(ac_pS4, jvm_dmul(z, ac_pS5)))))))))));
    q = jvm_dadd(ac_one, jvm_dmul(z, jvm_dadd(ac_qS1, jvm_dmul(z, jvm_dadd(ac_qS2, jvm_dmul(z, jvm_dadd(ac_qS3, jvm_dmul(z, ac_qS4))))))));
    r = jvm_ddiv(p, q);
    return jvm_dsub(ac_pio2_hi, jvm_dsub(x, jvm_dsub(ac_pio2_lo, jvm_dmul(x, r))));
  } else  if (hx<0) {		/* x < -0.5 */
    z = jvm_dmul(jvm_dadd(ac_one, x), 0.5);
    p = jvm_dmul(z, jvm_dadd(ac_pS0, jvm_dmul(z, jvm_dadd(ac_pS1, jvm_dmul(z, jvm_dadd(ac_pS2, jvm_dmul(z, jvm_dadd(ac_pS3, jvm_dmul(z, jvm_dadd(ac_pS4, jvm_dmul(z, ac_pS5)))))))))));
    q = jvm_dadd(ac_one, jvm_dmul(z, jvm_dadd(ac_qS1, jvm_dmul(z, jvm_dadd(ac_qS2, jvm_dmul(z, jvm_dadd(ac_qS3, jvm_dmul(z, ac_qS4))))))));
    s = ieee754_sqrt(z);
    r = jvm_ddiv(p, q);
    w = jvm_dsub(jvm_dmul(r, s), ac_pio2_lo);
    return jvm_dsub(ac_pi, jvm_dmul(2.0, jvm_dadd(s, w)));
  } else {			/* x > 0.5 */
    z = jvm_dmul(jvm_dsub(ac_one, x), 0.5);
    s = ieee754_sqrt(z);
    df = s;
    __JLO(df) = 0;
    c  = jvm_ddiv(jvm_dsub(z, jvm_dmul(df, df)), jvm_dadd(s, df));
    p = jvm_dmul(z, jvm_dadd(ac_pS0, jvm_dmul(z, jvm_dadd(ac_pS1, jvm_dmul(z, jvm_dadd(ac_pS2, jvm_dmul(z, jvm_dadd(ac_pS3, jvm_dmul(z, jvm_dadd(ac_pS4, jvm_dmul(z, ac_pS5)))))))))));
    q = jvm_dadd(ac_one, jvm_dmul(z, jvm_dadd(ac_qS1, jvm_dmul(z, jvm_dadd(ac_qS2, jvm_dmul(z, jvm_dadd(ac_qS3, jvm_dmul(z, ac_qS4))))))));
    r = jvm_ddiv(p, q);
    w = jvm_dadd(jvm_dmul(r, s), c);
    return jvm_dmul(2.0, jvm_dadd(df, w));
  }
}
Exemplo n.º 4
0
double cosine_kernel(double x, double y) {
  double a, hz, z, r, qx;
  int ix;
  ix = __JHI(x) & 0x7fffffff;    /* ix = |x|'s high word*/
  if (ix < 0x3e400000) {         /* if x < 2**27 */
    if (jvm_d2i(x) == 0 ) {
      return one_c;     /* generate inexact */
    }
  }
  z  = jvm_dmul(x, x);
  r  = jvm_dmul(z, jvm_dadd(C1, jvm_dmul(z, jvm_dadd(C2, jvm_dmul(z, jvm_dadd(C3, jvm_dmul(z, jvm_dadd(C4, jvm_dmul(z, jvm_dadd(C5, jvm_dmul(z,C6)))))))))));
  if (ix < 0x3FD33333) {           /* if |x| < 0.3 */
    return jvm_dsub(one_c, jvm_dsub(jvm_dmul(0.5,z), jvm_dsub(jvm_dmul(z,r), jvm_dmul(x,y))));
  } else {
    if(ix > 0x3fe90000) {       /* x > 0.78125 */
      qx = 0.28125;
    } else {
      qx = jdouble_from_msw_lsw(ix - 0x00200000 /* x/4 */, 0);
    }
    hz = jvm_dsub(jvm_dmul(0.5, z), qx);
    a  = jvm_dsub(one_c, qx);
    return jvm_dsub(a, jvm_dsub(hz, jvm_dsub(jvm_dmul(z, r), jvm_dmul(x, y))));
  }
}