#include "libm.h"12/* atanh(x) = log((1+x)/(1-x))/2 = log1p(2x/(1-x))/2 ~= x + x^3/3 + o(x^5) */3float __cdecl atanhf(float x)4{5union {float f; uint32_t i;} u = {.f = x};6unsigned s = u.i >> 31;7float_t y;89/* |x| */10u.i &= 0x7fffffff;11y = u.f;1213if (u.i < 0x3f800000 - (1<<23)) {14if (u.i < 0x3f800000 - (32<<23)) {15fp_barrierf(y + 0x1p120f);16/* handle underflow */17if (u.i < (1<<23))18FORCE_EVAL((float)(y*y));19} else {20/* |x| < 0.5, up to 1.7ulp error */21y = 0.5f*log1pf(2*y + 2*y*y/(1-y));22}23} else {24/* avoid overflow */25y = 0.5f*log1pf(2*(y/(1-y)));26if (isinf(y)) errno = ERANGE;27}28return s ? -y : y;29}303132