コード例 #1
0
ファイル: s_cbrtl.c プロジェクト: siddhesh/glibc
long double
__cbrtl (long double x)
{
  long double xm, u;
  int xe;

  /* Reduce X.  XM now is an range 1.0 to 0.5.  */
  xm = __frexpl (fabsl (x), &xe);

  /* If X is not finite or is null return it (with raising exceptions
     if necessary.
     Note: *Our* version of `frexp' sets XE to zero if the argument is
     Inf or NaN.  This is not portable but faster.  */
  if (xe == 0 && fpclassify (x) <= FP_ZERO)
    return x + x;

  u = (((-1.34661104733595206551E-1 * xm
	  + 5.46646013663955245034E-1) * xm
	 - 9.54382247715094465250E-1) * xm
	+ 1.13999833547172932737E0) * xm
       + 4.02389795645447521269E-1;

  u *= factor[2 + xe % 3];
  u = __ldexpl (x > 0.0 ? u : -u, xe / 3);

  u -= (u - (x / (u * u))) * third;
  u -= (u - (x / (u * u))) * third;
  return u;
}
コード例 #2
0
ファイル: s_expm1l.c プロジェクト: mbref/eglibc-microblaze
long double
__expm1l (long double x)
{
    long double px, qx, xx;
    int32_t ix, sign;
    ieee854_long_double_shape_type u;
    int k;

    /* Detect infinity and NaN.  */
    u.value = x;
    ix = u.parts32.w0;
    sign = ix & 0x80000000;
    ix &= 0x7fffffff;
    if (ix >= 0x7ff00000)
    {
        /* Infinity. */
        if (((ix & 0xfffff) | u.parts32.w1 | (u.parts32.w2&0x7fffffff) | u.parts32.w3) == 0)
        {
            if (sign)
                return -1.0L;
            else
                return x;
        }
        /* NaN. No invalid exception. */
        return x;
    }

    /* expm1(+- 0) = +- 0.  */
    if ((ix == 0) && (u.parts32.w1 | (u.parts32.w2&0x7fffffff) | u.parts32.w3) == 0)
        return x;

    /* Overflow.  */
    if (x > maxlog)
    {
        __set_errno (ERANGE);
        return (big * big);
    }

    /* Minimum value.  */
    if (x < minarg)
        return (4.0/big - 1.0L);

    /* Express x = ln 2 (k + remainder), remainder not exceeding 1/2. */
    xx = C1 + C2;			/* ln 2. */
    px = __floorl (0.5 + x / xx);
    k = px;
    /* remainder times ln 2 */
    x -= px * C1;
    x -= px * C2;

    /* Approximate exp(remainder ln 2).  */
    px = (((((((P7 * x
                + P6) * x
               + P5) * x + P4) * x + P3) * x + P2) * x + P1) * x + P0) * x;

    qx = (((((((x
                + Q7) * x
               + Q6) * x + Q5) * x + Q4) * x + Q3) * x + Q2) * x + Q1) * x + Q0;

    xx = x * x;
    qx = x + (0.5 * xx + xx * px / qx);

    /* exp(x) = exp(k ln 2) exp(remainder ln 2) = 2^k exp(remainder ln 2).

    We have qx = exp(remainder ln 2) - 1, so
    exp(x) - 1 = 2^k (qx + 1) - 1
               = 2^k qx + 2^k - 1.  */

    px = __ldexpl (1.0L, k);
    x = px * qx + (px - 1.0);
    return x;
}
コード例 #3
0
ファイル: s_expm1l.c プロジェクト: JamesLinus/glibc-mips
long double
__expm1l (long double x)
{
  long double px, qx, xx;
  int32_t ix, sign;
  ieee854_long_double_shape_type u;
  int k;

  /* Detect infinity and NaN.  */
  u.value = x;
  ix = u.parts32.w0;
  sign = ix & 0x80000000;
  ix &= 0x7fffffff;
  if (!sign && ix >= 0x40060000)
    {
      /* If num is positive and exp >= 6 use plain exp.  */
      return __expl (x);
    }
  if (ix >= 0x7fff0000)
    {
      /* Infinity (which must be negative infinity). */
      if (((ix & 0xffff) | u.parts32.w1 | u.parts32.w2 | u.parts32.w3) == 0)
	return -1.0L;
      /* NaN. No invalid exception. */
      return x;
    }

  /* expm1(+- 0) = +- 0.  */
  if ((ix == 0) && (u.parts32.w1 | u.parts32.w2 | u.parts32.w3) == 0)
    return x;

  /* Minimum value.  */
  if (x < minarg)
    return (4.0/big - 1.0L);

  /* Avoid internal underflow when result does not underflow, while
     ensuring underflow (without returning a zero of the wrong sign)
     when the result does underflow.  */
  if (fabsl (x) < 0x1p-113L)
    {
      math_check_force_underflow (x);
      return x;
    }

  /* Express x = ln 2 (k + remainder), remainder not exceeding 1/2. */
  xx = C1 + C2;			/* ln 2. */
  px = __floorl (0.5 + x / xx);
  k = px;
  /* remainder times ln 2 */
  x -= px * C1;
  x -= px * C2;

  /* Approximate exp(remainder ln 2).  */
  px = (((((((P7 * x
	      + P6) * x
	     + P5) * x + P4) * x + P3) * x + P2) * x + P1) * x + P0) * x;

  qx = (((((((x
	      + Q7) * x
	     + Q6) * x + Q5) * x + Q4) * x + Q3) * x + Q2) * x + Q1) * x + Q0;

  xx = x * x;
  qx = x + (0.5 * xx + xx * px / qx);

  /* exp(x) = exp(k ln 2) exp(remainder ln 2) = 2^k exp(remainder ln 2).

  We have qx = exp(remainder ln 2) - 1, so
  exp(x) - 1 = 2^k (qx + 1) - 1
             = 2^k qx + 2^k - 1.  */

  px = __ldexpl (1.0L, k);
  x = px * qx + (px - 1.0);
  return x;
}
コード例 #4
0
ファイル: s_cbrtl.c プロジェクト: AubrCool/glibc
long double
__cbrtl (long double x)
{
  int e, rem, sign;
  long double z;

  if (!__finitel (x))
    return x + x;

  if (x == 0)
    return (x);

  if (x > 0)
    sign = 1;
  else
    {
      sign = -1;
      x = -x;
    }

  z = x;
 /* extract power of 2, leaving mantissa between 0.5 and 1  */
  x = __frexpl (x, &e);

  /* Approximate cube root of number between .5 and 1,
     peak relative error = 1.2e-6  */
  x = ((((1.3584464340920900529734e-1L * x
	  - 6.3986917220457538402318e-1L) * x
	 + 1.2875551670318751538055e0L) * x
	- 1.4897083391357284957891e0L) * x
       + 1.3304961236013647092521e0L) * x + 3.7568280825958912391243e-1L;

  /* exponent divided by 3 */
  if (e >= 0)
    {
      rem = e;
      e /= 3;
      rem -= 3 * e;
      if (rem == 1)
	x *= CBRT2;
      else if (rem == 2)
	x *= CBRT4;
    }
  else
    {				/* argument less than 1 */
      e = -e;
      rem = e;
      e /= 3;
      rem -= 3 * e;
      if (rem == 1)
	x *= CBRT2I;
      else if (rem == 2)
	x *= CBRT4I;
      e = -e;
    }

  /* multiply by power of 2 */
  x = __ldexpl (x, e);

  /* Newton iteration */
  x -= (x - (z / (x * x))) * 0.3333333333333333333333333333333333333333L;
  x -= (x - (z / (x * x))) * 0.3333333333333333333333333333333333333333L;
  x -= (x - (z / (x * x))) * 0.3333333333333333333333333333333333333333L;

  if (sign < 0)
    x = -x;
  return (x);
}