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; }
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; }
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; }
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); }