1 //===----------------------------------------------------------------------===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is dual licensed under the MIT and the University of Illinois Open
6 // Source Licenses. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 
10 // <complex>
11 
12 // template<class T>
13 //   T
14 //   arg(const complex<T>& x);
15 
16 #include <complex>
17 #include <cassert>
18 
19 #include "../cases.h"
20 
21 template <class T>
22 void
test()23 test()
24 {
25     std::complex<T> z(1, 0);
26     assert(arg(z) == 0);
27 }
28 
test_edges()29 void test_edges()
30 {
31     const double pi = std::atan2(+0., -0.);
32     const unsigned N = sizeof(x) / sizeof(x[0]);
33     for (unsigned i = 0; i < N; ++i)
34     {
35         double r = arg(x[i]);
36         if (std::isnan(x[i].real()) || std::isnan(x[i].imag()))
37             assert(std::isnan(r));
38         else
39         {
40             switch (classify(x[i]))
41             {
42             case zero:
43                 if (std::signbit(x[i].real()))
44                 {
45                     if (std::signbit(x[i].imag()))
46                         is_about(r, -pi);
47                     else
48                         is_about(r, pi);
49                 }
50                 else
51                 {
52                     assert(std::signbit(x[i].imag()) == std::signbit(r));
53                 }
54                 break;
55             case non_zero:
56                 if (x[i].real() == 0)
57                 {
58                     if (x[i].imag() < 0)
59                         is_about(r, -pi/2);
60                     else
61                         is_about(r, pi/2);
62                 }
63                 else if (x[i].imag() == 0)
64                 {
65                     if (x[i].real() < 0)
66                     {
67                         if (std::signbit(x[i].imag()))
68                             is_about(r, -pi);
69                         else
70                             is_about(r, pi);
71                     }
72                     else
73                     {
74                         assert(r == 0);
75                         assert(std::signbit(x[i].imag()) == std::signbit(r));
76                     }
77                 }
78                 else if (x[i].imag() > 0)
79                     assert(r > 0);
80                 else
81                     assert(r < 0);
82                 break;
83             case inf:
84                 if (std::isinf(x[i].real()) && std::isinf(x[i].imag()))
85                 {
86                     if (x[i].real() < 0)
87                     {
88                         if (x[i].imag() > 0)
89                             is_about(r, 0.75 * pi);
90                         else
91                             is_about(r, -0.75 * pi);
92                     }
93                     else
94                     {
95                         if (x[i].imag() > 0)
96                             is_about(r, 0.25 * pi);
97                         else
98                             is_about(r, -0.25 * pi);
99                     }
100                 }
101                 else if (std::isinf(x[i].real()))
102                 {
103                     if (x[i].real() < 0)
104                     {
105                         if (std::signbit(x[i].imag()))
106                             is_about(r, -pi);
107                         else
108                             is_about(r, pi);
109                     }
110                     else
111                     {
112                         assert(r == 0);
113                         assert(std::signbit(r) == std::signbit(x[i].imag()));
114                     }
115                 }
116                 else
117                 {
118                     if (x[i].imag() < 0)
119                         is_about(r, -pi/2);
120                     else
121                         is_about(r, pi/2);
122                 }
123                 break;
124             }
125         }
126     }
127 }
128 
main()129 int main()
130 {
131     test<float>();
132     test<double>();
133     test<long double>();
134     test_edges();
135 }
136