LCOV - code coverage report
Current view: top level - modules/fdlibm/src - e_cosh.cpp (source / functions) Hit Total Coverage
Test: output.info Lines: 0 16 0.0 %
Date: 2017-07-14 16:53:18 Functions: 0 1 0.0 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : 
       2             : /* @(#)e_cosh.c 1.3 95/01/18 */
       3             : /*
       4             :  * ====================================================
       5             :  * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
       6             :  *
       7             :  * Developed at SunSoft, a Sun Microsystems, Inc. business.
       8             :  * Permission to use, copy, modify, and distribute this
       9             :  * software is freely granted, provided that this notice 
      10             :  * is preserved.
      11             :  * ====================================================
      12             :  */
      13             : 
      14             : //#include <sys/cdefs.h>
      15             : //__FBSDID("$FreeBSD$");
      16             : 
      17             : /* __ieee754_cosh(x)
      18             :  * Method : 
      19             :  * mathematically cosh(x) if defined to be (exp(x)+exp(-x))/2
      20             :  *      1. Replace x by |x| (cosh(x) = cosh(-x)). 
      21             :  *      2. 
      22             :  *                                                      [ exp(x) - 1 ]^2 
      23             :  *          0        <= x <= ln2/2  :  cosh(x) := 1 + -------------------
      24             :  *                                                         2*exp(x)
      25             :  *
      26             :  *                                                exp(x) +  1/exp(x)
      27             :  *          ln2/2    <= x <= 22     :  cosh(x) := -------------------
      28             :  *                                                        2
      29             :  *          22       <= x <= lnovft :  cosh(x) := exp(x)/2 
      30             :  *          lnovft   <= x <= ln2ovft:  cosh(x) := exp(x/2)/2 * exp(x/2)
      31             :  *          ln2ovft  <  x        :  cosh(x) := huge*huge (overflow)
      32             :  *
      33             :  * Special cases:
      34             :  *      cosh(x) is |x| if x is +INF, -INF, or NaN.
      35             :  *      only cosh(0)=1 is exact for finite x.
      36             :  */
      37             : 
      38             : #include <float.h>
      39             : 
      40             : #include "math_private.h"
      41             : 
      42             : static const double one = 1.0, half=0.5, huge = 1.0e300;
      43             : 
      44             : double
      45           0 : __ieee754_cosh(double x)
      46             : {
      47             :         double t,w;
      48             :         int32_t ix;
      49             : 
      50             :     /* High word of |x|. */
      51           0 :         GET_HIGH_WORD(ix,x);
      52           0 :         ix &= 0x7fffffff;
      53             : 
      54             :     /* x is INF or NaN */
      55           0 :         if(ix>=0x7ff00000) return x*x;       
      56             : 
      57             :     /* |x| in [0,0.5*ln2], return 1+expm1(|x|)^2/(2*exp(|x|)) */
      58           0 :         if(ix<0x3fd62e43) {
      59           0 :             t = expm1(fabs(x));
      60           0 :             w = one+t;
      61           0 :             if (ix<0x3c800000) return w;     /* cosh(tiny) = 1 */
      62           0 :             return one+(t*t)/(w+w);
      63             :         }
      64             : 
      65             :     /* |x| in [0.5*ln2,22], return (exp(|x|)+1/exp(|x|)/2; */
      66           0 :         if (ix < 0x40360000) {
      67           0 :                 t = __ieee754_exp(fabs(x));
      68           0 :                 return half*t+half/t;
      69             :         }
      70             : 
      71             :     /* |x| in [22, log(maxdouble)] return half*exp(|x|) */
      72           0 :         if (ix < 0x40862E42)  return half*__ieee754_exp(fabs(x));
      73             : 
      74             :     /* |x| in [log(maxdouble), overflowthresold] */
      75           0 :         if (ix<=0x408633CE)
      76           0 :             return __ldexp_exp(fabs(x), -1);
      77             : 
      78             :     /* |x| > overflowthresold, cosh(x) overflow */
      79           0 :         return huge*huge;
      80             : }

Generated by: LCOV version 1.13