Imported Upstream version 1.72.0
[platform/upstream/boost.git] / libs / multiprecision / test / test_mpc_conversions.cpp
1 ///////////////////////////////////////////////////////////////
2 //  Copyright Christopher Kormanyos 2002 - 2011.
3 //  Copyright 2011 John Maddock. Distributed under the Boost
4 //  Software License, Version 1.0. (See accompanying file
5 //  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt
6 //
7 // This work is based on an earlier work:
8 // "Algorithm 910: A Portable C++ Multiple-Precision System for Special-Function Calculations",
9 // in ACM TOMS, {VOL 37, ISSUE 4, (February 2011)} (C) ACM, 2011. http://doi.acm.org/10.1145/1916461.1916469
10
11 #ifdef _MSC_VER
12 #define _SCL_SECURE_NO_WARNINGS
13 #endif
14
15 #include <boost/detail/lightweight_test.hpp>
16 #include <boost/array.hpp>
17 #include "test.hpp"
18
19 #include <boost/multiprecision/mpc.hpp>
20 #include <boost/multiprecision/gmp.hpp>
21
22 int main()
23 {
24    using namespace boost::multiprecision;
25    //
26    // Test interconversions between GMP supported backends:
27    //
28    mpf_t  mpf;
29    mpz_t  mpz;
30    mpq_t  mpq;
31    mpfr_t mpfr;
32    mpf_init2(mpf, 100);
33    mpf_set_ui(mpf, 2u);
34    mpz_init(mpz);
35    mpz_set_ui(mpz, 2u);
36    mpq_init(mpq);
37    mpq_set_ui(mpq, 2u, 1u);
38    mpfr_init(mpfr);
39    mpfr_set_ui(mpfr, 2u, GMP_RNDN);
40
41    BOOST_TEST(mpc_complex(mpf) == 2);
42    BOOST_TEST(mpc_complex_50(mpf) == 2);
43    BOOST_TEST(mpc_complex(mpz) == 2);
44    BOOST_TEST(mpc_complex_50(mpz) == 2);
45    BOOST_TEST(mpc_complex(mpq) == 2);
46    BOOST_TEST(mpc_complex_50(mpq) == 2);
47    BOOST_TEST(mpc_complex(mpfr) == 2);
48    BOOST_TEST(mpc_complex_50(mpfr) == 2);
49
50    mpc_complex    f0;
51    mpc_complex_50 f50;
52    f0 = mpf;
53    BOOST_TEST(f0 == 2);
54    f0 = 0;
55    f0 = mpz;
56    BOOST_TEST(f0 == 2);
57    f0 = 0;
58    f0 = mpq;
59    BOOST_TEST(f0 == 2);
60    f0 = mpfr;
61    BOOST_TEST(f0 == 2);
62
63    f50 = mpf;
64    BOOST_TEST(f50 == 2);
65    f50 = 0;
66    f50 = mpz;
67    BOOST_TEST(f50 == 2);
68    f50 = 0;
69    f50 = mpq;
70    BOOST_TEST(f50 == 2);
71    f50 = mpfr;
72    BOOST_TEST(f50 == 2);
73
74    f50 = 4;
75    f0  = f50;
76    BOOST_TEST(f0 == 4);
77    f0  = 3;
78    f50 = f0;
79    BOOST_TEST(f50 == 3);
80    f50 = 4;
81    BOOST_TEST(mpc_complex(f50) == 4);
82    BOOST_TEST(mpc_complex_50(f0) == 3);
83
84    mpz_int      iz(2);
85    mpq_rational rat(2);
86    mpf_float    gf(2);
87    f50 = 3;
88    f50 = iz;
89    BOOST_TEST(f50 == 2);
90    f50 = 3;
91    f0  = iz;
92    BOOST_TEST(f0 == 2);
93    f50 = 3;
94    f0  = gf;
95    BOOST_TEST(f0 == 2);
96    BOOST_TEST(mpc_complex(iz) == 2);
97    BOOST_TEST(mpc_complex_50(iz) == 2);
98    BOOST_TEST(mpc_complex(rat) == 2);
99    BOOST_TEST(mpc_complex_50(rat) == 2);
100    BOOST_TEST(mpc_complex(gf) == 2);
101    BOOST_TEST(mpc_complex_50(gf) == 2);
102
103    //
104    // Conversions involving precision only:
105    //
106    mpc_complex::default_precision(30);
107    f50 = 2;
108    mpc_complex_100 f100(3);
109    mpc_complex     f0a(4);
110    mpc_complex     f0b(f100);
111    BOOST_TEST(f0a.precision() == 30);
112    BOOST_TEST(f0b.precision() == 100);
113    f0a = f100;
114    BOOST_TEST(f0a == 3);
115    BOOST_TEST(f0a.precision() == 100); // precision preserved on assignment
116
117    f100 = f50;
118    BOOST_TEST(f100 == 2);
119
120    f50 = static_cast<mpc_complex_50>(f100);
121
122    mpf_clear(mpf);
123    mpz_clear(mpz);
124    mpq_clear(mpq);
125    mpfr_clear(mpfr);
126
127    return boost::report_errors();
128 }