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

     1  #include "libm.h"
     2  
     3  #if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024
     4  long double sinhl(long double x)
     5  {
     6  	return sinh(x);
     7  }
     8  #elif LDBL_MANT_DIG == 64 && LDBL_MAX_EXP == 16384
     9  long double sinhl(long double x)
    10  {
    11  	union ldshape u = {x};
    12  	unsigned ex = u.i.se & 0x7fff;
    13  	long double h, t, absx;
    14  
    15  	h = 0.5;
    16  	if (u.i.se & 0x8000)
    17  		h = -h;
    18  	/* |x| */
    19  	u.i.se = ex;
    20  	absx = u.f;
    21  
    22  	/* |x| < log(LDBL_MAX) */
    23  	if (ex < 0x3fff+13 || (ex == 0x3fff+13 && u.i.m>>32 < 0xb17217f7)) {
    24  		t = expm1l(absx);
    25  		if (ex < 0x3fff) {
    26  			if (ex < 0x3fff-32)
    27  				return x;
    28  			return h*(2*t - t*t/(1+t));
    29  		}
    30  		return h*(t + t/(t+1));
    31  	}
    32  
    33  	/* |x| > log(LDBL_MAX) or nan */
    34  	t = expl(0.5*absx);
    35  	return h*t*t;
    36  }
    37  #elif LDBL_MANT_DIG == 113 && LDBL_MAX_EXP == 16384
    38  // TODO: broken implementation to make things compile
    39  long double sinhl(long double x)
    40  {
    41  	return sinh(x);
    42  }
    43  #endif