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

     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