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 // cos(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(cos(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 = cos(testcases[i]); 41217cf69bSMarshall Clow std::complex<double> t1(-imag(testcases[i]), real(testcases[i])); 425a83710eSEric Fiselier std::complex<double> z = cosh(t1); 435a83710eSEric Fiselier if (std::isnan(real(r))) 445a83710eSEric Fiselier assert(std::isnan(real(z))); 455a83710eSEric Fiselier else 465a83710eSEric Fiselier { 475a83710eSEric Fiselier assert(real(r) == real(z)); 485a83710eSEric Fiselier assert(std::signbit(real(r)) == std::signbit(real(z))); 495a83710eSEric Fiselier } 505a83710eSEric Fiselier if (std::isnan(imag(r))) 515a83710eSEric Fiselier assert(std::isnan(imag(z))); 525a83710eSEric Fiselier else 535a83710eSEric Fiselier { 545a83710eSEric Fiselier assert(imag(r) == imag(z)); 555a83710eSEric Fiselier assert(std::signbit(imag(r)) == std::signbit(imag(z))); 565a83710eSEric Fiselier } 575a83710eSEric Fiselier } 585a83710eSEric Fiselier } 595a83710eSEric Fiselier main(int,char **)602df59c50SJF Bastienint main(int, char**) 615a83710eSEric Fiselier { 625a83710eSEric Fiselier test<float>(); 635a83710eSEric Fiselier test<double>(); 645a83710eSEric Fiselier test<long double>(); 655a83710eSEric Fiselier test_edges(); 662df59c50SJF Bastien 672df59c50SJF Bastien return 0; 685a83710eSEric Fiselier } 69