]>
git.ipfire.org Git - thirdparty/gcc.git/blob - libstdc++-v3/testsuite/26_numerics/complex/proj.cc
1 // Copyright (C) 2019-2022 Free Software Foundation, Inc.
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)
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.
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/>.
18 // { dg-do run { target c++11 } }
22 #include <testsuite_hooks.h>
26 #ifdef _GLIBCXX_USE_C99_MATH_TR1
29 bool copysign(float x
, float y
)
30 { return __builtin_copysignf(x
, y
); }
32 bool copysign(double x
, double y
)
33 { return __builtin_copysign(x
, y
); }
35 bool copysign(long double x
, long double y
)
36 { return __builtin_copysignl(x
, y
); }
41 bool eq(const std::complex<T
>& x
, const std::complex<T
>& y
)
43 bool nan_reals
= std::isnan(x
.real()) && std::isnan(y
.real());
44 bool nan_imags
= std::isnan(x
.imag()) && std::isnan(y
.imag());
47 = test::copysign(T(1), x
.real()) == test::copysign(T(1), y
.real());
49 = test::copysign(T(1), x
.imag()) == test::copysign(T(1), y
.imag());
51 return ((x
.real() == y
.real() && sign_reals
) || nan_reals
)
52 && ((x
.imag() == y
.imag() && sign_imags
) || nan_imags
);
58 const double qnan
= std::numeric_limits
<double>::quiet_NaN();
59 const double pinf
= std::numeric_limits
<double>::infinity();
60 const double ninf
= -pinf
;
62 std::complex<double> c00(0, 0);
63 VERIFY( eq( std::proj(c00
) , c00
) );
64 VERIFY( eq( std::proj(-c00
) , -c00
) );
66 VERIFY( eq( std::proj(c00
) , c00
) );
67 VERIFY( eq( std::proj(-c00
) , -c00
) );
69 const std::complex<double> c01(0, 1);
70 VERIFY( eq( std::proj(c01
) , c01
) );
71 VERIFY( eq( std::proj(-c01
) , -c01
) );
73 VERIFY( eq( std::proj(c01
) , c01
) );
74 VERIFY( eq( std::proj(-c01
) , -c01
) );
76 const std::complex<double> c10(1, 0);
77 VERIFY( eq( std::proj(c10
) , c10
) );
78 VERIFY( eq( std::proj(-c10
) , -c10
) );
80 const std::complex<double> c12(1, 2);
81 VERIFY( eq( std::proj(c12
) , c12
) );
82 VERIFY( eq( std::proj(-c12
) , -c12
) );
84 const std::complex<double> c0q(0, qnan
);
85 VERIFY( eq( std::proj(c0q
) , c0q
) );
86 VERIFY( eq( std::proj(-c0q
) , -c0q
) );
88 const std::complex<double> c1q(1, qnan
);
89 VERIFY( eq( std::proj(c1q
) , c1q
) );
90 VERIFY( eq( std::proj(-c1q
) , -c1q
) );
92 const std::complex<double> cq0(qnan
, 0);
93 VERIFY( eq( std::proj(cq0
) , cq0
) );
94 VERIFY( eq( std::proj(-cq0
) , -cq0
) );
96 const std::complex<double> cq1(qnan
, 1);
97 VERIFY( eq( std::proj(cq1
) , cq1
) );
98 VERIFY( eq( std::proj(-cq1
) , -cq1
) );
100 const std::complex<double> cqq(qnan
, qnan
);
101 VERIFY( eq( std::proj(cqq
) , cqq
) );
102 VERIFY( eq( std::proj(-cqq
) , -cqq
) );
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) ) );
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) ) );
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) ) );
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) ) );
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) ) );
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) ) );
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) ) );
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) ) );
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) ) );
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) ) );
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) ) );
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) ) );
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) ) );
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) ) );
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) ) );
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) ) );
172 const float qnan
= std::numeric_limits
<float>::quiet_NaN();
173 const float pinf
= std::numeric_limits
<float>::infinity();
174 const float ninf
= -pinf
;
176 std::complex<float> c00(0, 0);
177 VERIFY( eq( std::proj(c00
) , c00
) );
178 VERIFY( eq( std::proj(-c00
) , -c00
) );
180 VERIFY( eq( std::proj(c00
) , c00
) );
181 VERIFY( eq( std::proj(-c00
) , -c00
) );
183 const std::complex<float> c01(0, 1);
184 VERIFY( eq( std::proj(c01
) , c01
) );
185 VERIFY( eq( std::proj(-c01
) , -c01
) );
187 VERIFY( eq( std::proj(c01
) , c01
) );
188 VERIFY( eq( std::proj(-c01
) , -c01
) );
190 const std::complex<float> c10(1, 0);
191 VERIFY( eq( std::proj(c10
) , c10
) );
192 VERIFY( eq( std::proj(-c10
) , -c10
) );
194 const std::complex<float> c12(1, 2);
195 VERIFY( eq( std::proj(c12
) , c12
) );
196 VERIFY( eq( std::proj(-c12
) , -c12
) );
198 const std::complex<float> c0q(0, qnan
);
199 VERIFY( eq( std::proj(c0q
) , c0q
) );
200 VERIFY( eq( std::proj(-c0q
) , -c0q
) );
202 const std::complex<float> c1q(1, qnan
);
203 VERIFY( eq( std::proj(c1q
) , c1q
) );
204 VERIFY( eq( std::proj(-c1q
) , -c1q
) );
206 const std::complex<float> cq0(qnan
, 0);
207 VERIFY( eq( std::proj(cq0
) , cq0
) );
208 VERIFY( eq( std::proj(-cq0
) , -cq0
) );
210 const std::complex<float> cq1(qnan
, 1);
211 VERIFY( eq( std::proj(cq1
) , cq1
) );
212 VERIFY( eq( std::proj(-cq1
) , -cq1
) );
214 const std::complex<float> cqq(qnan
, qnan
);
215 VERIFY( eq( std::proj(cqq
) , cqq
) );
216 VERIFY( eq( std::proj(-cqq
) , -cqq
) );
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) ) );
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) ) );
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) ) );
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) ) );
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) ) );
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) ) );
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) ) );
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) ) );
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) ) );
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) ) );
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) ) );
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) ) );
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) ) );
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) ) );
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) ) );
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) ) );
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
;
290 std::complex<long double> c00(0, 0);
291 VERIFY( eq( std::proj(c00
) , c00
) );
292 VERIFY( eq( std::proj(-c00
) , -c00
) );
294 VERIFY( eq( std::proj(c00
) , c00
) );
295 VERIFY( eq( std::proj(-c00
) , -c00
) );
297 const std::complex<long double> c01(0, 1);
298 VERIFY( eq( std::proj(c01
) , c01
) );
299 VERIFY( eq( std::proj(-c01
) , -c01
) );
301 VERIFY( eq( std::proj(c01
) , c01
) );
302 VERIFY( eq( std::proj(-c01
) , -c01
) );
304 const std::complex<long double> c10(1, 0);
305 VERIFY( eq( std::proj(c10
) , c10
) );
306 VERIFY( eq( std::proj(-c10
) , -c10
) );
308 const std::complex<long double> c12(1, 2);
309 VERIFY( eq( std::proj(c12
) , c12
) );
310 VERIFY( eq( std::proj(-c12
) , -c12
) );
312 const std::complex<long double> c0q(0, qnan
);
313 VERIFY( eq( std::proj(c0q
) , c0q
) );
314 VERIFY( eq( std::proj(-c0q
) , -c0q
) );
316 const std::complex<long double> c1q(1, qnan
);
317 VERIFY( eq( std::proj(c1q
) , c1q
) );
318 VERIFY( eq( std::proj(-c1q
) , -c1q
) );
320 const std::complex<long double> cq0(qnan
, 0);
321 VERIFY( eq( std::proj(cq0
) , cq0
) );
322 VERIFY( eq( std::proj(-cq0
) , -cq0
) );
324 const std::complex<long double> cq1(qnan
, 1);
325 VERIFY( eq( std::proj(cq1
) , cq1
) );
326 VERIFY( eq( std::proj(-cq1
) , -cq1
) );
328 const std::complex<long double> cqq(qnan
, qnan
);
329 VERIFY( eq( std::proj(cqq
) , cqq
) );
330 VERIFY( eq( std::proj(-cqq
) , -cqq
) );
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) ) );
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) ) );
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) ) );
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) ) );
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) ) );
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) ) );
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) ) );
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) ) );
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) ) );
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) ) );
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) ) );
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) ) );
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) ) );
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) ) );
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) ) );
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) ) );