15a83710eSEric Fiselier //===----------------------------------------------------------------------===// 25a83710eSEric Fiselier // 357b08b09SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 457b08b09SChandler Carruth // See https://llvm.org/LICENSE.txt for license information. 557b08b09SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 65a83710eSEric Fiselier // 75a83710eSEric Fiselier //===----------------------------------------------------------------------===// 85a83710eSEric Fiselier 95a83710eSEric Fiselier // <complex> 105a83710eSEric Fiselier 115a83710eSEric Fiselier // template<class T> 125a83710eSEric Fiselier // complex<T> 135a83710eSEric Fiselier // cosh(const complex<T>& x); 145a83710eSEric Fiselier 155a83710eSEric Fiselier #include <complex> 165a83710eSEric Fiselier #include <cassert> 175a83710eSEric Fiselier 18*7fc6a556SMarshall Clow #include "test_macros.h" 195a83710eSEric Fiselier #include "../cases.h" 205a83710eSEric Fiselier 215a83710eSEric Fiselier template <class T> 225a83710eSEric Fiselier void test(const std::complex<T> & c,std::complex<T> x)235a83710eSEric Fiseliertest(const std::complex<T>& c, std::complex<T> x) 245a83710eSEric Fiselier { 255a83710eSEric Fiselier assert(cosh(c) == x); 265a83710eSEric Fiselier } 275a83710eSEric Fiselier 285a83710eSEric Fiselier template <class T> 295a83710eSEric Fiselier void test()305a83710eSEric Fiseliertest() 315a83710eSEric Fiselier { 325a83710eSEric Fiselier test(std::complex<T>(0, 0), std::complex<T>(1, 0)); 335a83710eSEric Fiselier } 345a83710eSEric Fiselier test_edges()355a83710eSEric Fiseliervoid test_edges() 365a83710eSEric Fiselier { 37217cf69bSMarshall Clow const unsigned N = sizeof(testcases) / sizeof(testcases[0]); 385a83710eSEric Fiselier for (unsigned i = 0; i < N; ++i) 395a83710eSEric Fiselier { 40217cf69bSMarshall Clow std::complex<double> r = cosh(testcases[i]); 41217cf69bSMarshall Clow if (testcases[i].real() == 0 && testcases[i].imag() == 0) 425a83710eSEric Fiselier { 435a83710eSEric Fiselier assert(r.real() == 1); 445a83710eSEric Fiselier assert(r.imag() == 0); 45217cf69bSMarshall Clow assert(std::signbit(r.imag()) == std::signbit(testcases[i].imag())); 465a83710eSEric Fiselier } 47217cf69bSMarshall Clow else if (testcases[i].real() == 0 && std::isinf(testcases[i].imag())) 485a83710eSEric Fiselier { 495a83710eSEric Fiselier assert(std::isnan(r.real())); 505a83710eSEric Fiselier assert(r.imag() == 0); 515a83710eSEric Fiselier } 52217cf69bSMarshall Clow else if (testcases[i].real() == 0 && std::isnan(testcases[i].imag())) 535a83710eSEric Fiselier { 545a83710eSEric Fiselier assert(std::isnan(r.real())); 555a83710eSEric Fiselier assert(r.imag() == 0); 565a83710eSEric Fiselier } 57217cf69bSMarshall Clow else if (std::isfinite(testcases[i].real()) && std::isinf(testcases[i].imag())) 585a83710eSEric Fiselier { 595a83710eSEric Fiselier assert(std::isnan(r.real())); 605a83710eSEric Fiselier assert(std::isnan(r.imag())); 615a83710eSEric Fiselier } 62217cf69bSMarshall Clow else if (std::isfinite(testcases[i].real()) && std::isnan(testcases[i].imag())) 635a83710eSEric Fiselier { 645a83710eSEric Fiselier assert(std::isnan(r.real())); 655a83710eSEric Fiselier assert(std::isnan(r.imag())); 665a83710eSEric Fiselier } 67217cf69bSMarshall Clow else if (std::isinf(testcases[i].real()) && testcases[i].imag() == 0) 685a83710eSEric Fiselier { 695a83710eSEric Fiselier assert(std::isinf(r.real())); 705a83710eSEric Fiselier assert(!std::signbit(r.real())); 715a83710eSEric Fiselier assert(r.imag() == 0); 72217cf69bSMarshall Clow assert(std::signbit(r.imag()) == std::signbit(testcases[i].imag())); 735a83710eSEric Fiselier } 74217cf69bSMarshall Clow else if (std::isinf(testcases[i].real()) && std::isfinite(testcases[i].imag())) 755a83710eSEric Fiselier { 765a83710eSEric Fiselier assert(std::isinf(r.real())); 77217cf69bSMarshall Clow assert(std::signbit(r.real()) == std::signbit(cos(testcases[i].imag()))); 785a83710eSEric Fiselier assert(std::isinf(r.imag())); 79217cf69bSMarshall Clow assert(std::signbit(r.imag()) == std::signbit(testcases[i].real() * sin(testcases[i].imag()))); 805a83710eSEric Fiselier } 81217cf69bSMarshall Clow else if (std::isinf(testcases[i].real()) && std::isinf(testcases[i].imag())) 825a83710eSEric Fiselier { 835a83710eSEric Fiselier assert(std::isinf(r.real())); 845a83710eSEric Fiselier assert(std::isnan(r.imag())); 855a83710eSEric Fiselier } 86217cf69bSMarshall Clow else if (std::isinf(testcases[i].real()) && std::isnan(testcases[i].imag())) 875a83710eSEric Fiselier { 885a83710eSEric Fiselier assert(std::isinf(r.real())); 895a83710eSEric Fiselier assert(r.real() > 0); 905a83710eSEric Fiselier assert(std::isnan(r.imag())); 915a83710eSEric Fiselier } 92217cf69bSMarshall Clow else if (std::isnan(testcases[i].real()) && testcases[i].imag() == 0) 935a83710eSEric Fiselier { 945a83710eSEric Fiselier assert(std::isnan(r.real())); 955a83710eSEric Fiselier assert(r.imag() == 0); 965a83710eSEric Fiselier } 97217cf69bSMarshall Clow else if (std::isnan(testcases[i].real()) && std::isfinite(testcases[i].imag())) 985a83710eSEric Fiselier { 995a83710eSEric Fiselier assert(std::isnan(r.real())); 1005a83710eSEric Fiselier assert(std::isnan(r.imag())); 1015a83710eSEric Fiselier } 102217cf69bSMarshall Clow else if (std::isnan(testcases[i].real()) && std::isnan(testcases[i].imag())) 1035a83710eSEric Fiselier { 1045a83710eSEric Fiselier assert(std::isnan(r.real())); 1055a83710eSEric Fiselier assert(std::isnan(r.imag())); 1065a83710eSEric Fiselier } 1075a83710eSEric Fiselier } 1085a83710eSEric Fiselier } 1095a83710eSEric Fiselier main(int,char **)1102df59c50SJF Bastienint main(int, char**) 1115a83710eSEric Fiselier { 1125a83710eSEric Fiselier test<float>(); 1135a83710eSEric Fiselier test<double>(); 1145a83710eSEric Fiselier test<long double>(); 1155a83710eSEric Fiselier test_edges(); 1162df59c50SJF Bastien 1172df59c50SJF Bastien return 0; 1185a83710eSEric Fiselier } 119