coshf.c raw

   1  #include "libm.h"
   2  
   3  float coshf(float x)
   4  {
   5  	union {float f; uint32_t i;} u = {.f = x};
   6  	uint32_t w;
   7  	float t;
   8  
   9  	/* |x| */
  10  	u.i &= 0x7fffffff;
  11  	x = u.f;
  12  	w = u.i;
  13  
  14  	/* |x| < log(2) */
  15  	if (w < 0x3f317217) {
  16  		if (w < 0x3f800000 - (12<<23)) {
  17  			FORCE_EVAL(x + 0x1p120f);
  18  			return 1;
  19  		}
  20  		t = expm1f(x);
  21  		return 1 + t*t/(2*(1+t));
  22  	}
  23  
  24  	/* |x| < log(FLT_MAX) */
  25  	if (w < 0x42b17217) {
  26  		t = expf(x);
  27  		return 0.5f*(t + 1/t);
  28  	}
  29  
  30  	/* |x| > log(FLT_MAX) or nan */
  31  	t = __expo2f(x, 1.0f);
  32  	return t;
  33  }
  34