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