12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879 |
- #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;
- int32_t se;
- u_int32_t jj0,jj1,ix;
-
- GET_LDOUBLE_WORDS(se,jj0,jj1,x);
- ix = se&0x7fff;
-
- if(ix==0x7fff) {
-
- if (se&0x8000) return one/x-one;
- else return one/x+one;
- }
-
- if (ix < 0x4003 || (ix == 0x4003 && jj0 < 0xb8000000u)) {
- if ((ix|jj0|jj1) == 0)
- return x;
- if (ix<0x3fc8)
- return x*(one+tiny);
- if (ix>=0x3fff) {
- t = expm1l(two*fabsl(x));
- z = one - two/(t+two);
- } else {
- t = expm1l(-two*fabsl(x));
- z= -t/(t+two);
- }
-
- } else {
- z = one - tiny;
- }
- return (se&0x8000)? -z: z;
- }
|