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 // exp(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 assert(exp(c) == x); 25 } 26 27 template <class T> 28 void 29 test() 30 { 31 test(std::complex<T>(0, 0), std::complex<T>(1, 0)); 32 } 33 34 void test_edges() 35 { 36 const unsigned N = sizeof(testcases) / sizeof(testcases[0]); 37 for (unsigned i = 0; i < N; ++i) 38 { 39 std::complex<double> r = exp(testcases[i]); 40 if (testcases[i].real() == 0 && testcases[i].imag() == 0) 41 { 42 assert(r.real() == 1.0); 43 assert(r.imag() == 0); 44 assert(std::signbit(testcases[i].imag()) == std::signbit(r.imag())); 45 } 46 else if (std::isfinite(testcases[i].real()) && std::isinf(testcases[i].imag())) 47 { 48 assert(std::isnan(r.real())); 49 assert(std::isnan(r.imag())); 50 } 51 else if (std::isfinite(testcases[i].real()) && std::isnan(testcases[i].imag())) 52 { 53 assert(std::isnan(r.real())); 54 assert(std::isnan(r.imag())); 55 } 56 else if (std::isinf(testcases[i].real()) && testcases[i].real() > 0 && testcases[i].imag() == 0) 57 { 58 assert(std::isinf(r.real())); 59 assert(r.real() > 0); 60 assert(r.imag() == 0); 61 assert(std::signbit(testcases[i].imag()) == std::signbit(r.imag())); 62 } 63 else if (std::isinf(testcases[i].real()) && testcases[i].real() < 0 && std::isinf(testcases[i].imag())) 64 { 65 assert(r.real() == 0); 66 assert(r.imag() == 0); 67 } 68 else if (std::isinf(testcases[i].real()) && testcases[i].real() > 0 && std::isinf(testcases[i].imag())) 69 { 70 assert(std::isinf(r.real())); 71 assert(std::isnan(r.imag())); 72 } 73 else if (std::isinf(testcases[i].real()) && testcases[i].real() < 0 && std::isnan(testcases[i].imag())) 74 { 75 assert(r.real() == 0); 76 assert(r.imag() == 0); 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(std::isnan(r.imag())); 82 } 83 else if (std::isnan(testcases[i].real()) && testcases[i].imag() == 0) 84 { 85 assert(std::isnan(r.real())); 86 assert(r.imag() == 0); 87 assert(std::signbit(testcases[i].imag()) == std::signbit(r.imag())); 88 } 89 else if (std::isnan(testcases[i].real()) && testcases[i].imag() != 0) 90 { 91 assert(std::isnan(r.real())); 92 assert(std::isnan(r.imag())); 93 } 94 else if (std::isnan(testcases[i].real()) && std::isnan(testcases[i].imag())) 95 { 96 assert(std::isnan(r.real())); 97 assert(std::isnan(r.imag())); 98 } 99 else if (std::isfinite(testcases[i].imag()) && std::abs(testcases[i].imag()) <= 1) 100 { 101 assert(!std::signbit(r.real())); 102 assert(std::signbit(r.imag()) == std::signbit(testcases[i].imag())); 103 } 104 } 105 } 106 107 int main(int, char**) 108 { 109 test<float>(); 110 test<double>(); 111 test<long double>(); 112 test_edges(); 113 114 return 0; 115 } 116