]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
Handle x == +-0 as a special case since tanh(-0) == -0.
authorUlrich Drepper <drepper@redhat.com>
Thu, 20 Mar 1997 03:21:53 +0000 (03:21 +0000)
committerUlrich Drepper <drepper@redhat.com>
Thu, 20 Mar 1997 03:21:53 +0000 (03:21 +0000)
sysdeps/libm-ieee754/s_tanh.c
sysdeps/libm-ieee754/s_tanhf.c
sysdeps/libm-ieee754/s_tanhl.c

index 208b459b356bbdda6b7b65bebe39da7906a3b016..944f96386f93cbdbcaa9da701686ada4c010b58e 100644 (file)
@@ -55,10 +55,10 @@ static double one=1.0, two=2.0, tiny = 1.0e-300;
 #endif
 {
        double t,z;
-       int32_t jx,ix;
+       int32_t jx,ix,lx;
 
     /* High word of |x|. */
-       GET_HIGH_WORD(jx,x);
+       EXTRACT_WORDS(jx,lx,x);
        ix = jx&0x7fffffff;
 
     /* x is INF or NaN */
@@ -69,6 +69,8 @@ static double one=1.0, two=2.0, tiny = 1.0e-300;
 
     /* |x| < 22 */
        if (ix < 0x40360000) {          /* |x|<22 */
+           if ((ix | lx) == 0)
+               return x;               /* x == +-0 */
            if (ix<0x3c800000)          /* |x|<2**-55 */
                return x*(one+x);       /* tanh(small) = small */
            if (ix>=0x3ff00000) {       /* |x|>=1  */
index b989ef3565b208ff5f45ef101c27b82c7a06e8ea..2a0ca9f3dfc6d708367b87c60038e4fc31d698fc 100644 (file)
@@ -8,7 +8,7 @@
  *
  * Developed at SunPro, a Sun Microsystems, Inc. business.
  * Permission to use, copy, modify, and distribute this
- * software is freely granted, provided that this notice 
+ * software is freely granted, provided that this notice
  * is preserved.
  * ====================================================
  */
@@ -40,13 +40,15 @@ static float one=1.0, two=2.0, tiny = 1.0e-30;
        ix = jx&0x7fffffff;
 
     /* x is INF or NaN */
-       if(ix>=0x7f800000) { 
+       if(ix>=0x7f800000) {
            if (jx>=0) return one/x+one;    /* tanh(+-inf)=+-1 */
            else       return one/x-one;    /* tanh(NaN) = NaN */
        }
 
     /* |x| < 22 */
        if (ix < 0x41b00000) {          /* |x|<22 */
+           if (ix == 0)
+               return x;               /* x == +-0 */
            if (ix<0x24000000)          /* |x|<2**-55 */
                return x*(one+x);       /* tanh(small) = small */
            if (ix>=0x3f800000) {       /* |x|>=1  */
index f7ea3f4216660d8da533bcde5d3c162c9aca68eb..1e3dc3b61304364bf26f9a1bf56ab360074c3da7 100644 (file)
@@ -68,12 +68,15 @@ static long double one=1.0, two=2.0, tiny = 1.0e-4900L;
 
     /* x is INF or NaN */
        if(ix==0x7fff) {
-           if (se>=0x7fff) return one/x+one;    /* tanhl(+-inf)=+-1 */
-           else            return one/x-one;    /* tanhl(NaN) = NaN */
+           /* for NaN it's not important which branch: tanhl(NaN) = NaN */
+           if (se&0x8000) return one/x-one;    /* tanhl(-inf)= -1; */
+           else           return one/x+one;    /* tanhl(+inf)=+1 */
        }
 
     /* |x| < 23 */
        if (ix < 0x4003 || (ix == 0x4003 && j0 < 0xb8000000u)) {/* |x|<23 */
+           if ((ix|j0|j1) == 0)
+               return x;               /* x == +- 0 */
            if (ix<0x3fc8)              /* |x|<2**-55 */
                return x*(one+x);       /* tanh(small) = small */
            if (ix>=0x3fff) {   /* |x|>=1  */