brintos

brintos / llvm-project-archived public Read only

0
0
Text · 4.8 KiB · 3158a3b Raw
142 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//   acos(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(acos(c) == x);26}27 28template <class T>29void30test()31{32    test(std::complex<T>(INFINITY, 1), std::complex<T>(0, -INFINITY));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 = acos(testcases[i]);42        if (testcases[i].real() == 0 && testcases[i].imag() == 0)43        {44            is_about(r.real(), pi/2);45            assert(r.imag() == 0);46            assert(std::signbit(testcases[i].imag()) != std::signbit(r.imag()));47        }48        else if (testcases[i].real() == 0 && std::isnan(testcases[i].imag()))49        {50            is_about(r.real(), pi/2);51            assert(std::isnan(r.imag()));52        }53        else if (std::isfinite(testcases[i].real()) && std::isinf(testcases[i].imag()))54        {55            is_about(r.real(), pi/2);56            assert(std::isinf(r.imag()));57            assert(std::signbit(testcases[i].imag()) != std::signbit(r.imag()));58        }59        else if (std::isfinite(testcases[i].real()) && testcases[i].real() != 0 && std::isnan(testcases[i].imag()))60        {61            assert(std::isnan(r.real()));62            assert(std::isnan(r.imag()));63        }64        else if (std::isinf(testcases[i].real()) && testcases[i].real() < 0 && std::isfinite(testcases[i].imag()))65        {66            is_about(r.real(), pi);67            assert(std::isinf(r.imag()));68            assert(std::signbit(testcases[i].imag()) != std::signbit(r.imag()));69        }70        else if (std::isinf(testcases[i].real()) && testcases[i].real() > 0 && std::isfinite(testcases[i].imag()))71        {72            assert(r.real() == 0);73            assert(!std::signbit(r.real()));74            assert(std::isinf(r.imag()));75            assert(std::signbit(testcases[i].imag()) != std::signbit(r.imag()));76        }77        else if (std::isinf(testcases[i].real()) && testcases[i].real() < 0 && std::isinf(testcases[i].imag()))78        {79            is_about(r.real(), 0.75 * pi);80            assert(std::isinf(r.imag()));81            assert(std::signbit(testcases[i].imag()) != std::signbit(r.imag()));82        }83        else if (std::isinf(testcases[i].real()) && testcases[i].real() > 0 && std::isinf(testcases[i].imag()))84        {85            is_about(r.real(), 0.25 * pi);86            assert(std::isinf(r.imag()));87            assert(std::signbit(testcases[i].imag()) != std::signbit(r.imag()));88        }89        else if (std::isinf(testcases[i].real()) && std::isnan(testcases[i].imag()))90        {91            assert(std::isnan(r.real()));92            assert(std::isinf(r.imag()));93        }94        else if (std::isnan(testcases[i].real()) && std::isfinite(testcases[i].imag()))95        {96            assert(std::isnan(r.real()));97            assert(std::isnan(r.imag()));98        }99        else if (std::isnan(testcases[i].real()) && std::isinf(testcases[i].imag()))100        {101            assert(std::isnan(r.real()));102            assert(std::isinf(r.imag()));103            assert(std::signbit(testcases[i].imag()) != std::signbit(r.imag()));104        }105        else if (std::isnan(testcases[i].real()) && std::isnan(testcases[i].imag()))106        {107            assert(std::isnan(r.real()));108            assert(std::isnan(r.imag()));109        }110        else if (!std::signbit(testcases[i].real()) && !std::signbit(testcases[i].imag()))111        {112            assert(!std::signbit(r.real()));113            assert( std::signbit(r.imag()));114        }115        else if (std::signbit(testcases[i].real()) && !std::signbit(testcases[i].imag()))116        {117            assert(!std::signbit(r.real()));118            assert( std::signbit(r.imag()));119        }120        else if (std::signbit(testcases[i].real()) && std::signbit(testcases[i].imag()))121        {122            assert(!std::signbit(r.real()));123            assert(!std::signbit(r.imag()));124        }125        else if (!std::signbit(testcases[i].real()) && std::signbit(testcases[i].imag()))126        {127            assert(!std::signbit(r.real()));128            assert(!std::signbit(r.imag()));129        }130    }131}132 133int main(int, char**)134{135    test<float>();136    test<double>();137    test<long double>();138    test_edges();139 140  return 0;141}142