xref: /llvm-project/libcxx/test/std/numerics/complex.number/cases.h (revision 7223bcf04c4ce3c1585df9408c6a6663cc8364ea)
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 <cassert>
17 #include <complex>
18 #include <type_traits>
19 
20 #include "test_macros.h"
21 
22 TEST_CONSTEXPR_CXX20 const std::complex<double> testcases[] =
23 {
24     std::complex<double>( 1.e-6,  1.e-6),
25     std::complex<double>(-1.e-6,  1.e-6),
26     std::complex<double>(-1.e-6, -1.e-6),
27     std::complex<double>( 1.e-6, -1.e-6),
28 
29     std::complex<double>( 1.e+6,  1.e-6),
30     std::complex<double>(-1.e+6,  1.e-6),
31     std::complex<double>(-1.e+6, -1.e-6),
32     std::complex<double>( 1.e+6, -1.e-6),
33 
34     std::complex<double>( 1.e-6,  1.e+6),
35     std::complex<double>(-1.e-6,  1.e+6),
36     std::complex<double>(-1.e-6, -1.e+6),
37     std::complex<double>( 1.e-6, -1.e+6),
38 
39     std::complex<double>( 1.e+6,  1.e+6),
40     std::complex<double>(-1.e+6,  1.e+6),
41     std::complex<double>(-1.e+6, -1.e+6),
42     std::complex<double>( 1.e+6, -1.e+6),
43 
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     std::complex<double>( 0,  1.e-6),
50     std::complex<double>( 0,  1.e+6),
51     std::complex<double>( 0, -1.e+6),
52 
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     std::complex<double>( 1.e-6,  0),
59     std::complex<double>( 1.e+6,  0),
60     std::complex<double>(-1.e+6,  0),
61 
62     std::complex<double>(std::numeric_limits<double>::quiet_NaN(), std::numeric_limits<double>::quiet_NaN()),
63     std::complex<double>(-std::numeric_limits<double>::infinity(), std::numeric_limits<double>::quiet_NaN()),
64     std::complex<double>(-2, std::numeric_limits<double>::quiet_NaN()),
65     std::complex<double>(-1, std::numeric_limits<double>::quiet_NaN()),
66     std::complex<double>(-0.5, std::numeric_limits<double>::quiet_NaN()),
67     std::complex<double>(-0., std::numeric_limits<double>::quiet_NaN()),
68     std::complex<double>(+0., std::numeric_limits<double>::quiet_NaN()),
69     std::complex<double>(0.5, std::numeric_limits<double>::quiet_NaN()),
70     std::complex<double>(1, std::numeric_limits<double>::quiet_NaN()),
71     std::complex<double>(2, std::numeric_limits<double>::quiet_NaN()),
72     std::complex<double>(std::numeric_limits<double>::infinity(), std::numeric_limits<double>::quiet_NaN()),
73 
74     std::complex<double>(std::numeric_limits<double>::quiet_NaN(), -std::numeric_limits<double>::infinity()),
75     std::complex<double>(-std::numeric_limits<double>::infinity(), -std::numeric_limits<double>::infinity()),
76     std::complex<double>(-2, -std::numeric_limits<double>::infinity()),
77     std::complex<double>(-1, -std::numeric_limits<double>::infinity()),
78     std::complex<double>(-0.5, -std::numeric_limits<double>::infinity()),
79     std::complex<double>(-0., -std::numeric_limits<double>::infinity()),
80     std::complex<double>(+0., -std::numeric_limits<double>::infinity()),
81     std::complex<double>(0.5, -std::numeric_limits<double>::infinity()),
82     std::complex<double>(1, -std::numeric_limits<double>::infinity()),
83     std::complex<double>(2, -std::numeric_limits<double>::infinity()),
84     std::complex<double>(std::numeric_limits<double>::infinity(), -std::numeric_limits<double>::infinity()),
85 
86     std::complex<double>(std::numeric_limits<double>::quiet_NaN(), -2),
87     std::complex<double>(-std::numeric_limits<double>::infinity(), -2),
88     std::complex<double>(-2, -2),
89     std::complex<double>(-1, -2),
90     std::complex<double>(-0.5, -2),
91     std::complex<double>(-0., -2),
92     std::complex<double>(+0., -2),
93     std::complex<double>(0.5, -2),
94     std::complex<double>(1, -2),
95     std::complex<double>(2, -2),
96     std::complex<double>(std::numeric_limits<double>::infinity(), -2),
97 
98     std::complex<double>(std::numeric_limits<double>::quiet_NaN(), -1),
99     std::complex<double>(-std::numeric_limits<double>::infinity(), -1),
100     std::complex<double>(-2, -1),
101     std::complex<double>(-1, -1),
102     std::complex<double>(-0.5, -1),
103     std::complex<double>(-0., -1),
104     std::complex<double>(+0., -1),
105     std::complex<double>(0.5, -1),
106     std::complex<double>(1, -1),
107     std::complex<double>(2, -1),
108     std::complex<double>(std::numeric_limits<double>::infinity(), -1),
109 
110     std::complex<double>(std::numeric_limits<double>::quiet_NaN(), -0.5),
111     std::complex<double>(-std::numeric_limits<double>::infinity(), -0.5),
112     std::complex<double>(-2, -0.5),
113     std::complex<double>(-1, -0.5),
114     std::complex<double>(-0.5, -0.5),
115     std::complex<double>(-0., -0.5),
116     std::complex<double>(+0., -0.5),
117     std::complex<double>(0.5, -0.5),
118     std::complex<double>(1, -0.5),
119     std::complex<double>(2, -0.5),
120     std::complex<double>(std::numeric_limits<double>::infinity(), -0.5),
121 
122     std::complex<double>(std::numeric_limits<double>::quiet_NaN(), -0.),
123     std::complex<double>(-std::numeric_limits<double>::infinity(), -0.),
124     std::complex<double>(-2, -0.),
125     std::complex<double>(-1, -0.),
126     std::complex<double>(-0.5, -0.),
127     std::complex<double>(-0., -0.),
128     std::complex<double>(+0., -0.),
129     std::complex<double>(0.5, -0.),
130     std::complex<double>(1, -0.),
131     std::complex<double>(2, -0.),
132     std::complex<double>(std::numeric_limits<double>::infinity(), -0.),
133 
134     std::complex<double>(std::numeric_limits<double>::quiet_NaN(), +0.),
135     std::complex<double>(-std::numeric_limits<double>::infinity(), +0.),
136     std::complex<double>(-2, +0.),
137     std::complex<double>(-1, +0.),
138     std::complex<double>(-0.5, +0.),
139     std::complex<double>(-0., +0.),
140     std::complex<double>(+0., +0.),
141     std::complex<double>(0.5, +0.),
142     std::complex<double>(1, +0.),
143     std::complex<double>(2, +0.),
144     std::complex<double>(std::numeric_limits<double>::infinity(), +0.),
145 
146     std::complex<double>(std::numeric_limits<double>::quiet_NaN(), 0.5),
147     std::complex<double>(-std::numeric_limits<double>::infinity(), 0.5),
148     std::complex<double>(-2, 0.5),
149     std::complex<double>(-1, 0.5),
150     std::complex<double>(-0.5, 0.5),
151     std::complex<double>(-0., 0.5),
152     std::complex<double>(+0., 0.5),
153     std::complex<double>(0.5, 0.5),
154     std::complex<double>(1, 0.5),
155     std::complex<double>(2, 0.5),
156     std::complex<double>(std::numeric_limits<double>::infinity(), 0.5),
157 
158     std::complex<double>(std::numeric_limits<double>::quiet_NaN(), 1),
159     std::complex<double>(-std::numeric_limits<double>::infinity(), 1),
160     std::complex<double>(-2, 1),
161     std::complex<double>(-1, 1),
162     std::complex<double>(-0.5, 1),
163     std::complex<double>(-0., 1),
164     std::complex<double>(+0., 1),
165     std::complex<double>(0.5, 1),
166     std::complex<double>(1, 1),
167     std::complex<double>(2, 1),
168     std::complex<double>(std::numeric_limits<double>::infinity(), 1),
169 
170     std::complex<double>(std::numeric_limits<double>::quiet_NaN(), 2),
171     std::complex<double>(-std::numeric_limits<double>::infinity(), 2),
172     std::complex<double>(-2, 2),
173     std::complex<double>(-1, 2),
174     std::complex<double>(-0.5, 2),
175     std::complex<double>(-0., 2),
176     std::complex<double>(+0., 2),
177     std::complex<double>(0.5, 2),
178     std::complex<double>(1, 2),
179     std::complex<double>(2, 2),
180     std::complex<double>(std::numeric_limits<double>::infinity(), 2),
181 
182     std::complex<double>(std::numeric_limits<double>::quiet_NaN(), std::numeric_limits<double>::infinity()),
183     std::complex<double>(-std::numeric_limits<double>::infinity(), std::numeric_limits<double>::infinity()),
184     std::complex<double>(-2, std::numeric_limits<double>::infinity()),
185     std::complex<double>(-1, std::numeric_limits<double>::infinity()),
186     std::complex<double>(-0.5, std::numeric_limits<double>::infinity()),
187     std::complex<double>(-0., std::numeric_limits<double>::infinity()),
188     std::complex<double>(+0., std::numeric_limits<double>::infinity()),
189     std::complex<double>(0.5, std::numeric_limits<double>::infinity()),
190     std::complex<double>(1, std::numeric_limits<double>::infinity()),
191     std::complex<double>(2, std::numeric_limits<double>::infinity()),
192     std::complex<double>(std::numeric_limits<double>::infinity(), std::numeric_limits<double>::infinity())
193 };
194 
195 enum {zero, non_zero, inf, NaN, non_zero_nan};
196 
197 template <class T, typename std::enable_if<std::is_floating_point<T>::value, int>::type = 0>
test_isinf(T v)198 TEST_CONSTEXPR_CXX20 bool test_isinf(T v) {
199     return v == std::numeric_limits<T>::infinity() || v == -std::numeric_limits<T>::infinity();
200 }
201 
202 template <class T, typename std::enable_if<std::is_arithmetic<T>::value, int>::type = 0>
test_isnan(T v)203 TEST_CONSTEXPR_CXX20 bool test_isnan(T v) {
204     return v != v;
205 }
206 
207 template <class T>
208 TEST_CONSTEXPR_CXX20
209 int
classify(const std::complex<T> & x)210 classify(const std::complex<T>& x)
211 {
212     if (x == std::complex<T>())
213         return zero;
214     if (test_isinf(x.real()) || test_isinf(x.imag()))
215         return inf;
216     if (test_isnan(x.real()) && test_isnan(x.imag()))
217         return NaN;
218     if (test_isnan(x.real()))
219     {
220         if (x.imag() == T(0))
221             return NaN;
222         return non_zero_nan;
223     }
224     if (test_isnan(x.imag()))
225     {
226         if (x.real() == T(0))
227             return NaN;
228         return non_zero_nan;
229     }
230     return non_zero;
231 }
232 
233 inline
234 int
classify(double x)235 classify(double x)
236 {
237     if (x == 0)
238         return zero;
239     if (std::isinf(x))
240         return inf;
241     if (std::isnan(x))
242         return NaN;
243     return non_zero;
244 }
245 
is_about(float x,float y)246 void is_about(float x, float y)
247 {
248     assert(std::abs((x-y)/(x+y)) < 1.e-6);
249 }
250 
is_about(double x,double y)251 void is_about(double x, double y)
252 {
253     assert(std::abs((x-y)/(x+y)) < 1.e-14);
254 }
255 
is_about(long double x,long double y)256 void is_about(long double x, long double y)
257 {
258     assert(std::abs((x-y)/(x+y)) < 1.e-14);
259 }
260 
261 #endif // CASES_H
262