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