(root)/
glibc-2.38/
sysdeps/
ieee754/
flt-32/
e_coshf.c
       1  /* e_coshf.c -- float version of e_cosh.c.
       2   */
       3  
       4  /*
       5   * ====================================================
       6   * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
       7   *
       8   * Developed at SunPro, a Sun Microsystems, Inc. business.
       9   * Permission to use, copy, modify, and distribute this
      10   * software is freely granted, provided that this notice
      11   * is preserved.
      12   * ====================================================
      13   */
      14  
      15  #include <math.h>
      16  #include <math-narrow-eval.h>
      17  #include <math_private.h>
      18  #include <libm-alias-finite.h>
      19  
      20  static const float huge = 1.0e30;
      21  static const float one = 1.0, half=0.5;
      22  
      23  float
      24  __ieee754_coshf (float x)
      25  {
      26  	float t,w;
      27  	int32_t ix;
      28  
      29  	GET_FLOAT_WORD(ix,x);
      30  	ix &= 0x7fffffff;
      31  
      32      /* |x| in [0,22] */
      33  	if (ix < 0x41b00000) {
      34  	    /* |x| in [0,0.5*ln2], return 1+expm1(|x|)^2/(2*exp(|x|)) */
      35  		if(ix<0x3eb17218) {
      36  		    if (ix<0x24000000) return one;	/* cosh(tiny) = 1 */
      37  		    t = __expm1f(fabsf(x));
      38  		    w = one+t;
      39  		    return one+(t*t)/(w+w);
      40  		}
      41  
      42  	    /* |x| in [0.5*ln2,22], return (exp(|x|)+1/exp(|x|)/2; */
      43  		t = __ieee754_expf(fabsf(x));
      44  		return half*t+half/t;
      45  	}
      46  
      47      /* |x| in [22, log(maxdouble)] return half*exp(|x|) */
      48  	if (ix < 0x42b17180)  return half*__ieee754_expf(fabsf(x));
      49  
      50      /* |x| in [log(maxdouble), overflowthresold] */
      51  	if (ix<=0x42b2d4fc) {
      52  	    w = __ieee754_expf(half*fabsf(x));
      53  	    t = half*w;
      54  	    return t*w;
      55  	}
      56  
      57      /* x is INF or NaN */
      58  	if(ix>=0x7f800000) return x*x;
      59  
      60      /* |x| > overflowthresold, cosh(x) overflow */
      61  	return math_narrow_eval (huge*huge);
      62  }
      63  libm_alias_finite (__ieee754_coshf, __coshf)