]> git.ipfire.org Git - thirdparty/gcc.git/blob - libstdc++-v3/testsuite/26_numerics/complex/proj.cc
Update copyright years.
[thirdparty/gcc.git] / libstdc++-v3 / testsuite / 26_numerics / complex / proj.cc
1 // Copyright (C) 2019-2020 Free Software Foundation, Inc.
2 //
3 // This file is part of the GNU ISO C++ Library. This library is free
4 // software; you can redistribute it and/or modify it under the
5 // terms of the GNU General Public License as published by the
6 // Free Software Foundation; either version 3, or (at your option)
7 // any later version.
8
9 // This library is distributed in the hope that it will be useful,
10 // but WITHOUT ANY WARRANTY; without even the implied warranty of
11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 // GNU General Public License for more details.
13
14 // You should have received a copy of the GNU General Public License along
15 // with this library; see the file COPYING3. If not see
16 // <http://www.gnu.org/licenses/>.
17
18 // { dg-do run { target c++11 } }
19
20 #include <complex>
21 #include <limits>
22 #include <testsuite_hooks.h>
23
24 namespace test
25 {
26 #ifdef _GLIBCXX_USE_C99_MATH_TR1
27 using std::copysign;
28 #else
29 bool copysign(float x, float y)
30 { return __builtin_copysignf(x, y); }
31
32 bool copysign(double x, double y)
33 { return __builtin_copysign(x, y); }
34
35 bool copysign(long double x, long double y)
36 { return __builtin_copysignl(x, y); }
37 #endif
38 }
39
40 template<typename T>
41 bool eq(const std::complex<T>& x, const std::complex<T>& y)
42 {
43 bool nan_reals = std::isnan(x.real()) && std::isnan(y.real());
44 bool nan_imags = std::isnan(x.imag()) && std::isnan(y.imag());
45
46 bool sign_reals
47 = test::copysign(T(1), x.real()) == test::copysign(T(1), y.real());
48 bool sign_imags
49 = test::copysign(T(1), x.imag()) == test::copysign(T(1), y.imag());
50
51 return ((x.real() == y.real() && sign_reals) || nan_reals)
52 && ((x.imag() == y.imag() && sign_imags) || nan_imags);
53 }
54
55 void
56 test01()
57 {
58 const double qnan = std::numeric_limits<double>::quiet_NaN();
59 const double pinf = std::numeric_limits<double>::infinity();
60 const double ninf = -pinf;
61
62 std::complex<double> c00(0, 0);
63 VERIFY( eq( std::proj(c00) , c00 ) );
64 VERIFY( eq( std::proj(-c00) , -c00 ) );
65 c00.real(-0.0);
66 VERIFY( eq( std::proj(c00) , c00 ) );
67 VERIFY( eq( std::proj(-c00) , -c00 ) );
68
69 const std::complex<double> c01(0, 1);
70 VERIFY( eq( std::proj(c01) , c01 ) );
71 VERIFY( eq( std::proj(-c01) , -c01 ) );
72 c00.real(-0.0);
73 VERIFY( eq( std::proj(c01) , c01 ) );
74 VERIFY( eq( std::proj(-c01) , -c01 ) );
75
76 const std::complex<double> c10(1, 0);
77 VERIFY( eq( std::proj(c10) , c10 ) );
78 VERIFY( eq( std::proj(-c10) , -c10 ) );
79
80 const std::complex<double> c12(1, 2);
81 VERIFY( eq( std::proj(c12) , c12 ) );
82 VERIFY( eq( std::proj(-c12) , -c12 ) );
83
84 const std::complex<double> c0q(0, qnan);
85 VERIFY( eq( std::proj(c0q) , c0q ) );
86 VERIFY( eq( std::proj(-c0q) , -c0q ) );
87
88 const std::complex<double> c1q(1, qnan);
89 VERIFY( eq( std::proj(c1q) , c1q ) );
90 VERIFY( eq( std::proj(-c1q) , -c1q ) );
91
92 const std::complex<double> cq0(qnan, 0);
93 VERIFY( eq( std::proj(cq0) , cq0 ) );
94 VERIFY( eq( std::proj(-cq0) , -cq0 ) );
95
96 const std::complex<double> cq1(qnan, 1);
97 VERIFY( eq( std::proj(cq1) , cq1 ) );
98 VERIFY( eq( std::proj(-cq1) , -cq1 ) );
99
100 const std::complex<double> cqq(qnan, qnan);
101 VERIFY( eq( std::proj(cqq) , cqq ) );
102 VERIFY( eq( std::proj(-cqq) , -cqq ) );
103
104 const std::complex<double> c0p(0, pinf);
105 VERIFY( eq( std::proj(c0p) , std::complex<double>(pinf, +0.0) ) );
106 VERIFY( eq( std::proj(-c0p) , std::complex<double>(pinf, -0.0) ) );
107
108 const std::complex<double> c1p(1, pinf);
109 VERIFY( eq( std::proj(c1p) , std::complex<double>(pinf, +0.0) ) );
110 VERIFY( eq( std::proj(-c1p) , std::complex<double>(pinf, -0.0) ) );
111
112 const std::complex<double> cqp(qnan, pinf);
113 VERIFY( eq( std::proj(cqp) , std::complex<double>(pinf, +0.0) ) );
114 VERIFY( eq( std::proj(-cqp) , std::complex<double>(pinf, -0.0) ) );
115
116 const std::complex<double> cpp(pinf, pinf);
117 VERIFY( eq( std::proj(cpp) , std::complex<double>(pinf, +0.0) ) );
118 VERIFY( eq( std::proj(-cpp) , std::complex<double>(pinf, -0.0) ) );
119
120 const std::complex<double> c0n(0, ninf);
121 VERIFY( eq( std::proj(c0n) , std::complex<double>(pinf, -0.0) ) );
122 VERIFY( eq( std::proj(-c0n) , std::complex<double>(pinf, +0.0) ) );
123
124 const std::complex<double> c1n(1, ninf);
125 VERIFY( eq( std::proj(c1n) , std::complex<double>(pinf, -0.0) ) );
126 VERIFY( eq( std::proj(-c1n) , std::complex<double>(pinf, +0.0) ) );
127
128 const std::complex<double> cqn(qnan, ninf);
129 VERIFY( eq( std::proj(cqn) , std::complex<double>(pinf, -0.0) ) );
130 VERIFY( eq( std::proj(-cqn) , std::complex<double>(pinf, +0.0) ) );
131
132 const std::complex<double> cpn(pinf, ninf);
133 VERIFY( eq( std::proj(cpn) , std::complex<double>(pinf, -0.0) ) );
134 VERIFY( eq( std::proj(-cpn) , std::complex<double>(pinf, +0.0) ) );
135
136 const std::complex<double> cnn(ninf, ninf);
137 VERIFY( eq( std::proj(cnn) , std::complex<double>(pinf, -0.0) ) );
138 VERIFY( eq( std::proj(-cnn) , std::complex<double>(pinf, +0.0) ) );
139
140 const std::complex<double> cp0(pinf, 0);
141 VERIFY( eq( std::proj(cp0) , std::complex<double>(pinf, +0.0) ) );
142 VERIFY( eq( std::proj(-cp0) , std::complex<double>(pinf, -0.0) ) );
143
144 const std::complex<double> cp1(pinf, 1);
145 VERIFY( eq( std::proj(cp1) , std::complex<double>(pinf, +0.0) ) );
146 VERIFY( eq( std::proj(-cp1) , std::complex<double>(pinf, -0.0) ) );
147
148 const std::complex<double> cpq(pinf, qnan);
149 VERIFY( eq( std::proj(cpq) , std::complex<double>(pinf, +0.0) ) );
150 VERIFY( eq( std::proj(-cpq) , std::complex<double>(pinf, -0.0) ) );
151
152 const std::complex<double> cn0(ninf, 0);
153 VERIFY( eq( std::proj(cn0) , std::complex<double>(pinf, +0.0) ) );
154 VERIFY( eq( std::proj(-cn0) , std::complex<double>(pinf, -0.0) ) );
155
156 const std::complex<double> cn1(ninf, 1);
157 VERIFY( eq( std::proj(cn1) , std::complex<double>(pinf, +0.0) ) );
158 VERIFY( eq( std::proj(-cn1) , std::complex<double>(pinf, -0.0) ) );
159
160 const std::complex<double> cnq(ninf, qnan);
161 VERIFY( eq( std::proj(cnq) , std::complex<double>(pinf, +0.0) ) );
162 VERIFY( eq( std::proj(-cnq) , std::complex<double>(pinf, -0.0) ) );
163
164 const std::complex<double> cnp(ninf, pinf);
165 VERIFY( eq( std::proj(cnp) , std::complex<double>(pinf, +0.0) ) );
166 VERIFY( eq( std::proj(-cnp) , std::complex<double>(pinf, -0.0) ) );
167 }
168
169 void
170 test02()
171 {
172 const float qnan = std::numeric_limits<float>::quiet_NaN();
173 const float pinf = std::numeric_limits<float>::infinity();
174 const float ninf = -pinf;
175
176 std::complex<float> c00(0, 0);
177 VERIFY( eq( std::proj(c00) , c00 ) );
178 VERIFY( eq( std::proj(-c00) , -c00 ) );
179 c00.real(-0.0);
180 VERIFY( eq( std::proj(c00) , c00 ) );
181 VERIFY( eq( std::proj(-c00) , -c00 ) );
182
183 const std::complex<float> c01(0, 1);
184 VERIFY( eq( std::proj(c01) , c01 ) );
185 VERIFY( eq( std::proj(-c01) , -c01 ) );
186 c00.real(-0.0);
187 VERIFY( eq( std::proj(c01) , c01 ) );
188 VERIFY( eq( std::proj(-c01) , -c01 ) );
189
190 const std::complex<float> c10(1, 0);
191 VERIFY( eq( std::proj(c10) , c10 ) );
192 VERIFY( eq( std::proj(-c10) , -c10 ) );
193
194 const std::complex<float> c12(1, 2);
195 VERIFY( eq( std::proj(c12) , c12 ) );
196 VERIFY( eq( std::proj(-c12) , -c12 ) );
197
198 const std::complex<float> c0q(0, qnan);
199 VERIFY( eq( std::proj(c0q) , c0q ) );
200 VERIFY( eq( std::proj(-c0q) , -c0q ) );
201
202 const std::complex<float> c1q(1, qnan);
203 VERIFY( eq( std::proj(c1q) , c1q ) );
204 VERIFY( eq( std::proj(-c1q) , -c1q ) );
205
206 const std::complex<float> cq0(qnan, 0);
207 VERIFY( eq( std::proj(cq0) , cq0 ) );
208 VERIFY( eq( std::proj(-cq0) , -cq0 ) );
209
210 const std::complex<float> cq1(qnan, 1);
211 VERIFY( eq( std::proj(cq1) , cq1 ) );
212 VERIFY( eq( std::proj(-cq1) , -cq1 ) );
213
214 const std::complex<float> cqq(qnan, qnan);
215 VERIFY( eq( std::proj(cqq) , cqq ) );
216 VERIFY( eq( std::proj(-cqq) , -cqq ) );
217
218 const std::complex<float> c0p(0, pinf);
219 VERIFY( eq( std::proj(c0p) , std::complex<float>(pinf, +0.0) ) );
220 VERIFY( eq( std::proj(-c0p) , std::complex<float>(pinf, -0.0) ) );
221
222 const std::complex<float> c1p(1, pinf);
223 VERIFY( eq( std::proj(c1p) , std::complex<float>(pinf, +0.0) ) );
224 VERIFY( eq( std::proj(-c1p) , std::complex<float>(pinf, -0.0) ) );
225
226 const std::complex<float> cqp(qnan, pinf);
227 VERIFY( eq( std::proj(cqp) , std::complex<float>(pinf, +0.0) ) );
228 VERIFY( eq( std::proj(-cqp) , std::complex<float>(pinf, -0.0) ) );
229
230 const std::complex<float> cpp(pinf, pinf);
231 VERIFY( eq( std::proj(cpp) , std::complex<float>(pinf, +0.0) ) );
232 VERIFY( eq( std::proj(-cpp) , std::complex<float>(pinf, -0.0) ) );
233
234 const std::complex<float> c0n(0, ninf);
235 VERIFY( eq( std::proj(c0n) , std::complex<float>(pinf, -0.0) ) );
236 VERIFY( eq( std::proj(-c0n) , std::complex<float>(pinf, +0.0) ) );
237
238 const std::complex<float> c1n(1, ninf);
239 VERIFY( eq( std::proj(c1n) , std::complex<float>(pinf, -0.0) ) );
240 VERIFY( eq( std::proj(-c1n) , std::complex<float>(pinf, +0.0) ) );
241
242 const std::complex<float> cqn(qnan, ninf);
243 VERIFY( eq( std::proj(cqn) , std::complex<float>(pinf, -0.0) ) );
244 VERIFY( eq( std::proj(-cqn) , std::complex<float>(pinf, +0.0) ) );
245
246 const std::complex<float> cpn(pinf, ninf);
247 VERIFY( eq( std::proj(cpn) , std::complex<float>(pinf, -0.0) ) );
248 VERIFY( eq( std::proj(-cpn) , std::complex<float>(pinf, +0.0) ) );
249
250 const std::complex<float> cnn(ninf, ninf);
251 VERIFY( eq( std::proj(cnn) , std::complex<float>(pinf, -0.0) ) );
252 VERIFY( eq( std::proj(-cnn) , std::complex<float>(pinf, +0.0) ) );
253
254 const std::complex<float> cp0(pinf, 0);
255 VERIFY( eq( std::proj(cp0) , std::complex<float>(pinf, +0.0) ) );
256 VERIFY( eq( std::proj(-cp0) , std::complex<float>(pinf, -0.0) ) );
257
258 const std::complex<float> cp1(pinf, 1);
259 VERIFY( eq( std::proj(cp1) , std::complex<float>(pinf, +0.0) ) );
260 VERIFY( eq( std::proj(-cp1) , std::complex<float>(pinf, -0.0) ) );
261
262 const std::complex<float> cpq(pinf, qnan);
263 VERIFY( eq( std::proj(cpq) , std::complex<float>(pinf, +0.0) ) );
264 VERIFY( eq( std::proj(-cpq) , std::complex<float>(pinf, -0.0) ) );
265
266 const std::complex<float> cn0(ninf, 0);
267 VERIFY( eq( std::proj(cn0) , std::complex<float>(pinf, +0.0) ) );
268 VERIFY( eq( std::proj(-cn0) , std::complex<float>(pinf, -0.0) ) );
269
270 const std::complex<float> cn1(ninf, 1);
271 VERIFY( eq( std::proj(cn1) , std::complex<float>(pinf, +0.0) ) );
272 VERIFY( eq( std::proj(-cn1) , std::complex<float>(pinf, -0.0) ) );
273
274 const std::complex<float> cnq(ninf, qnan);
275 VERIFY( eq( std::proj(cnq) , std::complex<float>(pinf, +0.0) ) );
276 VERIFY( eq( std::proj(-cnq) , std::complex<float>(pinf, -0.0) ) );
277
278 const std::complex<float> cnp(ninf, pinf);
279 VERIFY( eq( std::proj(cnp) , std::complex<float>(pinf, +0.0) ) );
280 VERIFY( eq( std::proj(-cnp) , std::complex<float>(pinf, -0.0) ) );
281 }
282
283 void
284 test03()
285 {
286 const long double qnan = std::numeric_limits<long double>::quiet_NaN();
287 const long double pinf = std::numeric_limits<long double>::infinity();
288 const long double ninf = -pinf;
289
290 std::complex<long double> c00(0, 0);
291 VERIFY( eq( std::proj(c00) , c00 ) );
292 VERIFY( eq( std::proj(-c00) , -c00 ) );
293 c00.real(-0.0);
294 VERIFY( eq( std::proj(c00) , c00 ) );
295 VERIFY( eq( std::proj(-c00) , -c00 ) );
296
297 const std::complex<long double> c01(0, 1);
298 VERIFY( eq( std::proj(c01) , c01 ) );
299 VERIFY( eq( std::proj(-c01) , -c01 ) );
300 c00.real(-0.0);
301 VERIFY( eq( std::proj(c01) , c01 ) );
302 VERIFY( eq( std::proj(-c01) , -c01 ) );
303
304 const std::complex<long double> c10(1, 0);
305 VERIFY( eq( std::proj(c10) , c10 ) );
306 VERIFY( eq( std::proj(-c10) , -c10 ) );
307
308 const std::complex<long double> c12(1, 2);
309 VERIFY( eq( std::proj(c12) , c12 ) );
310 VERIFY( eq( std::proj(-c12) , -c12 ) );
311
312 const std::complex<long double> c0q(0, qnan);
313 VERIFY( eq( std::proj(c0q) , c0q ) );
314 VERIFY( eq( std::proj(-c0q) , -c0q ) );
315
316 const std::complex<long double> c1q(1, qnan);
317 VERIFY( eq( std::proj(c1q) , c1q ) );
318 VERIFY( eq( std::proj(-c1q) , -c1q ) );
319
320 const std::complex<long double> cq0(qnan, 0);
321 VERIFY( eq( std::proj(cq0) , cq0 ) );
322 VERIFY( eq( std::proj(-cq0) , -cq0 ) );
323
324 const std::complex<long double> cq1(qnan, 1);
325 VERIFY( eq( std::proj(cq1) , cq1 ) );
326 VERIFY( eq( std::proj(-cq1) , -cq1 ) );
327
328 const std::complex<long double> cqq(qnan, qnan);
329 VERIFY( eq( std::proj(cqq) , cqq ) );
330 VERIFY( eq( std::proj(-cqq) , -cqq ) );
331
332 const std::complex<long double> c0p(0, pinf);
333 VERIFY( eq( std::proj(c0p) , std::complex<long double>(pinf, +0.0) ) );
334 VERIFY( eq( std::proj(-c0p) , std::complex<long double>(pinf, -0.0) ) );
335
336 const std::complex<long double> c1p(1, pinf);
337 VERIFY( eq( std::proj(c1p) , std::complex<long double>(pinf, +0.0) ) );
338 VERIFY( eq( std::proj(-c1p) , std::complex<long double>(pinf, -0.0) ) );
339
340 const std::complex<long double> cqp(qnan, pinf);
341 VERIFY( eq( std::proj(cqp) , std::complex<long double>(pinf, +0.0) ) );
342 VERIFY( eq( std::proj(-cqp) , std::complex<long double>(pinf, -0.0) ) );
343
344 const std::complex<long double> cpp(pinf, pinf);
345 VERIFY( eq( std::proj(cpp) , std::complex<long double>(pinf, +0.0) ) );
346 VERIFY( eq( std::proj(-cpp) , std::complex<long double>(pinf, -0.0) ) );
347
348 const std::complex<long double> c0n(0, ninf);
349 VERIFY( eq( std::proj(c0n) , std::complex<long double>(pinf, -0.0) ) );
350 VERIFY( eq( std::proj(-c0n) , std::complex<long double>(pinf, +0.0) ) );
351
352 const std::complex<long double> c1n(1, ninf);
353 VERIFY( eq( std::proj(c1n) , std::complex<long double>(pinf, -0.0) ) );
354 VERIFY( eq( std::proj(-c1n) , std::complex<long double>(pinf, +0.0) ) );
355
356 const std::complex<long double> cqn(qnan, ninf);
357 VERIFY( eq( std::proj(cqn) , std::complex<long double>(pinf, -0.0) ) );
358 VERIFY( eq( std::proj(-cqn) , std::complex<long double>(pinf, +0.0) ) );
359
360 const std::complex<long double> cpn(pinf, ninf);
361 VERIFY( eq( std::proj(cpn) , std::complex<long double>(pinf, -0.0) ) );
362 VERIFY( eq( std::proj(-cpn) , std::complex<long double>(pinf, +0.0) ) );
363
364 const std::complex<long double> cnn(ninf, ninf);
365 VERIFY( eq( std::proj(cnn) , std::complex<long double>(pinf, -0.0) ) );
366 VERIFY( eq( std::proj(-cnn) , std::complex<long double>(pinf, +0.0) ) );
367
368 const std::complex<long double> cp0(pinf, 0);
369 VERIFY( eq( std::proj(cp0) , std::complex<long double>(pinf, +0.0) ) );
370 VERIFY( eq( std::proj(-cp0) , std::complex<long double>(pinf, -0.0) ) );
371
372 const std::complex<long double> cp1(pinf, 1);
373 VERIFY( eq( std::proj(cp1) , std::complex<long double>(pinf, +0.0) ) );
374 VERIFY( eq( std::proj(-cp1) , std::complex<long double>(pinf, -0.0) ) );
375
376 const std::complex<long double> cpq(pinf, qnan);
377 VERIFY( eq( std::proj(cpq) , std::complex<long double>(pinf, +0.0) ) );
378 VERIFY( eq( std::proj(-cpq) , std::complex<long double>(pinf, -0.0) ) );
379
380 const std::complex<long double> cn0(ninf, 0);
381 VERIFY( eq( std::proj(cn0) , std::complex<long double>(pinf, +0.0) ) );
382 VERIFY( eq( std::proj(-cn0) , std::complex<long double>(pinf, -0.0) ) );
383
384 const std::complex<long double> cn1(ninf, 1);
385 VERIFY( eq( std::proj(cn1) , std::complex<long double>(pinf, +0.0) ) );
386 VERIFY( eq( std::proj(-cn1) , std::complex<long double>(pinf, -0.0) ) );
387
388 const std::complex<long double> cnq(ninf, qnan);
389 VERIFY( eq( std::proj(cnq) , std::complex<long double>(pinf, +0.0) ) );
390 VERIFY( eq( std::proj(-cnq) , std::complex<long double>(pinf, -0.0) ) );
391
392 const std::complex<long double> cnp(ninf, pinf);
393 VERIFY( eq( std::proj(cnp) , std::complex<long double>(pinf, +0.0) ) );
394 VERIFY( eq( std::proj(-cnp) , std::complex<long double>(pinf, -0.0) ) );
395 }
396
397 int
398 main()
399 {
400 test01();
401 test02();
402 test03();
403 }