LCOV - code coverage report
Current view: top level - ld80 - s_tanhl.c (source / functions) Coverage Total Hit
Test: app.info Lines: 0.0 % 18 0
Test Date: 2024-01-11 15:52:50 Functions: 0.0 % 1 0
Branches: 0.0 % 18 0

             Branch data     Line data    Source code
       1                 :             : /* @(#)s_tanh.c 5.1 93/09/24 */
       2                 :             : /*
       3                 :             :  * ====================================================
       4                 :             :  * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
       5                 :             :  *
       6                 :             :  * Developed at SunPro, a Sun Microsystems, Inc. business.
       7                 :             :  * Permission to use, copy, modify, and distribute this
       8                 :             :  * software is freely granted, provided that this notice
       9                 :             :  * is preserved.
      10                 :             :  * ====================================================
      11                 :             :  */
      12                 :             : 
      13                 :             : /* tanhl(x)
      14                 :             :  * Return the Hyperbolic Tangent of x
      15                 :             :  *
      16                 :             :  * Method :
      17                 :             :  *                                      x    -x
      18                 :             :  *                                     e  - e
      19                 :             :  *      0. tanhl(x) is defined to be -----------
      20                 :             :  *                                      x    -x
      21                 :             :  *                                     e  + e
      22                 :             :  *      1. reduce x to non-negative by tanhl(-x) = -tanhl(x).
      23                 :             :  *      2.  0      <= x <= 2**-55 : tanhl(x) := x*(one+x)
      24                 :             :  *                                               -t
      25                 :             :  *          2**-55 <  x <=  1     : tanhl(x) := -----; t = expm1l(-2x)
      26                 :             :  *                                              t + 2
      27                 :             :  *                                                    2
      28                 :             :  *          1      <= x <=  23.0  : tanhl(x) := 1-  ----- ; t=expm1l(2x)
      29                 :             :  *                                                  t + 2
      30                 :             :  *          23.0   <  x <= INF    : tanhl(x) := 1.
      31                 :             :  *
      32                 :             :  * Special cases:
      33                 :             :  *      tanhl(NaN) is NaN;
      34                 :             :  *      only tanhl(0)=0 is exact for finite argument.
      35                 :             :  */
      36                 :             : 
      37                 :             : #include <openlibm_math.h>
      38                 :             : 
      39                 :             : #include "math_private.h"
      40                 :             : 
      41                 :             : static const long double one=1.0, two=2.0, tiny = 1.0e-4900L;
      42                 :             : 
      43                 :             : long double
      44                 :           0 : tanhl(long double x)
      45                 :             : {
      46                 :             :         long double t,z;
      47                 :             :         int32_t se;
      48                 :             :         u_int32_t jj0,jj1,ix;
      49                 :             : 
      50                 :             :     /* High word of |x|. */
      51                 :           0 :         GET_LDOUBLE_WORDS(se,jj0,jj1,x);
      52                 :           0 :         ix = se&0x7fff;
      53                 :             : 
      54                 :             :     /* x is INF or NaN */
      55         [ #  # ]:           0 :         if(ix==0x7fff) {
      56                 :             :             /* for NaN it's not important which branch: tanhl(NaN) = NaN */
      57         [ #  # ]:           0 :             if (se&0x8000) return one/x-one;        /* tanhl(-inf)= -1; */
      58                 :           0 :             else           return one/x+one;    /* tanhl(+inf)=+1 */
      59                 :             :         }
      60                 :             : 
      61                 :             :     /* |x| < 23 */
      62   [ #  #  #  #  :           0 :         if (ix < 0x4003 || (ix == 0x4003 && jj0 < 0xb8000000u)) {/* |x|<23 */
                   #  # ]
      63         [ #  # ]:           0 :             if ((ix|jj0|jj1) == 0)
      64                 :           0 :                 return x;               /* x == +- 0 */
      65         [ #  # ]:           0 :             if (ix<0x3fc8)           /* |x|<2**-55 */
      66                 :           0 :                 return x*(one+tiny);    /* tanh(small) = small */
      67         [ #  # ]:           0 :             if (ix>=0x3fff) {        /* |x|>=1  */
      68                 :           0 :                 t = expm1l(two*fabsl(x));
      69                 :           0 :                 z = one - two/(t+two);
      70                 :             :             } else {
      71                 :           0 :                 t = expm1l(-two*fabsl(x));
      72                 :           0 :                 z= -t/(t+two);
      73                 :             :             }
      74                 :             :     /* |x| > 23, return +-1 */
      75                 :             :         } else {
      76                 :           0 :             z = one - tiny;             /* raised inexact flag */
      77                 :             :         }
      78         [ #  # ]:           0 :         return (se&0x8000)? -z: z;
      79                 :             : }
        

Generated by: LCOV version 2.0-115.g950771e