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

     1  #include "libm.h"
     2  
     3  #if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024
     4  long double tanl(long double x)
     5  {
     6  	return tan(x);
     7  }
     8  #elif (LDBL_MANT_DIG == 64 || LDBL_MANT_DIG == 113) && LDBL_MAX_EXP == 16384
     9  long double tanl(long double x)
    10  {
    11  	union ldshape u = {x};
    12  	long double y[2];
    13  	unsigned n;
    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 __tanl(x, 0, 0);
    25  	}
    26  	n = __rem_pio2l(x, y);
    27  	return __tanl(y[0], y[1], n&1);
    28  }
    29  #endif