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 // cosh(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(cosh(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 = cosh(testcases[i]); 40 if (testcases[i].real() == 0 && testcases[i].imag() == 0) 41 { 42 assert(r.real() == 1); 43 assert(r.imag() == 0); 44 assert(std::signbit(r.imag()) == std::signbit(testcases[i].imag())); 45 } 46 else if (testcases[i].real() == 0 && std::isinf(testcases[i].imag())) 47 { 48 assert(std::isnan(r.real())); 49 assert(r.imag() == 0); 50 } 51 else if (testcases[i].real() == 0 && std::isnan(testcases[i].imag())) 52 { 53 assert(std::isnan(r.real())); 54 assert(r.imag() == 0); 55 } 56 else if (std::isfinite(testcases[i].real()) && std::isinf(testcases[i].imag())) 57 { 58 assert(std::isnan(r.real())); 59 assert(std::isnan(r.imag())); 60 } 61 else if (std::isfinite(testcases[i].real()) && std::isnan(testcases[i].imag())) 62 { 63 assert(std::isnan(r.real())); 64 assert(std::isnan(r.imag())); 65 } 66 else if (std::isinf(testcases[i].real()) && testcases[i].imag() == 0) 67 { 68 assert(std::isinf(r.real())); 69 assert(!std::signbit(r.real())); 70 assert(r.imag() == 0); 71 assert(std::signbit(r.imag()) == std::signbit(testcases[i].imag())); 72 } 73 else if (std::isinf(testcases[i].real()) && std::isfinite(testcases[i].imag())) 74 { 75 assert(std::isinf(r.real())); 76 assert(std::signbit(r.real()) == std::signbit(cos(testcases[i].imag()))); 77 assert(std::isinf(r.imag())); 78 assert(std::signbit(r.imag()) == std::signbit(testcases[i].real() * sin(testcases[i].imag()))); 79 } 80 else if (std::isinf(testcases[i].real()) && std::isinf(testcases[i].imag())) 81 { 82 assert(std::isinf(r.real())); 83 assert(std::isnan(r.imag())); 84 } 85 else if (std::isinf(testcases[i].real()) && std::isnan(testcases[i].imag())) 86 { 87 assert(std::isinf(r.real())); 88 assert(r.real() > 0); 89 assert(std::isnan(r.imag())); 90 } 91 else if (std::isnan(testcases[i].real()) && testcases[i].imag() == 0) 92 { 93 assert(std::isnan(r.real())); 94 assert(r.imag() == 0); 95 } 96 else if (std::isnan(testcases[i].real()) && std::isfinite(testcases[i].imag())) 97 { 98 assert(std::isnan(r.real())); 99 assert(std::isnan(r.imag())); 100 } 101 else if (std::isnan(testcases[i].real()) && std::isnan(testcases[i].imag())) 102 { 103 assert(std::isnan(r.real())); 104 assert(std::isnan(r.imag())); 105 } 106 } 107 } 108 109 int main(int, char**) 110 { 111 test<float>(); 112 test<double>(); 113 test<long double>(); 114 test_edges(); 115 116 return 0; 117 } 118