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