cosl.c raw

   1  #include "libm.h"
   2  
   3  #if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024
   4  long double cosl(long double x) {
   5  	return cos(x);
   6  }
   7  #elif (LDBL_MANT_DIG == 64 || LDBL_MANT_DIG == 113) && LDBL_MAX_EXP == 16384
   8  long double cosl(long double x)
   9  {
  10  	union ldshape u = {x};
  11  	unsigned n;
  12  	long double y[2], hi, lo;
  13  
  14  	u.i.se &= 0x7fff;
  15  	if (u.i.se == 0x7fff)
  16  		return x - x;
  17  	x = u.f;
  18  	if (x < M_PI_4) {
  19  		if (u.i.se < 0x3fff - LDBL_MANT_DIG)
  20  			/* raise inexact if x!=0 */
  21  			return 1.0 + x;
  22  		return __cosl(x, 0);
  23  	}
  24  	n = __rem_pio2l(x, y);
  25  	hi = y[0];
  26  	lo = y[1];
  27  	switch (n & 3) {
  28  	case 0:
  29  		return __cosl(hi, lo);
  30  	case 1:
  31  		return -__sinl(hi, lo, 1);
  32  	case 2:
  33  		return -__cosl(hi, lo);
  34  	case 3:
  35  	default:
  36  		return __sinl(hi, lo, 1);
  37  	}
  38  }
  39  #endif
  40