]>
Commit | Line | Data |
---|---|---|
7c673cae FG |
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 | |
92f5a8d4 | 5 | // LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt |
7c673cae FG |
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 | |
92f5a8d4 | 12 | #define _SCL_SECURE_NO_WARNINGS |
7c673cae FG |
13 | #endif |
14 | ||
15 | #include <boost/detail/lightweight_test.hpp> | |
16 | #include <boost/array.hpp> | |
17 | #include "test.hpp" | |
18 | ||
19 | #include <boost/multiprecision/gmp.hpp> | |
20 | ||
21 | int main() | |
22 | { | |
23 | using namespace boost::multiprecision; | |
24 | // | |
25 | // Test interconversions between GMP supported backends: | |
26 | // | |
27 | mpf_t mpf; | |
28 | mpz_t mpz; | |
29 | mpq_t mpq; | |
30 | mpf_init2(mpf, 100); | |
31 | mpf_set_ui(mpf, 2u); | |
32 | mpz_init(mpz); | |
33 | mpz_set_ui(mpz, 2u); | |
34 | mpq_init(mpq); | |
35 | mpq_set_ui(mpq, 2u, 1u); | |
36 | ||
37 | BOOST_TEST(mpf_float(mpf) == 2); | |
38 | BOOST_TEST(mpf_float_50(mpf) == 2); | |
39 | BOOST_TEST(mpf_float(mpz) == 2); | |
40 | BOOST_TEST(mpf_float_50(mpz) == 2); | |
41 | BOOST_TEST(mpf_float(mpq) == 2); | |
42 | BOOST_TEST(mpf_float_50(mpq) == 2); | |
43 | ||
92f5a8d4 | 44 | mpf_float f0; |
7c673cae FG |
45 | mpf_float_50 f50; |
46 | f0 = mpf; | |
47 | BOOST_TEST(f0 == 2); | |
48 | f0 = 0; | |
49 | f0 = mpz; | |
50 | BOOST_TEST(f0 == 2); | |
51 | f0 = 0; | |
52 | f0 = mpq; | |
53 | BOOST_TEST(f0 == 2); | |
54 | ||
55 | f50 = mpf; | |
56 | BOOST_TEST(f50 == 2); | |
57 | f50 = 0; | |
58 | f50 = mpz; | |
59 | BOOST_TEST(f50 == 2); | |
60 | f50 = 0; | |
61 | f50 = mpq; | |
62 | BOOST_TEST(f50 == 2); | |
63 | ||
64 | f50 = 4; | |
92f5a8d4 | 65 | f0 = f50; |
7c673cae | 66 | BOOST_TEST(f0 == 4); |
92f5a8d4 | 67 | f0 = 3; |
7c673cae FG |
68 | f50 = f0; |
69 | BOOST_TEST(f50 == 3); | |
70 | f50 = 4; | |
71 | BOOST_TEST(mpf_float(f50) == 4); | |
72 | BOOST_TEST(mpf_float_50(f0) == 3); | |
73 | ||
92f5a8d4 | 74 | mpz_int iz(2); |
7c673cae FG |
75 | mpq_rational rat(2); |
76 | f50 = iz; | |
77 | BOOST_TEST(f50 == 2); | |
78 | f0 = iz; | |
79 | BOOST_TEST(f0 == 2); | |
80 | BOOST_TEST(mpf_float(iz) == 2); | |
81 | BOOST_TEST(mpf_float_50(iz) == 2); | |
82 | BOOST_TEST(mpf_float(rat) == 2); | |
83 | BOOST_TEST(mpf_float_50(rat) == 2); | |
84 | ||
85 | BOOST_TEST(mpz_int(mpf) == 2); | |
86 | BOOST_TEST(mpz_int(mpz) == 2); | |
87 | BOOST_TEST(mpz_int(mpq) == 2); | |
88 | iz = 3; | |
92f5a8d4 | 89 | iz = mpz_int(mpf); // explicit conversion only |
7c673cae FG |
90 | BOOST_TEST(iz == 2); |
91 | iz = 3; | |
92 | iz = mpz; | |
93 | BOOST_TEST(iz == 2); | |
94 | iz = 4; | |
92f5a8d4 | 95 | iz = mpz_int(mpq); // explicit conversion only |
7c673cae | 96 | BOOST_TEST(iz == 2); |
92f5a8d4 | 97 | f0 = 2; |
7c673cae FG |
98 | f50 = 2; |
99 | ||
100 | BOOST_TEST(mpz_int(f0) == 2); | |
101 | BOOST_TEST(mpz_int(f50) == 2); | |
102 | rat = 2; | |
103 | BOOST_TEST(mpz_int(rat) == 2); | |
104 | iz = 3; | |
105 | iz = static_cast<mpz_int>(f0); | |
106 | BOOST_TEST(iz == 2); | |
107 | iz = 3; | |
108 | iz = static_cast<mpz_int>(f50); | |
109 | BOOST_TEST(iz == 2); | |
110 | iz = 3; | |
111 | iz = static_cast<mpz_int>(rat); | |
112 | BOOST_TEST(iz == 2); | |
113 | ||
114 | BOOST_TEST(mpq_rational(mpz) == 2); | |
115 | BOOST_TEST(mpq_rational(mpq) == 2); | |
116 | BOOST_TEST(mpq_rational(iz) == 2); | |
117 | rat = 3; | |
118 | rat = mpz; | |
119 | BOOST_TEST(rat == 2); | |
120 | rat = 3; | |
121 | rat = mpq; | |
122 | BOOST_TEST(rat == 2); | |
123 | rat = 3; | |
124 | rat = iz; | |
125 | BOOST_TEST(rat == 2); | |
126 | ||
127 | iz = numerator(rat); | |
128 | BOOST_TEST(iz == 2); | |
129 | iz = denominator(rat); | |
130 | BOOST_TEST(iz == 1); | |
f67539c2 TL |
131 | // |
132 | // Conversion to floating point types | |
133 | // see https://github.com/boostorg/multiprecision/issues/178 | |
134 | // | |
135 | rat = 3; | |
136 | rat /= 4; | |
137 | BOOST_TEST(rat.convert_to<float>() == 0.75); | |
138 | BOOST_TEST(rat.convert_to<double>() == 0.75); | |
139 | BOOST_TEST(rat.convert_to<long double>() == 0.75); | |
140 | #ifdef BOOST_HAS_FLOAT128 | |
141 | BOOST_TEST(rat.convert_to<__float128>() == 0.75); | |
142 | #endif | |
7c673cae FG |
143 | |
144 | // | |
145 | // Conversions involving precision only, | |
146 | // note that mpf_t precisions are only approximate: | |
147 | // | |
148 | mpf_float::default_precision(30); | |
149 | f50 = 2; | |
92f5a8d4 TL |
150 | mpf_float_100 f100(3); |
151 | mpf_float f0a(4); | |
152 | mpf_float f0b(f100); | |
7c673cae FG |
153 | BOOST_TEST(f0a.precision() >= 30); |
154 | BOOST_TEST(f0b.precision() >= 100); | |
155 | f0a = f100; | |
156 | BOOST_TEST(f0a == 3); | |
157 | BOOST_TEST(f0a.precision() >= 100); | |
158 | ||
159 | f100 = f50; | |
160 | BOOST_TEST(f100 == 2); | |
92f5a8d4 | 161 | |
7c673cae FG |
162 | mpf_clear(mpf); |
163 | mpz_clear(mpz); | |
164 | mpq_clear(mpq); | |
165 | ||
166 | return boost::report_errors(); | |
167 | } |