1*58b9f456SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
2*58b9f456SAndroid Build Coastguard Worker //
3*58b9f456SAndroid Build Coastguard Worker // The LLVM Compiler Infrastructure
4*58b9f456SAndroid Build Coastguard Worker //
5*58b9f456SAndroid Build Coastguard Worker // This file is dual licensed under the MIT and the University of Illinois Open
6*58b9f456SAndroid Build Coastguard Worker // Source Licenses. See LICENSE.TXT for details.
7*58b9f456SAndroid Build Coastguard Worker //
8*58b9f456SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
9*58b9f456SAndroid Build Coastguard Worker
10*58b9f456SAndroid Build Coastguard Worker // <complex>
11*58b9f456SAndroid Build Coastguard Worker
12*58b9f456SAndroid Build Coastguard Worker // test cases
13*58b9f456SAndroid Build Coastguard Worker
14*58b9f456SAndroid Build Coastguard Worker #ifndef CASES_H
15*58b9f456SAndroid Build Coastguard Worker #define CASES_H
16*58b9f456SAndroid Build Coastguard Worker
17*58b9f456SAndroid Build Coastguard Worker #include <complex>
18*58b9f456SAndroid Build Coastguard Worker #include <cassert>
19*58b9f456SAndroid Build Coastguard Worker
20*58b9f456SAndroid Build Coastguard Worker const std::complex<double> testcases[] =
21*58b9f456SAndroid Build Coastguard Worker {
22*58b9f456SAndroid Build Coastguard Worker std::complex<double>( 1.e-6, 1.e-6),
23*58b9f456SAndroid Build Coastguard Worker std::complex<double>(-1.e-6, 1.e-6),
24*58b9f456SAndroid Build Coastguard Worker std::complex<double>(-1.e-6, -1.e-6),
25*58b9f456SAndroid Build Coastguard Worker std::complex<double>( 1.e-6, -1.e-6),
26*58b9f456SAndroid Build Coastguard Worker
27*58b9f456SAndroid Build Coastguard Worker std::complex<double>( 1.e+6, 1.e-6),
28*58b9f456SAndroid Build Coastguard Worker std::complex<double>(-1.e+6, 1.e-6),
29*58b9f456SAndroid Build Coastguard Worker std::complex<double>(-1.e+6, -1.e-6),
30*58b9f456SAndroid Build Coastguard Worker std::complex<double>( 1.e+6, -1.e-6),
31*58b9f456SAndroid Build Coastguard Worker
32*58b9f456SAndroid Build Coastguard Worker std::complex<double>( 1.e-6, 1.e+6),
33*58b9f456SAndroid Build Coastguard Worker std::complex<double>(-1.e-6, 1.e+6),
34*58b9f456SAndroid Build Coastguard Worker std::complex<double>(-1.e-6, -1.e+6),
35*58b9f456SAndroid Build Coastguard Worker std::complex<double>( 1.e-6, -1.e+6),
36*58b9f456SAndroid Build Coastguard Worker
37*58b9f456SAndroid Build Coastguard Worker std::complex<double>( 1.e+6, 1.e+6),
38*58b9f456SAndroid Build Coastguard Worker std::complex<double>(-1.e+6, 1.e+6),
39*58b9f456SAndroid Build Coastguard Worker std::complex<double>(-1.e+6, -1.e+6),
40*58b9f456SAndroid Build Coastguard Worker std::complex<double>( 1.e+6, -1.e+6),
41*58b9f456SAndroid Build Coastguard Worker
42*58b9f456SAndroid Build Coastguard Worker std::complex<double>(NAN, NAN),
43*58b9f456SAndroid Build Coastguard Worker std::complex<double>(-INFINITY, NAN),
44*58b9f456SAndroid Build Coastguard Worker std::complex<double>(-2, NAN),
45*58b9f456SAndroid Build Coastguard Worker std::complex<double>(-1, NAN),
46*58b9f456SAndroid Build Coastguard Worker std::complex<double>(-0.5, NAN),
47*58b9f456SAndroid Build Coastguard Worker std::complex<double>(-0., NAN),
48*58b9f456SAndroid Build Coastguard Worker std::complex<double>(+0., NAN),
49*58b9f456SAndroid Build Coastguard Worker std::complex<double>(0.5, NAN),
50*58b9f456SAndroid Build Coastguard Worker std::complex<double>(1, NAN),
51*58b9f456SAndroid Build Coastguard Worker std::complex<double>(2, NAN),
52*58b9f456SAndroid Build Coastguard Worker std::complex<double>(INFINITY, NAN),
53*58b9f456SAndroid Build Coastguard Worker
54*58b9f456SAndroid Build Coastguard Worker std::complex<double>(NAN, -INFINITY),
55*58b9f456SAndroid Build Coastguard Worker std::complex<double>(-INFINITY, -INFINITY),
56*58b9f456SAndroid Build Coastguard Worker std::complex<double>(-2, -INFINITY),
57*58b9f456SAndroid Build Coastguard Worker std::complex<double>(-1, -INFINITY),
58*58b9f456SAndroid Build Coastguard Worker std::complex<double>(-0.5, -INFINITY),
59*58b9f456SAndroid Build Coastguard Worker std::complex<double>(-0., -INFINITY),
60*58b9f456SAndroid Build Coastguard Worker std::complex<double>(+0., -INFINITY),
61*58b9f456SAndroid Build Coastguard Worker std::complex<double>(0.5, -INFINITY),
62*58b9f456SAndroid Build Coastguard Worker std::complex<double>(1, -INFINITY),
63*58b9f456SAndroid Build Coastguard Worker std::complex<double>(2, -INFINITY),
64*58b9f456SAndroid Build Coastguard Worker std::complex<double>(INFINITY, -INFINITY),
65*58b9f456SAndroid Build Coastguard Worker
66*58b9f456SAndroid Build Coastguard Worker std::complex<double>(NAN, -2),
67*58b9f456SAndroid Build Coastguard Worker std::complex<double>(-INFINITY, -2),
68*58b9f456SAndroid Build Coastguard Worker std::complex<double>(-2, -2),
69*58b9f456SAndroid Build Coastguard Worker std::complex<double>(-1, -2),
70*58b9f456SAndroid Build Coastguard Worker std::complex<double>(-0.5, -2),
71*58b9f456SAndroid Build Coastguard Worker std::complex<double>(-0., -2),
72*58b9f456SAndroid Build Coastguard Worker std::complex<double>(+0., -2),
73*58b9f456SAndroid Build Coastguard Worker std::complex<double>(0.5, -2),
74*58b9f456SAndroid Build Coastguard Worker std::complex<double>(1, -2),
75*58b9f456SAndroid Build Coastguard Worker std::complex<double>(2, -2),
76*58b9f456SAndroid Build Coastguard Worker std::complex<double>(INFINITY, -2),
77*58b9f456SAndroid Build Coastguard Worker
78*58b9f456SAndroid Build Coastguard Worker std::complex<double>(NAN, -1),
79*58b9f456SAndroid Build Coastguard Worker std::complex<double>(-INFINITY, -1),
80*58b9f456SAndroid Build Coastguard Worker std::complex<double>(-2, -1),
81*58b9f456SAndroid Build Coastguard Worker std::complex<double>(-1, -1),
82*58b9f456SAndroid Build Coastguard Worker std::complex<double>(-0.5, -1),
83*58b9f456SAndroid Build Coastguard Worker std::complex<double>(-0., -1),
84*58b9f456SAndroid Build Coastguard Worker std::complex<double>(+0., -1),
85*58b9f456SAndroid Build Coastguard Worker std::complex<double>(0.5, -1),
86*58b9f456SAndroid Build Coastguard Worker std::complex<double>(1, -1),
87*58b9f456SAndroid Build Coastguard Worker std::complex<double>(2, -1),
88*58b9f456SAndroid Build Coastguard Worker std::complex<double>(INFINITY, -1),
89*58b9f456SAndroid Build Coastguard Worker
90*58b9f456SAndroid Build Coastguard Worker std::complex<double>(NAN, -0.5),
91*58b9f456SAndroid Build Coastguard Worker std::complex<double>(-INFINITY, -0.5),
92*58b9f456SAndroid Build Coastguard Worker std::complex<double>(-2, -0.5),
93*58b9f456SAndroid Build Coastguard Worker std::complex<double>(-1, -0.5),
94*58b9f456SAndroid Build Coastguard Worker std::complex<double>(-0.5, -0.5),
95*58b9f456SAndroid Build Coastguard Worker std::complex<double>(-0., -0.5),
96*58b9f456SAndroid Build Coastguard Worker std::complex<double>(+0., -0.5),
97*58b9f456SAndroid Build Coastguard Worker std::complex<double>(0.5, -0.5),
98*58b9f456SAndroid Build Coastguard Worker std::complex<double>(1, -0.5),
99*58b9f456SAndroid Build Coastguard Worker std::complex<double>(2, -0.5),
100*58b9f456SAndroid Build Coastguard Worker std::complex<double>(INFINITY, -0.5),
101*58b9f456SAndroid Build Coastguard Worker
102*58b9f456SAndroid Build Coastguard Worker std::complex<double>(NAN, -0.),
103*58b9f456SAndroid Build Coastguard Worker std::complex<double>(-INFINITY, -0.),
104*58b9f456SAndroid Build Coastguard Worker std::complex<double>(-2, -0.),
105*58b9f456SAndroid Build Coastguard Worker std::complex<double>(-1, -0.),
106*58b9f456SAndroid Build Coastguard Worker std::complex<double>(-0.5, -0.),
107*58b9f456SAndroid Build Coastguard Worker std::complex<double>(-0., -0.),
108*58b9f456SAndroid Build Coastguard Worker std::complex<double>(+0., -0.),
109*58b9f456SAndroid Build Coastguard Worker std::complex<double>(0.5, -0.),
110*58b9f456SAndroid Build Coastguard Worker std::complex<double>(1, -0.),
111*58b9f456SAndroid Build Coastguard Worker std::complex<double>(2, -0.),
112*58b9f456SAndroid Build Coastguard Worker std::complex<double>(INFINITY, -0.),
113*58b9f456SAndroid Build Coastguard Worker
114*58b9f456SAndroid Build Coastguard Worker std::complex<double>(NAN, +0.),
115*58b9f456SAndroid Build Coastguard Worker std::complex<double>(-INFINITY, +0.),
116*58b9f456SAndroid Build Coastguard Worker std::complex<double>(-2, +0.),
117*58b9f456SAndroid Build Coastguard Worker std::complex<double>(-1, +0.),
118*58b9f456SAndroid Build Coastguard Worker std::complex<double>(-0.5, +0.),
119*58b9f456SAndroid Build Coastguard Worker std::complex<double>(-0., +0.),
120*58b9f456SAndroid Build Coastguard Worker std::complex<double>(+0., +0.),
121*58b9f456SAndroid Build Coastguard Worker std::complex<double>(0.5, +0.),
122*58b9f456SAndroid Build Coastguard Worker std::complex<double>(1, +0.),
123*58b9f456SAndroid Build Coastguard Worker std::complex<double>(2, +0.),
124*58b9f456SAndroid Build Coastguard Worker std::complex<double>(INFINITY, +0.),
125*58b9f456SAndroid Build Coastguard Worker
126*58b9f456SAndroid Build Coastguard Worker std::complex<double>(NAN, 0.5),
127*58b9f456SAndroid Build Coastguard Worker std::complex<double>(-INFINITY, 0.5),
128*58b9f456SAndroid Build Coastguard Worker std::complex<double>(-2, 0.5),
129*58b9f456SAndroid Build Coastguard Worker std::complex<double>(-1, 0.5),
130*58b9f456SAndroid Build Coastguard Worker std::complex<double>(-0.5, 0.5),
131*58b9f456SAndroid Build Coastguard Worker std::complex<double>(-0., 0.5),
132*58b9f456SAndroid Build Coastguard Worker std::complex<double>(+0., 0.5),
133*58b9f456SAndroid Build Coastguard Worker std::complex<double>(0.5, 0.5),
134*58b9f456SAndroid Build Coastguard Worker std::complex<double>(1, 0.5),
135*58b9f456SAndroid Build Coastguard Worker std::complex<double>(2, 0.5),
136*58b9f456SAndroid Build Coastguard Worker std::complex<double>(INFINITY, 0.5),
137*58b9f456SAndroid Build Coastguard Worker
138*58b9f456SAndroid Build Coastguard Worker std::complex<double>(NAN, 1),
139*58b9f456SAndroid Build Coastguard Worker std::complex<double>(-INFINITY, 1),
140*58b9f456SAndroid Build Coastguard Worker std::complex<double>(-2, 1),
141*58b9f456SAndroid Build Coastguard Worker std::complex<double>(-1, 1),
142*58b9f456SAndroid Build Coastguard Worker std::complex<double>(-0.5, 1),
143*58b9f456SAndroid Build Coastguard Worker std::complex<double>(-0., 1),
144*58b9f456SAndroid Build Coastguard Worker std::complex<double>(+0., 1),
145*58b9f456SAndroid Build Coastguard Worker std::complex<double>(0.5, 1),
146*58b9f456SAndroid Build Coastguard Worker std::complex<double>(1, 1),
147*58b9f456SAndroid Build Coastguard Worker std::complex<double>(2, 1),
148*58b9f456SAndroid Build Coastguard Worker std::complex<double>(INFINITY, 1),
149*58b9f456SAndroid Build Coastguard Worker
150*58b9f456SAndroid Build Coastguard Worker std::complex<double>(NAN, 2),
151*58b9f456SAndroid Build Coastguard Worker std::complex<double>(-INFINITY, 2),
152*58b9f456SAndroid Build Coastguard Worker std::complex<double>(-2, 2),
153*58b9f456SAndroid Build Coastguard Worker std::complex<double>(-1, 2),
154*58b9f456SAndroid Build Coastguard Worker std::complex<double>(-0.5, 2),
155*58b9f456SAndroid Build Coastguard Worker std::complex<double>(-0., 2),
156*58b9f456SAndroid Build Coastguard Worker std::complex<double>(+0., 2),
157*58b9f456SAndroid Build Coastguard Worker std::complex<double>(0.5, 2),
158*58b9f456SAndroid Build Coastguard Worker std::complex<double>(1, 2),
159*58b9f456SAndroid Build Coastguard Worker std::complex<double>(2, 2),
160*58b9f456SAndroid Build Coastguard Worker std::complex<double>(INFINITY, 2),
161*58b9f456SAndroid Build Coastguard Worker
162*58b9f456SAndroid Build Coastguard Worker std::complex<double>(NAN, INFINITY),
163*58b9f456SAndroid Build Coastguard Worker std::complex<double>(-INFINITY, INFINITY),
164*58b9f456SAndroid Build Coastguard Worker std::complex<double>(-2, INFINITY),
165*58b9f456SAndroid Build Coastguard Worker std::complex<double>(-1, INFINITY),
166*58b9f456SAndroid Build Coastguard Worker std::complex<double>(-0.5, INFINITY),
167*58b9f456SAndroid Build Coastguard Worker std::complex<double>(-0., INFINITY),
168*58b9f456SAndroid Build Coastguard Worker std::complex<double>(+0., INFINITY),
169*58b9f456SAndroid Build Coastguard Worker std::complex<double>(0.5, INFINITY),
170*58b9f456SAndroid Build Coastguard Worker std::complex<double>(1, INFINITY),
171*58b9f456SAndroid Build Coastguard Worker std::complex<double>(2, INFINITY),
172*58b9f456SAndroid Build Coastguard Worker std::complex<double>(INFINITY, INFINITY)
173*58b9f456SAndroid Build Coastguard Worker };
174*58b9f456SAndroid Build Coastguard Worker
175*58b9f456SAndroid Build Coastguard Worker enum {zero, non_zero, inf, NaN, non_zero_nan};
176*58b9f456SAndroid Build Coastguard Worker
177*58b9f456SAndroid Build Coastguard Worker template <class T>
178*58b9f456SAndroid Build Coastguard Worker int
classify(const std::complex<T> & x)179*58b9f456SAndroid Build Coastguard Worker classify(const std::complex<T>& x)
180*58b9f456SAndroid Build Coastguard Worker {
181*58b9f456SAndroid Build Coastguard Worker if (x == std::complex<T>())
182*58b9f456SAndroid Build Coastguard Worker return zero;
183*58b9f456SAndroid Build Coastguard Worker if (std::isinf(x.real()) || std::isinf(x.imag()))
184*58b9f456SAndroid Build Coastguard Worker return inf;
185*58b9f456SAndroid Build Coastguard Worker if (std::isnan(x.real()) && std::isnan(x.imag()))
186*58b9f456SAndroid Build Coastguard Worker return NaN;
187*58b9f456SAndroid Build Coastguard Worker if (std::isnan(x.real()))
188*58b9f456SAndroid Build Coastguard Worker {
189*58b9f456SAndroid Build Coastguard Worker if (x.imag() == T(0))
190*58b9f456SAndroid Build Coastguard Worker return NaN;
191*58b9f456SAndroid Build Coastguard Worker return non_zero_nan;
192*58b9f456SAndroid Build Coastguard Worker }
193*58b9f456SAndroid Build Coastguard Worker if (std::isnan(x.imag()))
194*58b9f456SAndroid Build Coastguard Worker {
195*58b9f456SAndroid Build Coastguard Worker if (x.real() == T(0))
196*58b9f456SAndroid Build Coastguard Worker return NaN;
197*58b9f456SAndroid Build Coastguard Worker return non_zero_nan;
198*58b9f456SAndroid Build Coastguard Worker }
199*58b9f456SAndroid Build Coastguard Worker return non_zero;
200*58b9f456SAndroid Build Coastguard Worker }
201*58b9f456SAndroid Build Coastguard Worker
202*58b9f456SAndroid Build Coastguard Worker inline
203*58b9f456SAndroid Build Coastguard Worker int
classify(double x)204*58b9f456SAndroid Build Coastguard Worker classify(double x)
205*58b9f456SAndroid Build Coastguard Worker {
206*58b9f456SAndroid Build Coastguard Worker if (x == 0)
207*58b9f456SAndroid Build Coastguard Worker return zero;
208*58b9f456SAndroid Build Coastguard Worker if (std::isinf(x))
209*58b9f456SAndroid Build Coastguard Worker return inf;
210*58b9f456SAndroid Build Coastguard Worker if (std::isnan(x))
211*58b9f456SAndroid Build Coastguard Worker return NaN;
212*58b9f456SAndroid Build Coastguard Worker return non_zero;
213*58b9f456SAndroid Build Coastguard Worker }
214*58b9f456SAndroid Build Coastguard Worker
is_about(float x,float y)215*58b9f456SAndroid Build Coastguard Worker void is_about(float x, float y)
216*58b9f456SAndroid Build Coastguard Worker {
217*58b9f456SAndroid Build Coastguard Worker assert(std::abs((x-y)/(x+y)) < 1.e-6);
218*58b9f456SAndroid Build Coastguard Worker }
219*58b9f456SAndroid Build Coastguard Worker
is_about(double x,double y)220*58b9f456SAndroid Build Coastguard Worker void is_about(double x, double y)
221*58b9f456SAndroid Build Coastguard Worker {
222*58b9f456SAndroid Build Coastguard Worker assert(std::abs((x-y)/(x+y)) < 1.e-14);
223*58b9f456SAndroid Build Coastguard Worker }
224*58b9f456SAndroid Build Coastguard Worker
is_about(long double x,long double y)225*58b9f456SAndroid Build Coastguard Worker void is_about(long double x, long double y)
226*58b9f456SAndroid Build Coastguard Worker {
227*58b9f456SAndroid Build Coastguard Worker assert(std::abs((x-y)/(x+y)) < 1.e-14);
228*58b9f456SAndroid Build Coastguard Worker }
229*58b9f456SAndroid Build Coastguard Worker
230*58b9f456SAndroid Build Coastguard Worker #endif // CASES_H
231