Skip to content

Commit 329ce37

Browse files
committed
[libcxx] adds tests for complex<float> and complex<long double>
This increases test coverage for `std::complex`, and improves verifying improvements to `complex` to non-double types.
1 parent a8d2aee commit 329ce37

28 files changed

+1338
-1576
lines changed

libcxx/test/std/numerics/complex.number/cases.h

Lines changed: 165 additions & 166 deletions
Original file line numberDiff line numberDiff line change
@@ -15,181 +15,182 @@
1515

1616
#include <cassert>
1717
#include <complex>
18+
#include <limits>
1819
#include <type_traits>
1920

2021
#include "test_macros.h"
2122

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),
23+
template <class T>
24+
TEST_CONSTEXPR_CXX20 const std::complex<T> testcases[] = {
25+
std::complex<T>(+1.e-6, +1.e-6),
26+
std::complex<T>(-1.e-6, +1.e-6),
27+
std::complex<T>(-1.e-6, -1.e-6),
28+
std::complex<T>(+1.e-6, -1.e-6),
2829

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),
30+
std::complex<T>(+1.e+6, +1.e-6),
31+
std::complex<T>(-1.e+6, +1.e-6),
32+
std::complex<T>(-1.e+6, -1.e-6),
33+
std::complex<T>(+1.e+6, -1.e-6),
3334

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),
35+
std::complex<T>(+1.e-6, +1.e+6),
36+
std::complex<T>(-1.e-6, +1.e+6),
37+
std::complex<T>(-1.e-6, -1.e+6),
38+
std::complex<T>(+1.e-6, -1.e+6),
3839

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),
40+
std::complex<T>(+1.e+6, +1.e+6),
41+
std::complex<T>(-1.e+6, +1.e+6),
42+
std::complex<T>(-1.e+6, -1.e+6),
43+
std::complex<T>(+1.e+6, -1.e+6),
4344

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),
45+
std::complex<T>(-0.0, -1.e-6),
46+
std::complex<T>(-0.0, +1.e-6),
47+
std::complex<T>(-0.0, +1.e+6),
48+
std::complex<T>(-0.0, -1.e+6),
49+
std::complex<T>(+0.0, -1.e-6),
50+
std::complex<T>(+0.0, +1.e-6),
51+
std::complex<T>(+0.0, +1.e+6),
52+
std::complex<T>(+0.0, -1.e+6),
5253

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),
54+
std::complex<T>(-1.e-6, -0.0),
55+
std::complex<T>(+1.e-6, -0.0),
56+
std::complex<T>(+1.e+6, -0.0),
57+
std::complex<T>(-1.e+6, -0.0),
58+
std::complex<T>(-1.e-6, +0.0),
59+
std::complex<T>(+1.e-6, +0.0),
60+
std::complex<T>(+1.e+6, +0.0),
61+
std::complex<T>(-1.e+6, +0.0),
6162

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()),
63+
std::complex<T>(std::numeric_limits<T>::quiet_NaN(), std::numeric_limits<T>::quiet_NaN()),
64+
std::complex<T>(-std::numeric_limits<T>::infinity(), std::numeric_limits<T>::quiet_NaN()),
65+
std::complex<T>(-2, std::numeric_limits<T>::quiet_NaN()),
66+
std::complex<T>(-1, std::numeric_limits<T>::quiet_NaN()),
67+
std::complex<T>(-0.5, std::numeric_limits<T>::quiet_NaN()),
68+
std::complex<T>(-0., std::numeric_limits<T>::quiet_NaN()),
69+
std::complex<T>(+0., std::numeric_limits<T>::quiet_NaN()),
70+
std::complex<T>(0.5, std::numeric_limits<T>::quiet_NaN()),
71+
std::complex<T>(1, std::numeric_limits<T>::quiet_NaN()),
72+
std::complex<T>(2, std::numeric_limits<T>::quiet_NaN()),
73+
std::complex<T>(std::numeric_limits<T>::infinity(), std::numeric_limits<T>::quiet_NaN()),
7374

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()),
75+
std::complex<T>(std::numeric_limits<T>::quiet_NaN(), -std::numeric_limits<T>::infinity()),
76+
std::complex<T>(-std::numeric_limits<T>::infinity(), -std::numeric_limits<T>::infinity()),
77+
std::complex<T>(-2, -std::numeric_limits<T>::infinity()),
78+
std::complex<T>(-1, -std::numeric_limits<T>::infinity()),
79+
std::complex<T>(-0.5, -std::numeric_limits<T>::infinity()),
80+
std::complex<T>(-0., -std::numeric_limits<T>::infinity()),
81+
std::complex<T>(+0., -std::numeric_limits<T>::infinity()),
82+
std::complex<T>(0.5, -std::numeric_limits<T>::infinity()),
83+
std::complex<T>(1, -std::numeric_limits<T>::infinity()),
84+
std::complex<T>(2, -std::numeric_limits<T>::infinity()),
85+
std::complex<T>(std::numeric_limits<T>::infinity(), -std::numeric_limits<T>::infinity()),
8586

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),
87+
std::complex<T>(std::numeric_limits<T>::quiet_NaN(), -2),
88+
std::complex<T>(-std::numeric_limits<T>::infinity(), -2),
89+
std::complex<T>(-2, -2),
90+
std::complex<T>(-1, -2),
91+
std::complex<T>(-0.5, -2),
92+
std::complex<T>(-0., -2),
93+
std::complex<T>(+0., -2),
94+
std::complex<T>(0.5, -2),
95+
std::complex<T>(1, -2),
96+
std::complex<T>(2, -2),
97+
std::complex<T>(std::numeric_limits<T>::infinity(), -2),
9798

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),
99+
std::complex<T>(std::numeric_limits<T>::quiet_NaN(), -1),
100+
std::complex<T>(-std::numeric_limits<T>::infinity(), -1),
101+
std::complex<T>(-2, -1),
102+
std::complex<T>(-1, -1),
103+
std::complex<T>(-0.5, -1),
104+
std::complex<T>(-0., -1),
105+
std::complex<T>(+0., -1),
106+
std::complex<T>(0.5, -1),
107+
std::complex<T>(1, -1),
108+
std::complex<T>(2, -1),
109+
std::complex<T>(std::numeric_limits<T>::infinity(), -1),
109110

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),
111+
std::complex<T>(std::numeric_limits<T>::quiet_NaN(), -0.5),
112+
std::complex<T>(-std::numeric_limits<T>::infinity(), -0.5),
113+
std::complex<T>(-2, -0.5),
114+
std::complex<T>(-1, -0.5),
115+
std::complex<T>(-0.5, -0.5),
116+
std::complex<T>(-0., -0.5),
117+
std::complex<T>(+0., -0.5),
118+
std::complex<T>(0.5, -0.5),
119+
std::complex<T>(1, -0.5),
120+
std::complex<T>(2, -0.5),
121+
std::complex<T>(std::numeric_limits<T>::infinity(), -0.5),
121122

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.),
123+
std::complex<T>(std::numeric_limits<T>::quiet_NaN(), -0.),
124+
std::complex<T>(-std::numeric_limits<T>::infinity(), -0.),
125+
std::complex<T>(-2, -0.),
126+
std::complex<T>(-1, -0.),
127+
std::complex<T>(-0.5, -0.),
128+
std::complex<T>(-0., -0.),
129+
std::complex<T>(+0., -0.),
130+
std::complex<T>(0.5, -0.),
131+
std::complex<T>(1, -0.),
132+
std::complex<T>(2, -0.),
133+
std::complex<T>(std::numeric_limits<T>::infinity(), -0.),
133134

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.),
135+
std::complex<T>(std::numeric_limits<T>::quiet_NaN(), +0.),
136+
std::complex<T>(-std::numeric_limits<T>::infinity(), +0.),
137+
std::complex<T>(-2, +0.),
138+
std::complex<T>(-1, +0.),
139+
std::complex<T>(-0.5, +0.),
140+
std::complex<T>(-0., +0.),
141+
std::complex<T>(+0., +0.),
142+
std::complex<T>(0.5, +0.),
143+
std::complex<T>(1, +0.),
144+
std::complex<T>(2, +0.),
145+
std::complex<T>(std::numeric_limits<T>::infinity(), +0.),
145146

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),
147+
std::complex<T>(std::numeric_limits<T>::quiet_NaN(), 0.5),
148+
std::complex<T>(-std::numeric_limits<T>::infinity(), 0.5),
149+
std::complex<T>(-2, 0.5),
150+
std::complex<T>(-1, 0.5),
151+
std::complex<T>(-0.5, 0.5),
152+
std::complex<T>(-0., 0.5),
153+
std::complex<T>(+0., 0.5),
154+
std::complex<T>(0.5, 0.5),
155+
std::complex<T>(1, 0.5),
156+
std::complex<T>(2, 0.5),
157+
std::complex<T>(std::numeric_limits<T>::infinity(), 0.5),
157158

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),
159+
std::complex<T>(std::numeric_limits<T>::quiet_NaN(), 1),
160+
std::complex<T>(-std::numeric_limits<T>::infinity(), 1),
161+
std::complex<T>(-2, 1),
162+
std::complex<T>(-1, 1),
163+
std::complex<T>(-0.5, 1),
164+
std::complex<T>(-0., 1),
165+
std::complex<T>(+0., 1),
166+
std::complex<T>(0.5, 1),
167+
std::complex<T>(1, 1),
168+
std::complex<T>(2, 1),
169+
std::complex<T>(std::numeric_limits<T>::infinity(), 1),
169170

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),
171+
std::complex<T>(std::numeric_limits<T>::quiet_NaN(), 2),
172+
std::complex<T>(-std::numeric_limits<T>::infinity(), 2),
173+
std::complex<T>(-2, 2),
174+
std::complex<T>(-1, 2),
175+
std::complex<T>(-0.5, 2),
176+
std::complex<T>(-0., 2),
177+
std::complex<T>(+0., 2),
178+
std::complex<T>(0.5, 2),
179+
std::complex<T>(1, 2),
180+
std::complex<T>(2, 2),
181+
std::complex<T>(std::numeric_limits<T>::infinity(), 2),
181182

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())
183+
std::complex<T>(std::numeric_limits<T>::quiet_NaN(), std::numeric_limits<T>::infinity()),
184+
std::complex<T>(-std::numeric_limits<T>::infinity(), std::numeric_limits<T>::infinity()),
185+
std::complex<T>(-2, std::numeric_limits<T>::infinity()),
186+
std::complex<T>(-1, std::numeric_limits<T>::infinity()),
187+
std::complex<T>(-0.5, std::numeric_limits<T>::infinity()),
188+
std::complex<T>(-0., std::numeric_limits<T>::infinity()),
189+
std::complex<T>(+0., std::numeric_limits<T>::infinity()),
190+
std::complex<T>(0.5, std::numeric_limits<T>::infinity()),
191+
std::complex<T>(1, std::numeric_limits<T>::infinity()),
192+
std::complex<T>(2, std::numeric_limits<T>::infinity()),
193+
std::complex<T>(std::numeric_limits<T>::infinity(), std::numeric_limits<T>::infinity()),
193194
};
194195

195196
enum {zero, non_zero, inf, NaN, non_zero_nan};
@@ -230,17 +231,15 @@ classify(const std::complex<T>& x)
230231
return non_zero;
231232
}
232233

233-
inline
234-
int
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;
234+
template <class T>
235+
inline int classify(T x) {
236+
if (x == 0)
237+
return zero;
238+
if (std::isinf(x))
239+
return inf;
240+
if (std::isnan(x))
241+
return NaN;
242+
return non_zero;
244243
}
245244

246245
void is_about(float x, float y)

0 commit comments

Comments
 (0)