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 // template<class T>
12 //   complex<T>
13 //   sqrt(const complex<T>& x);
14 
15 #include <complex>
16 #include <cassert>
17 
18 #include "../cases.h"
19 
20 template <class T>
21 void
22 test(const std::complex<T>& c, std::complex<T> x)
23 {
24     std::complex<T> a = sqrt(c);
25     is_about(real(a), real(x));
26     assert(std::abs(imag(c)) < 1.e-6);
27 }
28 
29 template <class T>
30 void
31 test()
32 {
33     test(std::complex<T>(64, 0), std::complex<T>(8, 0));
34 }
35 
36 void test_edges()
37 {
38     const unsigned N = sizeof(testcases) / sizeof(testcases[0]);
39     for (unsigned i = 0; i < N; ++i)
40     {
41         std::complex<double> r = sqrt(testcases[i]);
42         if (testcases[i].real() == 0 && testcases[i].imag() == 0)
43         {
44             assert(!std::signbit(r.real()));
45             assert(std::signbit(r.imag()) == std::signbit(testcases[i].imag()));
46         }
47         else if (std::isinf(testcases[i].imag()))
48         {
49             assert(std::isinf(r.real()));
50             assert(r.real() > 0);
51             assert(std::isinf(r.imag()));
52             assert(std::signbit(r.imag()) == std::signbit(testcases[i].imag()));
53         }
54         else if (std::isfinite(testcases[i].real()) && std::isnan(testcases[i].imag()))
55         {
56             assert(std::isnan(r.real()));
57             assert(std::isnan(r.imag()));
58         }
59         else if (std::isinf(testcases[i].real()) && testcases[i].real() < 0 && std::isfinite(testcases[i].imag()))
60         {
61             assert(r.real() == 0);
62             assert(!std::signbit(r.real()));
63             assert(std::isinf(r.imag()));
64             assert(std::signbit(testcases[i].imag()) == std::signbit(r.imag()));
65         }
66         else if (std::isinf(testcases[i].real()) && testcases[i].real() > 0 && std::isfinite(testcases[i].imag()))
67         {
68             assert(std::isinf(r.real()));
69             assert(r.real() > 0);
70             assert(r.imag() == 0);
71             assert(std::signbit(testcases[i].imag()) == std::signbit(r.imag()));
72         }
73         else if (std::isinf(testcases[i].real()) && testcases[i].real() < 0 && std::isnan(testcases[i].imag()))
74         {
75             assert(std::isnan(r.real()));
76             assert(std::isinf(r.imag()));
77         }
78         else if (std::isinf(testcases[i].real()) && testcases[i].real() > 0 && std::isnan(testcases[i].imag()))
79         {
80             assert(std::isinf(r.real()));
81             assert(r.real() > 0);
82             assert(std::isnan(r.imag()));
83         }
84         else if (std::isnan(testcases[i].real()) && (std::isfinite(testcases[i].imag()) || std::isnan(testcases[i].imag())))
85         {
86             assert(std::isnan(r.real()));
87             assert(std::isnan(r.imag()));
88         }
89         else if (std::signbit(testcases[i].imag()))
90         {
91             assert(!std::signbit(r.real()));
92             assert(std::signbit(r.imag()));
93         }
94         else
95         {
96             assert(!std::signbit(r.real()));
97             assert(!std::signbit(r.imag()));
98         }
99     }
100 }
101 
102 int main(int, char**)
103 {
104     test<float>();
105     test<double>();
106     test<long double>();
107     test_edges();
108 
109   return 0;
110 }
111