long double expl(long double x) { union IEEEl2bits u; long double hi, lo, t, twopk; int k; uint16_t hx, ix; DOPRINT_START(&x); /* Filter out exceptional cases. */ u.e = x; hx = u.xbits.expsign; ix = hx & 0x7fff; if (ix >= BIAS + 13) { /* |x| >= 8192 or x is NaN */ if (ix == BIAS + LDBL_MAX_EXP) { if (hx & 0x8000) /* x is -Inf, -NaN or unsupported */ RETURNP(-1 / x); RETURNP(x + x); /* x is +Inf, +NaN or unsupported */ } if (x > o_threshold) RETURNP(huge * huge); if (x < u_threshold) RETURNP(tiny * tiny); } else if (ix < BIAS - 75) { /* |x| < 0x1p-75 (includes pseudos) */ RETURN2P(1, x); /* 1 with inexact iff x != 0 */ } ENTERI(); twopk = 1; __k_expl(x, &hi, &lo, &k); t = SUM2P(hi, lo); /* Scale by 2**k. */ if (k >= LDBL_MIN_EXP) { if (k == LDBL_MAX_EXP) RETURNI(t * 2 * 0x1p16383L); SET_LDBL_EXPSIGN(twopk, BIAS + k); RETURNI(t * twopk); } else { SET_LDBL_EXPSIGN(twopk, BIAS + k + 10000); RETURNI(t * twopk * twom10000); } }
long double atanhl(long double x) { long double t; uint16_t hx, ix; ENTERI(); GET_LDBL_EXPSIGN(hx, x); ix = hx & 0x7fff; if (ix >= 0x3fff) /* |x| >= 1, or NaN or misnormal */ RETURNI(fabsl(x) == 1 ? x / zero : (x - x) / (x - x)); if (ix < BIAS + EXP_TINY && (huge + x) > zero) RETURNI(x); /* x is tiny */ SET_LDBL_EXPSIGN(x, ix); if (ix < 0x3ffe) { /* |x| < 0.5, or misnormal */ t = x+x; t = 0.5*log1pl(t+t*x/(one-x)); } else t = 0.5*log1pl((x+x)/(one-x)); RETURNI((hx & 0x8000) == 0 ? t : -t); }