//===----------------------------------------------------------------------===// // // The LLVM Compiler Infrastructure // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// // // template // complex // polar(const T& rho, const T& theta = 0); #include #include #include "../cases.h" template void test(const T& rho, std::complex x) { assert(std::polar(rho) == x); } template void test(const T& rho, const T& theta, std::complex x) { assert(std::polar(rho, theta) == x); } template void test() { test(T(0), std::complex(0, 0)); test(T(1), std::complex(1, 0)); test(T(100), std::complex(100, 0)); test(T(0), T(0), std::complex(0, 0)); test(T(1), T(0), std::complex(1, 0)); test(T(100), T(0), std::complex(100, 0)); } void test_edges() { const unsigned N = sizeof(x) / sizeof(x[0]); for (unsigned i = 0; i < N; ++i) { double r = real(x[i]); double theta = imag(x[i]); std::complex z = std::polar(r, theta); switch (classify(r)) { case zero: if (std::signbit(r) || classify(theta) == inf || classify(theta) == NaN) { int c = classify(z); assert(c == NaN || c == non_zero_nan); } else { assert(z == std::complex()); } break; case non_zero: if (std::signbit(r) || classify(theta) == inf || classify(theta) == NaN) { int c = classify(z); assert(c == NaN || c == non_zero_nan); } else { is_about(std::abs(z), r); } break; case inf: if (r < 0) { int c = classify(z); assert(c == NaN || c == non_zero_nan); } else { assert(classify(z) == inf); if (classify(theta) != NaN && classify(theta) != inf) { assert(classify(real(z)) != NaN); assert(classify(imag(z)) != NaN); } } break; case NaN: case non_zero_nan: { int c = classify(z); assert(c == NaN || c == non_zero_nan); } break; } } } int main() { test(); test(); test(); test_edges(); }