source: trunk/libs/newlib/src/newlib/libm/math/ef_atanh.c @ 543

Last change on this file since 543 was 444, checked in by satin@…, 6 years ago

add newlib,libalmos-mkh, restructure shared_syscalls.h and mini-libc

File size: 1.2 KB
Line 
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#ifdef __STDC__
20static const float one = 1.0, huge = 1e30;
21#else
22static float one = 1.0, huge = 1e30;
23#endif
24
25#ifdef __STDC__
26static const float zero = 0.0;
27#else
28static float zero = 0.0;
29#endif
30
31#ifdef __STDC__
32        float __ieee754_atanhf(float x)
33#else
34        float __ieee754_atanhf(x)
35        float x;
36#endif
37{
38        float t;
39        __int32_t hx,ix;
40        GET_FLOAT_WORD(hx,x);
41        ix = hx&0x7fffffff;
42        if (ix>0x3f800000)              /* |x|>1 */
43            return (x-x)/(x-x);
44        if(ix==0x3f800000) 
45            return x/zero;
46        if(ix<0x31800000&&(huge+x)>zero) return x;      /* x<2**-28 */
47        SET_FLOAT_WORD(x,ix);
48        if(ix<0x3f000000) {             /* x < 0.5 */
49            t = x+x;
50            t = (float)0.5*log1pf(t+t*x/(one-x));
51        } else 
52            t = (float)0.5*log1pf((x+x)/(one-x));
53        if(hx>=0) return t; else return -t;
54}
Note: See TracBrowser for help on using the repository browser.