xref: /minix3/lib/libm/src/e_atanhf.c (revision 2fe8fb192fe7e8720e3e7a77f928da545e872a6a)
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