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