sinhl.c raw

   1  #include "libm.h"
   2  
   3  #if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024
   4  long double sinhl(long double x)
   5  {
   6  	return sinh(x);
   7  }
   8  #elif LDBL_MANT_DIG == 64 && LDBL_MAX_EXP == 16384
   9  long double sinhl(long double x)
  10  {
  11  	union ldshape u = {x};
  12  	unsigned ex = u.i.se & 0x7fff;
  13  	long double h, t, absx;
  14  
  15  	h = 0.5;
  16  	if (u.i.se & 0x8000)
  17  		h = -h;
  18  	/* |x| */
  19  	u.i.se = ex;
  20  	absx = u.f;
  21  
  22  	/* |x| < log(LDBL_MAX) */
  23  	if (ex < 0x3fff+13 || (ex == 0x3fff+13 && u.i.m>>32 < 0xb17217f7)) {
  24  		t = expm1l(absx);
  25  		if (ex < 0x3fff) {
  26  			if (ex < 0x3fff-32)
  27  				return x;
  28  			return h*(2*t - t*t/(1+t));
  29  		}
  30  		return h*(t + t/(t+1));
  31  	}
  32  
  33  	/* |x| > log(LDBL_MAX) or nan */
  34  	t = expl(0.5*absx);
  35  	return h*t*t;
  36  }
  37  #elif LDBL_MANT_DIG == 113 && LDBL_MAX_EXP == 16384
  38  // TODO: broken implementation to make things compile
  39  long double sinhl(long double x)
  40  {
  41  	return sinh(x);
  42  }
  43  #endif
  44