1#include "libm.h" 2 3#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024 4long double sinl(long double x) { 5 return sin(x); 6} 7#elif (LDBL_MANT_DIG == 64 || LDBL_MANT_DIG == 113) && LDBL_MAX_EXP == 16384 8long double sinl(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 if (u.f < M_PI_4) { 17 if (u.i.se < 0x3fff - LDBL_MANT_DIG / 2) { 18 /* raise inexact if x!=0 and underflow if subnormal */ 19 FORCE_EVAL(u.i.se == 0 ? x * 0x1p-120f : x + 0x1p120f); 20 return x; 21 } 22 return __sinl(x, 0.0, 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 __sinl(hi, lo, 1); 30 case 1: 31 return __cosl(hi, lo); 32 case 2: 33 return -__sinl(hi, lo, 1); 34 case 3: 35 default: 36 return -__cosl(hi, lo); 37 } 38} 39#endif 40