1 /* ef_atanh.c -- float version of e_atanh.c.
2  * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
3  */
4 
5 /*
6  * ====================================================
7  * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
8  *
9  * Developed at SunPro, a Sun Microsystems, Inc. business.
10  * Permission to use, copy, modify, and distribute this
11  * software is freely granted, provided that this notice
12  * is preserved.
13  * ====================================================
14  *
15  */
16 
17 #include "fdlibm.h"
18 
19 static const float one = 1.0, huge = 1e30;
20 
21 static const float zero = 0.0;
22 
23 float
atanhf(float x)24 atanhf(float x)
25 {
26     float t;
27     __int32_t hx, ix;
28     GET_FLOAT_WORD(hx, x);
29     ix = hx & 0x7fffffff;
30     if (ix > 0x3f800000) /* |x|>1 */
31         return __math_invalidf(x);
32     if (ix == 0x3f800000)
33         return __math_divzerof(x < 0);
34     if (ix < 0x31800000 && (huge + x) > zero)
35         return x; /* x<2**-28 */
36     SET_FLOAT_WORD(x, ix);
37     if (ix < 0x3f000000) { /* x < 0.5 */
38         t = x + x;
39         t = (float)0.5 * log1pf(t + t * x / (one - x));
40     } else
41         t = (float)0.5 * log1pf((x + x) / (one - x));
42     if (hx >= 0)
43         return t;
44     else
45         return -t;
46 }
47 
48 _MATH_ALIAS_f_f(atanh)
49