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