github.com/afumu/libc@v0.0.6/musl/src/math/sinl.c (about)

     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