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