initial commit
[libm] / src / math / asinhf.c
1 /* origin: FreeBSD /usr/src/lib/msun/src/s_asinhf.c */
2 /*
3  * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
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 #include "libm.h"
17
18 static const float
19 one = 1.0000000000e+00, /* 0x3F800000 */
20 ln2 = 6.9314718246e-01, /* 0x3f317218 */
21 huge= 1.0000000000e+30;
22
23 float asinhf(float x)
24 {
25         float t,w;
26         int32_t hx,ix;
27
28         GET_FLOAT_WORD(hx, x);
29         ix = hx & 0x7fffffff;
30         if (ix >= 0x7f800000)   /* x is inf or NaN */
31                 return x+x;
32         if (ix < 0x31800000) {  /* |x| < 2**-28 */
33                 /* return x inexact except 0 */
34                 if (huge+x > one)
35                         return x;
36         }
37         if (ix > 0x4d800000) {  /* |x| > 2**28 */
38                 w = logf(fabsf(x)) + ln2;
39         } else if (ix > 0x40000000) {  /* 2**28 > |x| > 2.0 */
40                 t = fabsf(x);
41                 w = logf((float)2.0*t + one/(sqrtf(x*x+one)+t));
42         } else {                /* 2.0 > |x| > 2**-28 */
43                 t = x*x;
44                 w =log1pf(fabsf(x) + t/(one+sqrtf(one+t)));
45         }
46         if (hx > 0)
47                 return w;
48         return -w;
49 }