Numworks Epsilon  1.4.1
Graphing Calculator Operating System
e_atanh.c
Go to the documentation of this file.
1 /* @(#)e_atanh.c 5.1 93/09/24 */
2 /*
3  * ====================================================
4  * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
5  *
6  * Developed at SunPro, 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 /* atanh(x)
14  * Method :
15  * 1.Reduced x to positive by atanh(-x) = -atanh(x)
16  * 2.For x>=0.5
17  * 1 2x x
18  * atanh(x) = --- * log(1 + -------) = 0.5 * log1p(2 * --------)
19  * 2 1 - x 1 - x
20  *
21  * For x<0.5
22  * atanh(x) = 0.5*log1p(2x+2x*x/(1-x))
23  *
24  * Special cases:
25  * atanh(x) is NaN if |x| > 1 with signal;
26  * atanh(NaN) is that NaN with no signal;
27  * atanh(+-1) is +-INF with signal.
28  *
29  */
30 
31 #include "math.h"
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 atanh(double x)
39 {
40  double t;
41  int32_t hx,ix;
42  u_int32_t lx;
43  EXTRACT_WORDS(hx,lx,x);
44  ix = hx&0x7fffffff;
45  if ((ix|((lx|(-lx))>>31))>0x3ff00000) /* |x|>1 */
46  return (x-x)/(x-x);
47  if(ix==0x3ff00000)
48  return x/zero;
49  if(ix<0x3e300000&&(huge+x)>zero) return x; /* x<2**-28 */
50  SET_HIGH_WORD(x,ix);
51  if(ix<0x3fe00000) { /* x < 0.5 */
52  t = x+x;
53  t = 0.5*log1p(t+t*x/(one-x));
54  } else
55  t = 0.5*log1p((x+x)/(one-x));
56  if(hx>=0) return t; else return -t;
57 }
#define log1p(x)
Definition: math.h:185
#define one
Definition: k_tan.c:68
uint32_t u_int32_t
Definition: types.h:10
#define SET_HIGH_WORD(d, v)
Definition: math_private.h:297
#define EXTRACT_WORDS(ix0, ix1, d)
Definition: math_private.h:259
signed int int32_t
Definition: stdint.h:11
double atanh(double x)
Definition: e_atanh.c:38