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