brintos

brintos / llvm-project-archived public Read only

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