- return one - (x + x * y);
- r = x * y;
- r += x - half;
- return half - r;
- }
- if (ix < 0x3fffa000) { /* 0.84375 <= |x| < 1.25 */
- s = fabsl (x) - one;
- P = pa[0] + s * (pa[1] + s * (pa[2] +
- s * (pa[3] + s * (pa[4] + s * (pa[5] + s * (pa[6] + s * pa[7]))))));
- Q = qa[0] + s * (qa[1] + s * (qa[2] +
- s * (qa[3] + s * (qa[4] + s * (qa[5] + s * (qa[6] + s))))));
- if ((se & 0x8000) == 0) {
- z = one - erx;
- return z - P / Q;
- }
- z = erx + P / Q;
- return one + z;
- }
- if (ix < 0x4005d600) { /* |x| < 107 */
- x = fabsl (x);
- s = one / (x * x);
- if (ix < 0x4000b6db) { /* 1.25 <= |x| < 2.85711669921875 ~ 1/.35 */
- R = ra[0] + s * (ra[1] + s * (ra[2] + s * (ra[3] + s * (ra[4] +
- s * (ra[5] + s * (ra[6] + s * (ra[7] + s * ra[8])))))));
- S = sa[0] + s * (sa[1] + s * (sa[2] + s * (sa[3] + s * (sa[4] +
- s * (sa[5] + s * (sa[6] + s * (sa[7] + s * (sa[8] + s))))))));
- } else if (ix < 0x4001d555) { /* 6.6666259765625 > |x| >= 1/.35 ~ 2.857143 */
- R = rb[0] + s * (rb[1] + s * (rb[2] + s * (rb[3] + s * (rb[4] +
- s * (rb[5] + s * (rb[6] + s * rb[7]))))));
- S = sb[0] + s * (sb[1] + s * (sb[2] + s * (sb[3] + s * (sb[4] +
- s * (sb[5] + s * (sb[6] + s))))));
- } else { /* 107 > |x| >= 6.666 */
- if (se & 0x8000)
- return two - tiny;/* x < -6.666 */
- R = rc[0] + s * (rc[1] + s * (rc[2] + s * (rc[3] +
- s * (rc[4] + s * rc[5]))));
- S = sc[0] + s * (sc[1] + s * (sc[2] + s * (sc[3] +
- s * (sc[4] + s))));
- }
- z = x;
- GET_LDOUBLE_WORDS (hx, i0, i1, z);
- i1 = 0;
- i0 &= 0xffffff00;
- SET_LDOUBLE_WORDS (z, hx, i0, i1);
- r = expl (-z * z - 0.5625) *
- expl ((z - x) * (z + x) + R / S);
- if ((se & 0x8000) == 0)
- return r / x;
- return two - r / x;