brintos

brintos / llvm-project-archived public Read only

0
0
Text · 3.8 KiB · 5c9574e Raw
121 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//   exp(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(exp(c) == x);26}27 28template <class T>29void30test()31{32    test(std::complex<T>(0, 0), std::complex<T>(1, 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 = exp(testcases[i]);41        if (testcases[i].real() == 0 && testcases[i].imag() == 0)42        {43            assert(r.real() == 1.0);44            assert(r.imag() == 0);45            assert(std::signbit(testcases[i].imag()) == std::signbit(r.imag()));46        }47        else if (std::isfinite(testcases[i].real()) && std::isinf(testcases[i].imag()))48        {49            assert(std::isnan(r.real()));50            assert(std::isnan(r.imag()));51        }52        else if (std::isfinite(testcases[i].real()) && std::isnan(testcases[i].imag()))53        {54            assert(std::isnan(r.real()));55            assert(std::isnan(r.imag()));56        }57        else if (std::isinf(testcases[i].real()) && testcases[i].real() > 0 && testcases[i].imag() == 0)58        {59            assert(std::isinf(r.real()));60            assert(r.real() > 0);61            assert(r.imag() == 0);62            assert(std::signbit(testcases[i].imag()) == std::signbit(r.imag()));63        }64        else if (std::isinf(testcases[i].real()) && testcases[i].real() < 0 && std::isinf(testcases[i].imag()))65        {66            assert(r.real() == 0);67            assert(r.imag() == 0);68        }69        else if (std::isinf(testcases[i].real()) && testcases[i].real() > 0 && std::isinf(testcases[i].imag()))70        {71            assert(std::isinf(r.real()));72            assert(std::isnan(r.imag()));73        }74        else if (std::isinf(testcases[i].real()) && testcases[i].real() < 0 && std::isnan(testcases[i].imag()))75        {76            assert(r.real() == 0);77            assert(r.imag() == 0);78        }79        else if (std::isinf(testcases[i].real()) && testcases[i].real() > 0 && std::isnan(testcases[i].imag()))80        {81            assert(std::isinf(r.real()));82            assert(std::isnan(r.imag()));83        }84        else if (std::isnan(testcases[i].real()) && testcases[i].imag() == 0)85        {86            assert(std::isnan(r.real()));87            assert(r.imag() == 0);88            assert(std::signbit(testcases[i].imag()) == std::signbit(r.imag()));89        }90        else if (std::isnan(testcases[i].real()) && testcases[i].imag() != 0)91        {92            assert(std::isnan(r.real()));93            assert(std::isnan(r.imag()));94        }95        else if (std::isnan(testcases[i].real()) && std::isnan(testcases[i].imag()))96        {97            assert(std::isnan(r.real()));98            assert(std::isnan(r.imag()));99        }100        else if (std::isfinite(testcases[i].imag()) && std::abs(testcases[i].imag()) <= 1)101        {102            assert(!std::signbit(r.real()));103            assert(std::signbit(r.imag()) == std::signbit(testcases[i].imag()));104        }105        else if (std::isinf(r.real()) && testcases[i].imag() == 0) {106            assert(r.imag() == 0);107            assert(std::signbit(testcases[i].imag()) == std::signbit(r.imag()));108        }109    }110}111 112int main(int, char**)113{114    test<float>();115    test<double>();116    test<long double>();117    test_edges();118 119    return 0;120}121