acoshl.c raw

   1  #include "libm.h"
   2  
   3  #if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024
   4  long double acoshl(long double x)
   5  {
   6  	return acosh(x);
   7  }
   8  #elif LDBL_MANT_DIG == 64 && LDBL_MAX_EXP == 16384
   9  /* acosh(x) = log(x + sqrt(x*x-1)) */
  10  long double acoshl(long double x)
  11  {
  12  	union ldshape u = {x};
  13  	int e = u.i.se & 0x7fff;
  14  
  15  	if (e < 0x3fff + 1)
  16  		/* |x| < 2, invalid if x < 1 or nan */
  17  		return log1pl(x-1 + sqrtl((x-1)*(x-1)+2*(x-1)));
  18  	if (e < 0x3fff + 32)
  19  		/* |x| < 0x1p32 */
  20  		return logl(2*x - 1/(x+sqrtl(x*x-1)));
  21  	return logl(x) + 0.693147180559945309417232121458176568L;
  22  }
  23  #elif LDBL_MANT_DIG == 113 && LDBL_MAX_EXP == 16384
  24  // TODO: broken implementation to make things compile
  25  long double acoshl(long double x)
  26  {
  27  	return acosh(x);
  28  }
  29  #endif
  30