示例#1
0
文件: float128.hpp 项目: PAV38/PDAL
inline void eval_ldexp(float128_backend& result, const float128_backend& arg, int exp)
{
   result.value() = ldexpq(arg.value(), exp);
}
示例#2
0
文件: expm1q.c 项目: 0day-ci/gcc
__float128
expm1q (__float128 x)
{
  __float128 px, qx, xx;
  int32_t ix, sign;
  ieee854_float128 u;
  int k;

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

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

  /* Overflow.  */
  if (x > maxlog)
    {
      errno = ERANGE;
      return (HUGE_VALQ * HUGE_VALQ);
    }

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

  /* Express x = ln 2 (k + remainder), remainder not exceeding 1/2. */
  xx = C1 + C2;			/* ln 2. */
  px = floorq (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 = ldexpq (1.0Q, k);
  x = px * qx + (px - 1.0);
  return x;
}