amath  1.6.2
Simple command line calculator
atan.c File Reference
#include "prim.h"
#include "math.h"
Include dependency graph for atan.c:

Go to the source code of this file.

Functions

double atan (double x)
 Inverse trigonometric tangent function. More...
 

Variables

static const double atanhi []
 
static const double atanlo []
 
static const double aT []
 
static const double one = 1.0
 
static const double huge = 1.0e300
 

Function Documentation

double atan ( double  x)

Inverse trigonometric tangent function.

Version
1.3
Date
95/01/18
Method
  1. Reduce x to positive by atan(x) = -atan(-x).
  2. According to the integer k=4t+0.25 chopped, t=x, the argument
     is further reduced to one of the following intervals and the
     arctangent of t is evaluated by the corresponding formula:
     [0,7/16]      atan(x) = t-t^3*(a1+t^2*(a2+...(a10+t^2*a11)...)
     [7/16,11/16]  atan(x) = atan(1/2) + atan( (t-0.5)/(1+t/2) )
     [11/16.19/16] atan(x) = atan( 1 ) + atan( (t-1)/(1+t) )
     [19/16,39/16] atan(x) = atan(3/2) + atan( (t-1.5)/(1+1.5t) )
     [39/16,INF]   atan(x) = atan(INF) + atan( -1/t )
Constants:
The hexadecimal values are the intended ones for the following
constants. The decimal values may be used, provided that the
compiler will convert from decimal to binary accurately enough
to produce the hexadecimal values shown.

Definition at line 109 of file atan.c.

References aT, atanhi, atanlo, huge, and one.

Referenced by RealNumber::ArcCotangent(), RealNumber::ArcTangent(), and atan2().

110 {
111  double w,s1,s2,z;
112  sword ix,hx,id;
113 
114  GET_HIGH_WORD(hx,x);
115  ix = hx&0x7fffffff;
116  if(ix>=0x44100000) { /* if |x| >= 2^66 */
117  uword low;
118 
119  GET_LOW_WORD(low,x);
120  if(ix>0x7ff00000||
121  (ix==0x7ff00000&&(low!=0)))
122  return x+x; /* NaN */
123  if(hx>0) return atanhi[3]+atanlo[3];
124  else return -atanhi[3]-atanlo[3];
125  }
126  if (ix < 0x3fdc0000) { /* |x| < 0.4375 */
127  if (ix < 0x3e200000) { /* |x| < 2^-29 */
128  if(huge+x>one) return x; /* raise inexact */
129  }
130  id = -1;
131  } else {
132  x = fabs(x);
133  if (ix < 0x3ff30000) { /* |x| < 1.1875 */
134  if (ix < 0x3fe60000) { /* 7/16 <=|x|<11/16 */
135  id = 0;
136  x = (2.0*x-one)/(2.0+x);
137  } else { /* 11/16<=|x|< 19/16 */
138  id = 1;
139  x = (x-one)/(x+one);
140  }
141  } else {
142  if (ix < 0x40038000) { /* |x| < 2.4375 */
143  id = 2;
144  x = (x-1.5)/(one+1.5*x);
145  } else { /* 2.4375 <= |x| < 2^66 */
146  id = 3;
147  x = -1.0/x;
148  }
149  }
150  }
151  /* end of argument reduction */
152  z = x*x;
153  w = z*z;
154  /* break sum from i=0 to 10 aT[i]z**(i+1) into odd and even poly */
155  s1 = z*(aT[0]+w*(aT[2]+w*(aT[4]+w*(aT[6]+w*(aT[8]+w*aT[10])))));
156  s2 = w*(aT[1]+w*(aT[3]+w*(aT[5]+w*(aT[7]+w*aT[9]))));
157  if (id<0) return x - x*(s1+s2);
158  else {
159  z = atanhi[id] - ((x*(s1+s2) - atanlo[id]) - x);
160  return (hx<0)? -z:z;
161  }
162 }
#define GET_HIGH_WORD(i, d)
Get the more significant 32 bit int from a double.
Definition: prim.h:165
static const double huge
Definition: atan.c:77
#define GET_LOW_WORD(i, d)
Get the less significant 32 bit int from a double.
Definition: prim.h:176
signed int sword
32 bit signed integer.
Definition: prim.h:107
double fabs(double x)
Returns the absolute value of x.
Definition: fabs.c:51
static const double aT[]
Definition: atan.c:61
unsigned int uword
32 bit unsigned integer.
Definition: prim.h:101
static const double atanhi[]
Definition: atan.c:47
static const double one
Definition: atan.c:76
static const double atanlo[]
Definition: atan.c:54

Here is the caller graph for this function:

Variable Documentation

const double aT[]
static
Initial value:
= {
3.33333333333329318027e-01,
-1.99999999998764832476e-01,
1.42857142725034663711e-01,
-1.11111104054623557880e-01,
9.09088713343650656196e-02,
-7.69187620504482999495e-02,
6.66107313738753120669e-02,
-5.83357013379057348645e-02,
4.97687799461593236017e-02,
-3.65315727442169155270e-02,
1.62858201153657823623e-02,
}

Definition at line 61 of file atan.c.

Referenced by atan().

const double atanhi[]
static
Initial value:
= {
4.63647609000806093515e-01,
7.85398163397448278999e-01,
9.82793723247329054082e-01,
1.57079632679489655800e+00,
}

Definition at line 47 of file atan.c.

Referenced by atan().

const double atanlo[]
static
Initial value:
= {
2.26987774529616870924e-17,
3.06161699786838301793e-17,
1.39033110312309984516e-17,
6.12323399573676603587e-17,
}

Definition at line 54 of file atan.c.

Referenced by atan().

const double huge = 1.0e300
static

Definition at line 77 of file atan.c.

Referenced by atan().

const double one = 1.0
static

Definition at line 76 of file atan.c.

Referenced by atan().