120 lines · cpp
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-exception6//7//===----------------------------------------------------------------------===//8 9// <complex>10 11// template<class T>12// complex<T>13// sinh(const complex<T>& x);14 15#include <complex>16#include <cassert>17 18#include "test_macros.h"19#include "../cases.h"20 21template <class T>22void23test(const std::complex<T>& c, std::complex<T> x)24{25 assert(sinh(c) == x);26}27 28template <class T>29void30test()31{32 test(std::complex<T>(0, 0), std::complex<T>(0, 0));33}34 35void test_edges()36{37 const unsigned N = sizeof(testcases) / sizeof(testcases[0]);38 for (unsigned i = 0; i < N; ++i)39 {40 std::complex<double> r = sinh(testcases[i]);41 if (testcases[i].real() == 0 && testcases[i].imag() == 0)42 {43 assert(r.real() == 0);44 assert(std::signbit(r.real()) == std::signbit(testcases[i].real()));45 assert(r.imag() == 0);46 assert(std::signbit(r.imag()) == std::signbit(testcases[i].imag()));47 }48 else if (testcases[i].real() == 0 && std::isinf(testcases[i].imag()))49 {50 assert(r.real() == 0);51 assert(std::isnan(r.imag()));52 }53 else if (std::isfinite(testcases[i].real()) && std::isinf(testcases[i].imag()))54 {55 assert(std::isnan(r.real()));56 assert(std::isnan(r.imag()));57 }58 else if (testcases[i].real() == 0 && std::isnan(testcases[i].imag()))59 {60 assert(r.real() == 0);61 assert(std::isnan(r.imag()));62 }63 else if (std::isfinite(testcases[i].real()) && std::isnan(testcases[i].imag()))64 {65 assert(std::isnan(r.real()));66 assert(std::isnan(r.imag()));67 }68 else if (std::isinf(testcases[i].real()) && testcases[i].imag() == 0)69 {70 assert(std::isinf(r.real()));71 assert(std::signbit(r.real()) == std::signbit(testcases[i].real()));72 assert(r.imag() == 0);73 assert(std::signbit(r.imag()) == std::signbit(testcases[i].imag()));74 }75 else if (std::isinf(testcases[i].real()) && std::isfinite(testcases[i].imag()))76 {77 assert(std::isinf(r.real()));78 assert(std::signbit(r.real()) == std::signbit(testcases[i].real() * cos(testcases[i].imag())));79 assert(std::isinf(r.imag()));80 assert(std::signbit(r.imag()) == std::signbit(sin(testcases[i].imag())));81 }82 else if (std::isinf(testcases[i].real()) && std::isinf(testcases[i].imag()))83 {84 assert(std::isinf(r.real()));85 assert(std::isnan(r.imag()));86 }87 else if (std::isinf(testcases[i].real()) && std::isnan(testcases[i].imag()))88 {89 assert(std::isinf(r.real()));90 assert(std::isnan(r.imag()));91 }92 else if (std::isnan(testcases[i].real()) && testcases[i].imag() == 0)93 {94 assert(std::isnan(r.real()));95 assert(r.imag() == 0);96 assert(std::signbit(r.imag()) == std::signbit(testcases[i].imag()));97 }98 else if (std::isnan(testcases[i].real()) && std::isfinite(testcases[i].imag()))99 {100 assert(std::isnan(r.real()));101 assert(std::isnan(r.imag()));102 }103 else if (std::isnan(testcases[i].real()) && std::isnan(testcases[i].imag()))104 {105 assert(std::isnan(r.real()));106 assert(std::isnan(r.imag()));107 }108 }109}110 111int main(int, char**)112{113 test<float>();114 test<double>();115 test<long double>();116 test_edges();117 118 return 0;119}120