/src/moddable/xs/tools/fdlibm/e_atanh.c
Line | Count | Source |
1 | | |
2 | | /* |
3 | | * ==================================================== |
4 | | * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. |
5 | | * |
6 | | * Developed at SunSoft, a Sun Microsystems, Inc. business. |
7 | | * Permission to use, copy, modify, and distribute this |
8 | | * software is freely granted, provided that this notice |
9 | | * is preserved. |
10 | | * ==================================================== |
11 | | * |
12 | | */ |
13 | | |
14 | | /* atanh(x) |
15 | | * Method : |
16 | | * 1.Reduced x to positive by atanh(-x) = -atanh(x) |
17 | | * 2.For x>=0.5 |
18 | | * 1 2x x |
19 | | * atanh(x) = --- * log(1 + -------) = 0.5 * log1p(2 * --------) |
20 | | * 2 1 - x 1 - x |
21 | | * |
22 | | * For x<0.5 |
23 | | * atanh(x) = 0.5*log1p(2x+2x*x/(1-x)) |
24 | | * |
25 | | * Special cases: |
26 | | * atanh(x) is NaN if |x| > 1 with signal; |
27 | | * atanh(NaN) is that NaN with no signal; |
28 | | * atanh(+-1) is +-INF with signal. |
29 | | * |
30 | | */ |
31 | | |
32 | | #include "math_private.h" |
33 | | |
34 | | static const double one = 1.0, huge = 1e300; |
35 | | static const double zero = 0.0; |
36 | | |
37 | | double |
38 | | __ieee754_atanh(double x) |
39 | 696k | { |
40 | 696k | double t; |
41 | 696k | int32_t hx,ix; |
42 | 696k | u_int32_t lx; |
43 | 696k | EXTRACT_WORDS(hx,lx,x); |
44 | 696k | ix = hx&0x7fffffff; |
45 | 696k | if ((ix|((lx|(-lx))>>31))>0x3ff00000) /* |x|>1 */ |
46 | 74.7k | return (x-x)/(x-x); |
47 | 622k | if(ix==0x3ff00000) |
48 | 506k | return x/zero; |
49 | 115k | if(ix<0x3e300000&&(huge+x)>zero) return x; /* x<2**-28 */ |
50 | 75.2k | SET_HIGH_WORD(x,ix); |
51 | 75.2k | if(ix<0x3fe00000) { /* x < 0.5 */ |
52 | 75.2k | t = x+x; |
53 | 75.2k | t = 0.5*s_log1p(t+t*x/(one-x)); |
54 | 75.2k | } else |
55 | 1 | t = 0.5*s_log1p((x+x)/(one-x)); |
56 | 75.2k | if(hx>=0) return t; else return -t; |
57 | 75.2k | } |