#include <sys/cdefs.h>
#if defined(LIBM_SCCS) && !defined(lint)
__RCSID("$NetBSD: e_atanhf.c,v 1.7 2002/05/26 22:01:49 wiz Exp $");
#endif
#include "math.h"
#include "math_private.h"
static const float one = 1.0, huge = 1e30;
static const float zero = 0.0;
float
__ieee754_atanhf(float x)
{
float t;
int32_t hx,ix;
GET_FLOAT_WORD(hx,x);
ix = hx&0x7fffffff;
if (ix>0x3f800000)
return (x-x)/(x-x);
if(ix==0x3f800000)
return x/zero;
if(ix<0x31800000&&(huge+x)>zero) return x;
SET_FLOAT_WORD(x,ix);
if(ix<0x3f000000) {
t = x+x;
t = (float)0.5*log1pf(t+t*x/(one-x));
} else
t = (float)0.5*log1pf((x+x)/(one-x));
if(hx>=0) return t; else return -t;
}