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