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

     1  #include "libm.h"
     2  
     3  #if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024
     4  long double atanhl(long double x)
     5  {
     6  	return atanh(x);
     7  }
     8  #elif (LDBL_MANT_DIG == 64 || LDBL_MANT_DIG == 113) && LDBL_MAX_EXP == 16384
     9  /* atanh(x) = log((1+x)/(1-x))/2 = log1p(2x/(1-x))/2 ~= x + x^3/3 + o(x^5) */
    10  long double atanhl(long double x)
    11  {
    12  	union ldshape u = {x};
    13  	unsigned e = u.i.se & 0x7fff;
    14  	unsigned s = u.i.se >> 15;
    15  
    16  	/* |x| */
    17  	u.i.se = e;
    18  	x = u.f;
    19  
    20  	if (e < 0x3ff - 1) {
    21  		if (e < 0x3ff - LDBL_MANT_DIG/2) {
    22  			/* handle underflow */
    23  			if (e == 0)
    24  				FORCE_EVAL((float)x);
    25  		} else {
    26  			/* |x| < 0.5, up to 1.7ulp error */
    27  			x = 0.5*log1pl(2*x + 2*x*x/(1-x));
    28  		}
    29  	} else {
    30  		/* avoid overflow */
    31  		x = 0.5*log1pl(2*(x/(1-x)));
    32  	}
    33  	return s ? -x : x;
    34  }
    35  #endif