/src/moddable/xs/tools/fdlibm/s_asinh.c
Line | Count | Source |
1 | | /* |
2 | | * ==================================================== |
3 | | * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. |
4 | | * |
5 | | * Developed at SunPro, a Sun Microsystems, Inc. business. |
6 | | * Permission to use, copy, modify, and distribute this |
7 | | * software is freely granted, provided that this notice |
8 | | * is preserved. |
9 | | * ==================================================== |
10 | | */ |
11 | | |
12 | | /* asinh(x) |
13 | | * Method : |
14 | | * Based on |
15 | | * asinh(x) = sign(x) * log [ |x| + sqrt(x*x+1) ] |
16 | | * we have |
17 | | * asinh(x) := x if 1+x*x=1, |
18 | | * := sign(x)*(log(x)+ln2)) for large |x|, else |
19 | | * := sign(x)*log(2|x|+1/(|x|+sqrt(x*x+1))) if|x|>2, else |
20 | | * := sign(x)*log1p(|x| + x^2/(1 + sqrt(1+x^2))) |
21 | | */ |
22 | | |
23 | | #include "math_private.h" |
24 | | |
25 | | static const double |
26 | | one = 1.00000000000000000000e+00, /* 0x3FF00000, 0x00000000 */ |
27 | | ln2 = 6.93147180559945286227e-01, /* 0x3FE62E42, 0xFEFA39EF */ |
28 | | huge= 1.00000000000000000000e+300; |
29 | | |
30 | | double |
31 | | s_asinh(double x) |
32 | 55.8k | { |
33 | 55.8k | double t,w; |
34 | 55.8k | int32_t hx,ix; |
35 | 55.8k | GET_HIGH_WORD(hx,x); |
36 | 55.8k | ix = hx&0x7fffffff; |
37 | 55.8k | if(ix>=0x7ff00000) return x+x; /* x is inf or NaN */ |
38 | 1.68k | if(ix< 0x3e300000) { /* |x|<2**-28 */ |
39 | 679 | if(huge+x>one) return x; /* return x inexact except 0 */ |
40 | 679 | } |
41 | 1.00k | if(ix>0x41b00000) { /* |x| > 2**28 */ |
42 | 66 | w = __ieee754_log(fabs(x))+ln2; |
43 | 937 | } else if (ix>0x40000000) { /* 2**28 > |x| > 2.0 */ |
44 | 676 | t = fabs(x); |
45 | 676 | w = __ieee754_log(2.0*t+one/(sqrt(x*x+one)+t)); |
46 | 676 | } else { /* 2.0 > |x| > 2**-28 */ |
47 | 261 | t = x*x; |
48 | 261 | w =s_log1p(fabs(x)+t/(one+sqrt(one+t))); |
49 | 261 | } |
50 | 1.00k | if(hx>0) return w; else return -w; |
51 | 1.00k | } |