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

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