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