long double cosl(long double x) { union ldshape u = {x}; unsigned n; long double y[2], hi, lo; u.i.se &= 0x7fff; if (u.i.se == 0x7fff) return x - x; x = u.f; if (x < M_PI_4) { if (u.i.se < 0x3fff - LDBL_MANT_DIG) /* raise inexact if x!=0 */ return 1.0 + x; return __cosl(x, 0); } n = __rem_pio2l(x, y); hi = y[0]; lo = y[1]; switch (n & 3) { case 0: return __cosl(hi, lo); case 1: return -__sinl(hi, lo, 1); case 2: return -__cosl(hi, lo); case 3: default: return __sinl(hi, lo, 1); } }
long double sinl(long double x) { union ldshape u = {x}; unsigned n; long double y[2], hi, lo; u.i.se &= 0x7fff; if (u.i.se == 0x7fff) return x - x; if (u.f < M_PI_4) { if (u.i.se < 0x3fff - LDBL_MANT_DIG/2) { /* raise inexact if x!=0 and underflow if subnormal */ FORCE_EVAL(u.i.se == 0 ? x*0x1p-120f : x+0x1p120f); return x; } return __sinl(x, 0.0, 0); } n = __rem_pio2l(x, y); hi = y[0]; lo = y[1]; switch (n & 3) { case 0: return __sinl(hi, lo, 1); case 1: return __cosl(hi, lo); case 2: return -__sinl(hi, lo, 1); case 3: default: return -__cosl(hi, lo); } }
void _CDTOD(d_complex_t *ret_val, d_complex_t x, _f_real16 *r) { _f_real16 __atan2l(_f_real16 ax, _f_real16 bx); _f_real16 __cosl(_f_real16 ax); _f_real16 __expl(_f_real16 ax); _f_real16 __logl(_f_real16 ax); _f_real16 __sinl(_f_real16 ax); _f_real16 _CDABS(d_complex_t z); _f_real16 y = *r; _f_real16 one; _f_real16 two; if (x.real == (_f_real16) 0.0 && x.imag == (_f_real16) 0.0) { if (y == (_f_real16) 0.0) { ret_val->real = _DBL_NaN; ret_val->imag = _DBL_NaN; } else { ret_val->real = (_f_real16) 0.0; ret_val->imag = (_f_real16) 0.0; } return; } one = y * __atan2l(x.imag, x.real); two = y * __logl(_CDABS(x)); ret_val->real = __expl(two) * __cosl(one); ret_val->imag = __expl(two) * __sinl(one); }
void _CDTOCD(d_complex_t *ret_val, d_complex_t x, d_complex_t y) { _f_real16 __atan2l(_f_real16 ax, _f_real16 bx); _f_real16 __cosl(_f_real16 ax); _f_real16 __expl(_f_real16 ax); _f_real16 __logl(_f_real16 ax); _f_real16 __sinl(_f_real16 ax); _f_real16 __sqrtl(_f_real16 ax); _f_real16 a; _f_real16 b; _f_real16 c; _f_real16 d; _f_real16 one; _f_real16 two; REGISTER_16 realx; REGISTER_16 imagx; _f_real16 loglabsx, atn2l, expltwo; if (x.real == 0.0 && x.imag == 0.0) { if (y.real == 0.0 && y.imag == 0.0) { ret_val->real = _DBL_NaN; ret_val->imag = _DBL_NaN; } else { ret_val->real = (_f_real16) 0.0; ret_val->imag = (_f_real16) 0.0; } return; } realx.f = x.real; imagx.f = x.imag; a = x.real; b = x.imag; c = y.real; d = y.imag; /* clear sign bit */ realx.ui[0] &= ~IEEE_128_64_SIGN_BIT; imagx.ui[0] &= ~IEEE_128_64_SIGN_BIT; atn2l = __atan2l(b,a); if (realx.f > imagx.f) loglabsx = __logl(realx.f * __sqrtl(1.0 + (imagx.f/realx.f) * (imagx.f/realx.f))); else loglabsx = __logl(imagx.f * __sqrtl(1.0 + (realx.f/imagx.f) * (realx.f/imagx.f))); one = d * loglabsx + c * atn2l; two = c * loglabsx - d * atn2l; expltwo = __expl(two); ret_val->real = expltwo * __cosl(one); ret_val->imag = expltwo * __sinl(one); }
void _CDEXP(d_complex_t *ret_val, d_complex_t z ) { _f_real16 __expl(_f_real16 x); _f_real16 __cosl(_f_real16 x); _f_real16 __sinl(_f_real16 x); ret_val->real = __expl(z.real) * __cosl(z.imag); ret_val->imag = __expl(z.real) * __sinl(z.imag); }
void sincosl(long double x, long double *sin, long double *cos) { union IEEEl2bits u; unsigned n; long double y[2], s, c; u.e = x; u.bits.sign = 0; /* x = nan or inf */ if (u.bits.exp == 0x7fff) { *sin = *cos = x - x; return; } /* |x| < (double)pi/4 */ if (u.e < M_PI_4) { /* |x| < 0x1p-64 */ if (u.bits.exp < 0x3fff - 64) { /* raise underflow if subnormal */ if (u.bits.exp == 0) FORCE_EVAL(x*0x1p-120f); *sin = x; /* raise inexact if x!=0 */ *cos = 1.0 + x; return; } *sin = __sinl(x, 0, 0); *cos = __cosl(x, 0); return; } n = __rem_pio2l(x, y); s = __sinl(y[0], y[1], 1); c = __cosl(y[0], y[1]); switch (n & 3) { case 0: *sin = s; *cos = c; break; case 1: *sin = c; *cos = -s; break; case 2: *sin = -s; *cos = -c; break; case 3: default: *sin = -c; *cos = s; break; } }
void sincosl(long double x, long double *sin, long double *cos) { union IEEEl2bits u; int n; long double y[2], s, c; u.e = x; u.bits.sign = 0; /* x = +-0 or subnormal */ if (!u.bits.exp) { *sin = x; *cos = 1.0; return; } /* x = nan or inf */ if (u.bits.exp == 0x7fff) { *sin = *cos = x - x; return; } /* |x| < pi/4 */ if (u.e < M_PI_4) { *sin = __sinl(x, 0, 0); *cos = __cosl(x, 0); return; } n = __rem_pio2l(x, y); s = __sinl(y[0], y[1], 1); c = __cosl(y[0], y[1]); switch (n & 3) { case 0: *sin = s; *cos = c; break; case 1: *sin = c; *cos = -s; break; case 2: *sin = -s; *cos = -c; break; case 3: default: *sin = -c; *cos = s; break; } }
static long double lg_cospi (long double x) { if (x <= 0.25L) return __cosl (M_PIl * x); else return __sinl (M_PIl * (0.5L - x)); }
long double cosl(long double x) { union IEEEl2bits z; unsigned n; long double y[2]; long double hi, lo; z.e = x; z.bits.sign = 0; /* If x = NaN or Inf, then cos(x) = NaN. */ if (z.bits.exp == 0x7fff) return (x - x) / (x - x); /* |x| < (double)pi/4 */ if (z.e < M_PI_4) { /* |x| < 0x1p-64 */ if (z.bits.exp < 0x3fff - 64) /* raise inexact if x!=0 */ return 1.0 + x; return __cosl(z.e, 0); } n = __rem_pio2l(x, y); hi = y[0]; lo = y[1]; switch (n & 3) { case 0: hi = __cosl(hi, lo); break; case 1: hi = -__sinl(hi, lo, 1); break; case 2: hi = -__cosl(hi, lo); break; case 3: hi = __sinl(hi, lo, 1); break; } return hi; }
long double __ieee754_y1l (long double x) { long double xx, xinv, z, p, q, c, s, cc, ss; if (! __finitel (x)) { if (x != x) return x; else return 0.0L; } if (x <= 0.0L) { if (x < 0.0L) return (zero / (zero * x)); return -HUGE_VALL + x; } xx = fabsl (x); if (xx <= 2.0L) { /* 0 <= x <= 2 */ z = xx * xx; p = xx * neval (z, Y0_2N, NY0_2N) / deval (z, Y0_2D, NY0_2D); p = -TWOOPI / xx + p; p = TWOOPI * __ieee754_logl (x) * __ieee754_j1l (x) + p; return p; } xinv = 1.0L / xx; z = xinv * xinv; if (xinv <= 0.25) { if (xinv <= 0.125) { if (xinv <= 0.0625) { p = neval (z, P16_IN, NP16_IN) / deval (z, P16_ID, NP16_ID); q = neval (z, Q16_IN, NQ16_IN) / deval (z, Q16_ID, NQ16_ID); } else { p = neval (z, P8_16N, NP8_16N) / deval (z, P8_16D, NP8_16D); q = neval (z, Q8_16N, NQ8_16N) / deval (z, Q8_16D, NQ8_16D); } } else if (xinv <= 0.1875) { p = neval (z, P5_8N, NP5_8N) / deval (z, P5_8D, NP5_8D); q = neval (z, Q5_8N, NQ5_8N) / deval (z, Q5_8D, NQ5_8D); } else { p = neval (z, P4_5N, NP4_5N) / deval (z, P4_5D, NP4_5D); q = neval (z, Q4_5N, NQ4_5N) / deval (z, Q4_5D, NQ4_5D); } } /* .25 */ else /* if (xinv <= 0.5) */ { if (xinv <= 0.375) { if (xinv <= 0.3125) { p = neval (z, P3r2_4N, NP3r2_4N) / deval (z, P3r2_4D, NP3r2_4D); q = neval (z, Q3r2_4N, NQ3r2_4N) / deval (z, Q3r2_4D, NQ3r2_4D); } else { p = neval (z, P2r7_3r2N, NP2r7_3r2N) / deval (z, P2r7_3r2D, NP2r7_3r2D); q = neval (z, Q2r7_3r2N, NQ2r7_3r2N) / deval (z, Q2r7_3r2D, NQ2r7_3r2D); } } else if (xinv <= 0.4375) { p = neval (z, P2r3_2r7N, NP2r3_2r7N) / deval (z, P2r3_2r7D, NP2r3_2r7D); q = neval (z, Q2r3_2r7N, NQ2r3_2r7N) / deval (z, Q2r3_2r7D, NQ2r3_2r7D); } else { p = neval (z, P2_2r3N, NP2_2r3N) / deval (z, P2_2r3D, NP2_2r3D); q = neval (z, Q2_2r3N, NQ2_2r3N) / deval (z, Q2_2r3D, NQ2_2r3D); } } p = 1.0L + z * p; q = z * q; q = q * xinv + 0.375L * xinv; /* X = x - 3 pi/4 cos(X) = cos(x) cos(3 pi/4) + sin(x) sin(3 pi/4) = 1/sqrt(2) * (-cos(x) + sin(x)) sin(X) = sin(x) cos(3 pi/4) - cos(x) sin(3 pi/4) = -1/sqrt(2) * (sin(x) + cos(x)) cf. Fdlibm. */ __sincosl (xx, &s, &c); ss = -s - c; cc = s - c; z = __cosl (xx + xx); if ((s * c) > 0) cc = z / ss; else ss = z / cc; z = ONEOSQPI * (p * ss + q * cc) / __ieee754_sqrtl (xx); return z; }
long double __ieee754_gammal_r (long double x, int *signgamp) { int64_t hx; u_int64_t lx; long double ret; GET_LDOUBLE_WORDS64 (hx, lx, x); if (((hx & 0x7fffffffffffffffLL) | lx) == 0) { /* Return value for x == 0 is Inf with divide by zero exception. */ *signgamp = 0; return 1.0 / x; } if (hx < 0 && (u_int64_t) hx < 0xffff000000000000ULL && __rintl (x) == x) { /* Return value for integer x < 0 is NaN with invalid exception. */ *signgamp = 0; return (x - x) / (x - x); } if (hx == 0xffff000000000000ULL && lx == 0) { /* x == -Inf. According to ISO this is NaN. */ *signgamp = 0; return x - x; } if ((hx & 0x7fff000000000000ULL) == 0x7fff000000000000ULL) { /* Positive infinity (return positive infinity) or NaN (return NaN). */ *signgamp = 0; return x + x; } if (x >= 1756.0L) { /* Overflow. */ *signgamp = 0; return LDBL_MAX * LDBL_MAX; } else { SET_RESTORE_ROUNDL (FE_TONEAREST); if (x > 0.0L) { *signgamp = 0; int exp2_adj; ret = gammal_positive (x, &exp2_adj); ret = __scalbnl (ret, exp2_adj); } else if (x >= -LDBL_EPSILON / 4.0L) { *signgamp = 0; ret = 1.0L / x; } else { long double tx = __truncl (x); *signgamp = (tx == 2.0L * __truncl (tx / 2.0L)) ? -1 : 1; if (x <= -1775.0L) /* Underflow. */ ret = LDBL_MIN * LDBL_MIN; else { long double frac = tx - x; if (frac > 0.5L) frac = 1.0L - frac; long double sinpix = (frac <= 0.25L ? __sinl (M_PIl * frac) : __cosl (M_PIl * (0.5L - frac))); int exp2_adj; ret = M_PIl / (-x * sinpix * gammal_positive (-x, &exp2_adj)); ret = __scalbnl (ret, -exp2_adj); } } } if (isinf (ret) && x != 0) { if (*signgamp < 0) return -(-__copysignl (LDBL_MAX, ret) * LDBL_MAX); else return __copysignl (LDBL_MAX, ret) * LDBL_MAX; } else if (ret == 0) { if (*signgamp < 0) return -(-__copysignl (LDBL_MIN, ret) * LDBL_MIN); else return __copysignl (LDBL_MIN, ret) * LDBL_MIN; } else return ret; }
_Float128 __ieee754_y0l(_Float128 x) { _Float128 xx, xinv, z, p, q, c, s, cc, ss; if (! isfinite (x)) { if (x != x) return x + x; else return 0; } if (x <= 0) { if (x < 0) return (zero / (zero * x)); return -HUGE_VALL + x; } xx = fabsl (x); if (xx <= 0x1p-57) return U0 + TWOOPI * __ieee754_logl (x); if (xx <= 2) { /* 0 <= x <= 2 */ z = xx * xx; p = neval (z, Y0_2N, NY0_2N) / deval (z, Y0_2D, NY0_2D); p = TWOOPI * __ieee754_logl (x) * __ieee754_j0l (x) + p; return p; } /* X = x - pi/4 cos(X) = cos(x) cos(pi/4) + sin(x) sin(pi/4) = 1/sqrt(2) * (cos(x) + sin(x)) sin(X) = sin(x) cos(pi/4) - cos(x) sin(pi/4) = 1/sqrt(2) * (sin(x) - cos(x)) sin(x) +- cos(x) = -cos(2x)/(sin(x) -+ cos(x)) cf. Fdlibm. */ __sincosl (x, &s, &c); ss = s - c; cc = s + c; if (xx <= LDBL_MAX / 2) { z = -__cosl (x + x); if ((s * c) < 0) cc = z / ss; else ss = z / cc; } if (xx > L(0x1p256)) return ONEOSQPI * ss / __ieee754_sqrtl (x); xinv = 1 / xx; z = xinv * xinv; if (xinv <= 0.25) { if (xinv <= 0.125) { if (xinv <= 0.0625) { p = neval (z, P16_IN, NP16_IN) / deval (z, P16_ID, NP16_ID); q = neval (z, Q16_IN, NQ16_IN) / deval (z, Q16_ID, NQ16_ID); } else { p = neval (z, P8_16N, NP8_16N) / deval (z, P8_16D, NP8_16D); q = neval (z, Q8_16N, NQ8_16N) / deval (z, Q8_16D, NQ8_16D); } } else if (xinv <= 0.1875) { p = neval (z, P5_8N, NP5_8N) / deval (z, P5_8D, NP5_8D); q = neval (z, Q5_8N, NQ5_8N) / deval (z, Q5_8D, NQ5_8D); } else { p = neval (z, P4_5N, NP4_5N) / deval (z, P4_5D, NP4_5D); q = neval (z, Q4_5N, NQ4_5N) / deval (z, Q4_5D, NQ4_5D); } } /* .25 */ else /* if (xinv <= 0.5) */ { if (xinv <= 0.375) { if (xinv <= 0.3125) { p = neval (z, P3r2_4N, NP3r2_4N) / deval (z, P3r2_4D, NP3r2_4D); q = neval (z, Q3r2_4N, NQ3r2_4N) / deval (z, Q3r2_4D, NQ3r2_4D); } else { p = neval (z, P2r7_3r2N, NP2r7_3r2N) / deval (z, P2r7_3r2D, NP2r7_3r2D); q = neval (z, Q2r7_3r2N, NQ2r7_3r2N) / deval (z, Q2r7_3r2D, NQ2r7_3r2D); } } else if (xinv <= 0.4375) { p = neval (z, P2r3_2r7N, NP2r3_2r7N) / deval (z, P2r3_2r7D, NP2r3_2r7D); q = neval (z, Q2r3_2r7N, NQ2r3_2r7N) / deval (z, Q2r3_2r7D, NQ2r3_2r7D); } else { p = neval (z, P2_2r3N, NP2_2r3N) / deval (z, P2_2r3D, NP2_2r3D); q = neval (z, Q2_2r3N, NQ2_2r3N) / deval (z, Q2_2r3D, NQ2_2r3D); } } p = 1 + z * p; q = z * xinv * q; q = q - L(0.125) * xinv; z = ONEOSQPI * (p * ss + q * cc) / __ieee754_sqrtl (x); return z; }
long double __ieee754_j0l (long double x) { long double xx, xinv, z, p, q, c, s, cc, ss; if (! isfinite (x)) { if (x != x) return x; else return 0.0L; } if (x == 0.0L) return 1.0L; xx = fabsl (x); if (xx <= 2.0L) { /* 0 <= x <= 2 */ z = xx * xx; p = z * z * neval (z, J0_2N, NJ0_2N) / deval (z, J0_2D, NJ0_2D); p -= 0.25L * z; p += 1.0L; return p; } /* X = x - pi/4 cos(X) = cos(x) cos(pi/4) + sin(x) sin(pi/4) = 1/sqrt(2) * (cos(x) + sin(x)) sin(X) = sin(x) cos(pi/4) - cos(x) sin(pi/4) = 1/sqrt(2) * (sin(x) - cos(x)) sin(x) +- cos(x) = -cos(2x)/(sin(x) -+ cos(x)) cf. Fdlibm. */ __sincosl (xx, &s, &c); ss = s - c; cc = s + c; if (xx <= LDBL_MAX / 2.0L) { z = -__cosl (xx + xx); if ((s * c) < 0) cc = z / ss; else ss = z / cc; } if (xx > 0x1p256L) return ONEOSQPI * cc / __ieee754_sqrtl (xx); xinv = 1.0L / xx; z = xinv * xinv; if (xinv <= 0.25) { if (xinv <= 0.125) { if (xinv <= 0.0625) { p = neval (z, P16_IN, NP16_IN) / deval (z, P16_ID, NP16_ID); q = neval (z, Q16_IN, NQ16_IN) / deval (z, Q16_ID, NQ16_ID); } else { p = neval (z, P8_16N, NP8_16N) / deval (z, P8_16D, NP8_16D); q = neval (z, Q8_16N, NQ8_16N) / deval (z, Q8_16D, NQ8_16D); } } else if (xinv <= 0.1875) { p = neval (z, P5_8N, NP5_8N) / deval (z, P5_8D, NP5_8D); q = neval (z, Q5_8N, NQ5_8N) / deval (z, Q5_8D, NQ5_8D); } else { p = neval (z, P4_5N, NP4_5N) / deval (z, P4_5D, NP4_5D); q = neval (z, Q4_5N, NQ4_5N) / deval (z, Q4_5D, NQ4_5D); } } /* .25 */ else /* if (xinv <= 0.5) */ { if (xinv <= 0.375) { if (xinv <= 0.3125) { p = neval (z, P3r2_4N, NP3r2_4N) / deval (z, P3r2_4D, NP3r2_4D); q = neval (z, Q3r2_4N, NQ3r2_4N) / deval (z, Q3r2_4D, NQ3r2_4D); } else { p = neval (z, P2r7_3r2N, NP2r7_3r2N) / deval (z, P2r7_3r2D, NP2r7_3r2D); q = neval (z, Q2r7_3r2N, NQ2r7_3r2N) / deval (z, Q2r7_3r2D, NQ2r7_3r2D); } } else if (xinv <= 0.4375) { p = neval (z, P2r3_2r7N, NP2r3_2r7N) / deval (z, P2r3_2r7D, NP2r3_2r7D); q = neval (z, Q2r3_2r7N, NQ2r3_2r7N) / deval (z, Q2r3_2r7D, NQ2r3_2r7D); } else { p = neval (z, P2_2r3N, NP2_2r3N) / deval (z, P2_2r3D, NP2_2r3D); q = neval (z, Q2_2r3N, NQ2_2r3N) / deval (z, Q2_2r3D, NQ2_2r3D); } } p = 1.0L + z * p; q = z * xinv * q; q = q - 0.125L * xinv; z = ONEOSQPI * (p * cc - q * ss) / __ieee754_sqrtl (xx); return z; }
long double __ieee754_j1l (long double x) { long double xx, xinv, z, p, q, c, s, cc, ss; if (! isfinite (x)) { if (x != x) return x; else return 0.0L; } if (x == 0.0L) return x; xx = fabsl (x); if (xx <= 0x1p-58L) { long double ret = x * 0.5L; if (fabsl (ret) < LDBL_MIN) { long double force_underflow = ret * ret; math_force_eval (force_underflow); } return ret; } if (xx <= 2.0L) { /* 0 <= x <= 2 */ z = xx * xx; p = xx * z * neval (z, J0_2N, NJ0_2N) / deval (z, J0_2D, NJ0_2D); p += 0.5L * xx; if (x < 0) p = -p; return p; } /* X = x - 3 pi/4 cos(X) = cos(x) cos(3 pi/4) + sin(x) sin(3 pi/4) = 1/sqrt(2) * (-cos(x) + sin(x)) sin(X) = sin(x) cos(3 pi/4) - cos(x) sin(3 pi/4) = -1/sqrt(2) * (sin(x) + cos(x)) cf. Fdlibm. */ __sincosl (xx, &s, &c); ss = -s - c; cc = s - c; if (xx <= LDBL_MAX / 2.0L) { z = __cosl (xx + xx); if ((s * c) > 0) cc = z / ss; else ss = z / cc; } if (xx > 0x1p256L) { z = ONEOSQPI * cc / __ieee754_sqrtl (xx); if (x < 0) z = -z; return z; } xinv = 1.0L / xx; z = xinv * xinv; if (xinv <= 0.25) { if (xinv <= 0.125) { if (xinv <= 0.0625) { p = neval (z, P16_IN, NP16_IN) / deval (z, P16_ID, NP16_ID); q = neval (z, Q16_IN, NQ16_IN) / deval (z, Q16_ID, NQ16_ID); } else { p = neval (z, P8_16N, NP8_16N) / deval (z, P8_16D, NP8_16D); q = neval (z, Q8_16N, NQ8_16N) / deval (z, Q8_16D, NQ8_16D); } } else if (xinv <= 0.1875) { p = neval (z, P5_8N, NP5_8N) / deval (z, P5_8D, NP5_8D); q = neval (z, Q5_8N, NQ5_8N) / deval (z, Q5_8D, NQ5_8D); } else { p = neval (z, P4_5N, NP4_5N) / deval (z, P4_5D, NP4_5D); q = neval (z, Q4_5N, NQ4_5N) / deval (z, Q4_5D, NQ4_5D); } } /* .25 */ else /* if (xinv <= 0.5) */ { if (xinv <= 0.375) { if (xinv <= 0.3125) { p = neval (z, P3r2_4N, NP3r2_4N) / deval (z, P3r2_4D, NP3r2_4D); q = neval (z, Q3r2_4N, NQ3r2_4N) / deval (z, Q3r2_4D, NQ3r2_4D); } else { p = neval (z, P2r7_3r2N, NP2r7_3r2N) / deval (z, P2r7_3r2D, NP2r7_3r2D); q = neval (z, Q2r7_3r2N, NQ2r7_3r2N) / deval (z, Q2r7_3r2D, NQ2r7_3r2D); } } else if (xinv <= 0.4375) { p = neval (z, P2r3_2r7N, NP2r3_2r7N) / deval (z, P2r3_2r7D, NP2r3_2r7D); q = neval (z, Q2r3_2r7N, NQ2r3_2r7N) / deval (z, Q2r3_2r7D, NQ2r3_2r7D); } else { p = neval (z, P2_2r3N, NP2_2r3N) / deval (z, P2_2r3D, NP2_2r3D); q = neval (z, Q2_2r3N, NQ2_2r3N) / deval (z, Q2_2r3D, NQ2_2r3D); } } p = 1.0L + z * p; q = z * q; q = q * xinv + 0.375L * xinv; z = ONEOSQPI * (p * cc - q * ss) / __ieee754_sqrtl (xx); if (x < 0) z = -z; return z; }
long double __ieee754_gammal_r (long double x, int *signgamp) { u_int32_t es, hx, lx; GET_LDOUBLE_WORDS (es, hx, lx, x); if (__glibc_unlikely (((es & 0x7fff) | hx | lx) == 0)) { /* Return value for x == 0 is Inf with divide by zero exception. */ *signgamp = 0; return 1.0 / x; } if (__glibc_unlikely (es == 0xffffffff && ((hx & 0x7fffffff) | lx) == 0)) { /* x == -Inf. According to ISO this is NaN. */ *signgamp = 0; return x - x; } if (__glibc_unlikely ((es & 0x7fff) == 0x7fff)) { /* Positive infinity (return positive infinity) or NaN (return NaN). */ *signgamp = 0; return x + x; } if (__builtin_expect ((es & 0x8000) != 0, 0) && __rintl (x) == x) { /* Return value for integer x < 0 is NaN with invalid exception. */ *signgamp = 0; return (x - x) / (x - x); } if (x >= 1756.0L) { /* Overflow. */ *signgamp = 0; return LDBL_MAX * LDBL_MAX; } else if (x > 0.0L) { *signgamp = 0; int exp2_adj; long double ret = gammal_positive (x, &exp2_adj); return __scalbnl (ret, exp2_adj); } else if (x >= -LDBL_EPSILON / 4.0L) { *signgamp = 0; return 1.0f / x; } else { long double tx = __truncl (x); *signgamp = (tx == 2.0L * __truncl (tx / 2.0L)) ? -1 : 1; if (x <= -1766.0L) /* Underflow. */ return LDBL_MIN * LDBL_MIN; long double frac = tx - x; if (frac > 0.5L) frac = 1.0L - frac; long double sinpix = (frac <= 0.25L ? __sinl (M_PIl * frac) : __cosl (M_PIl * (0.5L - frac))); int exp2_adj; long double ret = M_PIl / (-x * sinpix * gammal_positive (-x, &exp2_adj)); return __scalbnl (ret, -exp2_adj); } }