123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105 |
- #include <openlibm_math.h>
- #include "math_private.h"
- static const long double one = 1.0, two = 2.0, tiny = 1.0e-4900L;
- long double
- tanhl(long double x)
- {
- long double t, z;
- u_int32_t jx, ix;
- ieee_quad_shape_type u;
-
- u.value = x;
- jx = u.parts32.mswhi;
- ix = jx & 0x7fffffff;
-
- if (ix >= 0x7fff0000)
- {
-
- if (jx & 0x80000000)
- return one / x - one;
- else
- return one / x + one;
- }
-
- if (ix < 0x40044000)
- {
- if (u.value == 0)
- return x;
- if (ix < 0x3fc60000)
- return x * (one + tiny);
- u.parts32.mswhi = ix;
- if (ix >= 0x3fff0000)
- {
- t = expm1l (two * u.value);
- z = one - two / (t + two);
- }
- else
- {
- t = expm1l (-two * u.value);
- z = -t / (t + two);
- }
-
- }
- else
- {
- z = one - tiny;
- }
- return (jx & 0x80000000) ? -z : z;
- }
|