brintos

brintos / llvm-project-archived public Read only

0
0
Text · 4.8 KiB · 424a3b1 Raw
153 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//   acosh(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(acosh(c) == x);26}27 28template <class T>29void30test()31{32    test(std::complex<T>(INFINITY, 1), std::complex<T>(INFINITY, 0));33}34 35void test_edges()36{37    const double pi = std::atan2(+0., -0.);38    const unsigned N = sizeof(testcases) / sizeof(testcases[0]);39    for (unsigned i = 0; i < N; ++i)40    {41        std::complex<double> r = acosh(testcases[i]);42        if (testcases[i].real() == 0 && testcases[i].imag() == 0)43        {44            assert(!std::signbit(r.real()));45            if (std::signbit(testcases[i].imag()))46                is_about(r.imag(), -pi/2);47            else48                is_about(r.imag(),  pi/2);49        }50        else if (testcases[i].real() == 1 && testcases[i].imag() == 0)51        {52            assert(r.real() == 0);53            assert(!std::signbit(r.real()));54            assert(r.imag() == 0);55            assert(std::signbit(r.imag()) == std::signbit(testcases[i].imag()));56        }57        else if (testcases[i].real() == -1 && testcases[i].imag() == 0)58        {59            assert(r.real() == 0);60            assert(!std::signbit(r.real()));61            if (std::signbit(testcases[i].imag()))62                is_about(r.imag(), -pi);63            else64                is_about(r.imag(),  pi);65        }66        else if (std::isfinite(testcases[i].real()) && std::isinf(testcases[i].imag()))67        {68            assert(std::isinf(r.real()));69            assert(r.real() > 0);70            if (std::signbit(testcases[i].imag()))71                is_about(r.imag(), -pi/2);72            else73                is_about(r.imag(),  pi/2);74        }75        else if (std::isfinite(testcases[i].real()) && std::isnan(testcases[i].imag()))76        {77            assert(std::isnan(r.real()));78            assert(std::isnan(r.imag()));79        }80        else if (std::isinf(testcases[i].real()) && testcases[i].real() < 0 && std::isfinite(testcases[i].imag()))81        {82            assert(std::isinf(r.real()));83            assert(r.real() > 0);84            if (std::signbit(testcases[i].imag()))85                is_about(r.imag(), -pi);86            else87                is_about(r.imag(),  pi);88        }89        else if (std::isinf(testcases[i].real()) && testcases[i].real() > 0 && std::isfinite(testcases[i].imag()))90        {91            assert(std::isinf(r.real()));92            assert(r.real() > 0);93            assert(r.imag() == 0);94            assert(std::signbit(r.imag()) == std::signbit(testcases[i].imag()));95        }96        else if (std::isinf(testcases[i].real()) && testcases[i].real() < 0 && std::isinf(testcases[i].imag()))97        {98            assert(std::isinf(r.real()));99            assert(r.real() > 0);100            if (std::signbit(testcases[i].imag()))101                is_about(r.imag(), -0.75 * pi);102            else103                is_about(r.imag(),  0.75 * pi);104        }105        else if (std::isinf(testcases[i].real()) && testcases[i].real() > 0 && std::isinf(testcases[i].imag()))106        {107            assert(std::isinf(r.real()));108            assert(r.real() > 0);109            if (std::signbit(testcases[i].imag()))110                is_about(r.imag(), -0.25 * pi);111            else112                is_about(r.imag(),  0.25 * pi);113        }114        else if (std::isinf(testcases[i].real()) && std::isnan(testcases[i].imag()))115        {116            assert(std::isinf(r.real()));117            assert(r.real() > 0);118            assert(std::isnan(r.imag()));119        }120        else if (std::isnan(testcases[i].real()) && std::isfinite(testcases[i].imag()))121        {122            assert(std::isnan(r.real()));123            assert(std::isnan(r.imag()));124        }125        else if (std::isnan(testcases[i].real()) && std::isinf(testcases[i].imag()))126        {127            assert(std::isinf(r.real()));128            assert(r.real() > 0);129            assert(std::isnan(r.imag()));130        }131        else if (std::isnan(testcases[i].real()) && std::isnan(testcases[i].imag()))132        {133            assert(std::isnan(r.real()));134            assert(std::isnan(r.imag()));135        }136        else137        {138            assert(!std::signbit(r.real()));139            assert(std::signbit(r.imag()) == std::signbit(testcases[i].imag()));140        }141    }142}143 144int main(int, char**)145{146    test<float>();147    test<double>();148    test<long double>();149    test_edges();150 151  return 0;152}153