/////////////////////////////////////////////////////////////////////////////// // Copyright 2024 Matt Borland. Distributed under the Boost // Software License, Version 1.0. (See accompanying file // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) #include #include #include #include #include #include #include #include #include using namespace boost::multiprecision; template void test_construction() { using std::complex; using std::polar; using complex_scalar = decltype(polar(T(), T())); std::cerr << typeid(complex_scalar).name() << std::endl; complex_scalar v {}; BOOST_TEST_EQ(v.real(), T{0}); BOOST_TEST_EQ(v.imag(), T{0}); complex_scalar v1 {T{1}}; BOOST_TEST_EQ(v1.real(), T{1}); BOOST_TEST_EQ(v1.imag(), T{0}); complex_scalar v2 {T{2}, T{2}}; BOOST_TEST_EQ(v2.real(), T{2}); BOOST_TEST_EQ(v2.imag(), T{2}); } template void test_unary_operators() { using std::complex; using std::polar; using complex_scalar = decltype(polar(T(), T())); const complex_scalar val {T{2}, T{-2}}; complex_scalar pos_val = +val; BOOST_TEST_EQ(val.real(), pos_val.real()); BOOST_TEST_EQ(val.imag(), pos_val.imag()); complex_scalar neg_val = -val; BOOST_TEST_EQ(neg_val.real(), T{-2}); BOOST_TEST_EQ(neg_val.imag(), T{2}); } template void test_addition() { using std::complex; using std::polar; using complex_scalar = decltype(polar(T(), T())); complex_scalar lhs_1 {T{1}, T{1}}; complex_scalar rhs_1 {T{2}, T{2}}; complex_scalar res_1 = lhs_1 + rhs_1; BOOST_TEST_EQ(res_1.real(), T{3}); BOOST_TEST_EQ(res_1.real(), T{3}); } template void test_subtraction() { using std::complex; using std::polar; using complex_scalar = decltype(polar(T(), T())); complex_scalar lhs_1 {T{1}, T{1}}; complex_scalar rhs_1 {T{2}, T{2}}; complex_scalar res_1 = lhs_1 - rhs_1; BOOST_TEST_EQ(res_1.real(), T{-1}); BOOST_TEST_EQ(res_1.real(), T{-1}); } template void test_multiplication() { using std::complex; using std::polar; using complex_scalar = decltype(polar(T(), T())); complex_scalar lhs_1 {T{-3}, T{3}}; complex_scalar rhs_1 {T{2}, T{2}}; complex_scalar res_1 = lhs_1 * rhs_1; BOOST_TEST_EQ(res_1.real(), T{-12}); BOOST_TEST_EQ(res_1.imag(), T{0}); } template void test_equality() { using std::complex; using std::polar; using complex_scalar = decltype(polar(T(), T())); complex_scalar lhs {T{2}, T{-1}}; complex_scalar rhs {T{2}, T{1}}; BOOST_TEST(lhs != rhs); BOOST_TEST(!(lhs == rhs)); T scalar_rhs {T{2}}; BOOST_TEST(lhs != scalar_rhs); BOOST_TEST(!(lhs == scalar_rhs)); lhs = complex_scalar{T{2}, T{0}}; BOOST_TEST(lhs == scalar_rhs); BOOST_TEST(!(lhs != scalar_rhs)); } template void test_non_member_real_imag() { using std::complex; using std::polar; using std::real; using complex_scalar = decltype(polar(T(), T())); complex_scalar lhs {T{2}, T{-1}}; BOOST_TEST_EQ(real(lhs), lhs.real()); BOOST_TEST_EQ(imag(lhs), lhs.imag()); } template void test_abs() { using std::complex; using std::polar; using std::abs; using complex_scalar = decltype(polar(T(), T())); complex_scalar lhs {T{1}, T{1}}; BOOST_TEST_EQ(abs(lhs), sqrt(T{2})); } template bool test_equal(T lhs, T rhs, int tol = 10) noexcept { using std::fabs; return fabs(lhs - rhs) < static_cast(tol) * std::numeric_limits::epsilon(); } template void test_arg() { using std::complex; using std::polar; using std::arg; using boost::math::constants::pi; using boost::math::constants::half_pi; using complex_scalar = decltype(polar(T(), T())); BOOST_TEST(test_equal(arg(complex_scalar{T{1}, T{0}}), T{0})); BOOST_TEST(test_equal(arg(complex_scalar{T{0}, T{0}}), T{0})); BOOST_TEST(test_equal(arg(complex_scalar{T{0}, T{1}}), half_pi())); BOOST_TEST(test_equal(arg(complex_scalar{T{-1}, T{0}}), pi())); } int main() { test_construction(); test_construction(); test_construction(); test_construction(); test_unary_operators(); test_unary_operators(); test_unary_operators(); test_unary_operators(); test_addition(); test_addition(); test_addition(); test_addition(); test_subtraction(); test_subtraction(); test_subtraction(); test_subtraction(); test_multiplication(); test_multiplication(); test_multiplication(); test_multiplication(); test_equality(); test_equality(); test_equality(); test_equality(); test_non_member_real_imag(); test_non_member_real_imag(); test_non_member_real_imag(); test_non_member_real_imag(); test_abs(); test_abs(); test_abs(); test_abs(); test_arg(); test_arg(); test_arg(); test_arg(); return boost::report_errors(); }