1*c9945492SAndroid Build Coastguard Worker /* origin: OpenBSD /usr/src/lib/libm/src/s_catanf.c */
2*c9945492SAndroid Build Coastguard Worker /*
3*c9945492SAndroid Build Coastguard Worker * Copyright (c) 2008 Stephen L. Moshier <[email protected]>
4*c9945492SAndroid Build Coastguard Worker *
5*c9945492SAndroid Build Coastguard Worker * Permission to use, copy, modify, and distribute this software for any
6*c9945492SAndroid Build Coastguard Worker * purpose with or without fee is hereby granted, provided that the above
7*c9945492SAndroid Build Coastguard Worker * copyright notice and this permission notice appear in all copies.
8*c9945492SAndroid Build Coastguard Worker *
9*c9945492SAndroid Build Coastguard Worker * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10*c9945492SAndroid Build Coastguard Worker * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11*c9945492SAndroid Build Coastguard Worker * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12*c9945492SAndroid Build Coastguard Worker * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13*c9945492SAndroid Build Coastguard Worker * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14*c9945492SAndroid Build Coastguard Worker * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15*c9945492SAndroid Build Coastguard Worker * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16*c9945492SAndroid Build Coastguard Worker */
17*c9945492SAndroid Build Coastguard Worker /*
18*c9945492SAndroid Build Coastguard Worker * Complex circular arc tangent
19*c9945492SAndroid Build Coastguard Worker *
20*c9945492SAndroid Build Coastguard Worker *
21*c9945492SAndroid Build Coastguard Worker * SYNOPSIS:
22*c9945492SAndroid Build Coastguard Worker *
23*c9945492SAndroid Build Coastguard Worker * float complex catanf();
24*c9945492SAndroid Build Coastguard Worker * float complex z, w;
25*c9945492SAndroid Build Coastguard Worker *
26*c9945492SAndroid Build Coastguard Worker * w = catanf( z );
27*c9945492SAndroid Build Coastguard Worker *
28*c9945492SAndroid Build Coastguard Worker *
29*c9945492SAndroid Build Coastguard Worker * DESCRIPTION:
30*c9945492SAndroid Build Coastguard Worker *
31*c9945492SAndroid Build Coastguard Worker * If
32*c9945492SAndroid Build Coastguard Worker * z = x + iy,
33*c9945492SAndroid Build Coastguard Worker *
34*c9945492SAndroid Build Coastguard Worker * then
35*c9945492SAndroid Build Coastguard Worker * 1 ( 2x )
36*c9945492SAndroid Build Coastguard Worker * Re w = - arctan(-----------) + k PI
37*c9945492SAndroid Build Coastguard Worker * 2 ( 2 2)
38*c9945492SAndroid Build Coastguard Worker * (1 - x - y )
39*c9945492SAndroid Build Coastguard Worker *
40*c9945492SAndroid Build Coastguard Worker * ( 2 2)
41*c9945492SAndroid Build Coastguard Worker * 1 (x + (y+1) )
42*c9945492SAndroid Build Coastguard Worker * Im w = - log(------------)
43*c9945492SAndroid Build Coastguard Worker * 4 ( 2 2)
44*c9945492SAndroid Build Coastguard Worker * (x + (y-1) )
45*c9945492SAndroid Build Coastguard Worker *
46*c9945492SAndroid Build Coastguard Worker * Where k is an arbitrary integer.
47*c9945492SAndroid Build Coastguard Worker *
48*c9945492SAndroid Build Coastguard Worker *
49*c9945492SAndroid Build Coastguard Worker * ACCURACY:
50*c9945492SAndroid Build Coastguard Worker *
51*c9945492SAndroid Build Coastguard Worker * Relative error:
52*c9945492SAndroid Build Coastguard Worker * arithmetic domain # trials peak rms
53*c9945492SAndroid Build Coastguard Worker * IEEE -10,+10 30000 2.3e-6 5.2e-8
54*c9945492SAndroid Build Coastguard Worker */
55*c9945492SAndroid Build Coastguard Worker
56*c9945492SAndroid Build Coastguard Worker #include "complex_impl.h"
57*c9945492SAndroid Build Coastguard Worker
58*c9945492SAndroid Build Coastguard Worker #define MAXNUMF 1.0e38F
59*c9945492SAndroid Build Coastguard Worker
60*c9945492SAndroid Build Coastguard Worker static const double DP1 = 3.140625;
61*c9945492SAndroid Build Coastguard Worker static const double DP2 = 9.67502593994140625E-4;
62*c9945492SAndroid Build Coastguard Worker static const double DP3 = 1.509957990978376432E-7;
63*c9945492SAndroid Build Coastguard Worker
64*c9945492SAndroid Build Coastguard Worker static const float float_pi = M_PI;
65*c9945492SAndroid Build Coastguard Worker
_redupif(float xx)66*c9945492SAndroid Build Coastguard Worker static float _redupif(float xx)
67*c9945492SAndroid Build Coastguard Worker {
68*c9945492SAndroid Build Coastguard Worker float x, t;
69*c9945492SAndroid Build Coastguard Worker long i;
70*c9945492SAndroid Build Coastguard Worker
71*c9945492SAndroid Build Coastguard Worker x = xx;
72*c9945492SAndroid Build Coastguard Worker t = x/float_pi;
73*c9945492SAndroid Build Coastguard Worker if (t >= 0.0f)
74*c9945492SAndroid Build Coastguard Worker t += 0.5f;
75*c9945492SAndroid Build Coastguard Worker else
76*c9945492SAndroid Build Coastguard Worker t -= 0.5f;
77*c9945492SAndroid Build Coastguard Worker
78*c9945492SAndroid Build Coastguard Worker i = t; /* the multiple */
79*c9945492SAndroid Build Coastguard Worker t = i;
80*c9945492SAndroid Build Coastguard Worker t = ((x - t * DP1) - t * DP2) - t * DP3;
81*c9945492SAndroid Build Coastguard Worker return t;
82*c9945492SAndroid Build Coastguard Worker }
83*c9945492SAndroid Build Coastguard Worker
catanf(float complex z)84*c9945492SAndroid Build Coastguard Worker float complex catanf(float complex z)
85*c9945492SAndroid Build Coastguard Worker {
86*c9945492SAndroid Build Coastguard Worker float complex w;
87*c9945492SAndroid Build Coastguard Worker float a, t, x, x2, y;
88*c9945492SAndroid Build Coastguard Worker
89*c9945492SAndroid Build Coastguard Worker x = crealf(z);
90*c9945492SAndroid Build Coastguard Worker y = cimagf(z);
91*c9945492SAndroid Build Coastguard Worker
92*c9945492SAndroid Build Coastguard Worker x2 = x * x;
93*c9945492SAndroid Build Coastguard Worker a = 1.0f - x2 - (y * y);
94*c9945492SAndroid Build Coastguard Worker
95*c9945492SAndroid Build Coastguard Worker t = 0.5f * atan2f(2.0f * x, a);
96*c9945492SAndroid Build Coastguard Worker w = _redupif(t);
97*c9945492SAndroid Build Coastguard Worker
98*c9945492SAndroid Build Coastguard Worker t = y - 1.0f;
99*c9945492SAndroid Build Coastguard Worker a = x2 + (t * t);
100*c9945492SAndroid Build Coastguard Worker
101*c9945492SAndroid Build Coastguard Worker t = y + 1.0f;
102*c9945492SAndroid Build Coastguard Worker a = (x2 + (t * t))/a;
103*c9945492SAndroid Build Coastguard Worker w = CMPLXF(w, 0.25f * logf(a));
104*c9945492SAndroid Build Coastguard Worker return w;
105*c9945492SAndroid Build Coastguard Worker }
106