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