]> git.proxmox.com Git - ceph.git/blob - ceph/src/boost/libs/math/tools/rational_tests.cpp
update ceph source to reef 18.1.2
[ceph.git] / ceph / src / boost / libs / math / tools / rational_tests.cpp
1 // (C) Copyright John Maddock 2007.
2 // Use, modification and distribution are subject to the
3 // Boost Software License, Version 1.0. (See accompanying file
4 // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
5
6 #include "mp_t.hpp"
7 #include <boost/random.hpp>
8 #include <boost/math/tools/rational.hpp>
9 #include <iostream>
10 #include <fstream>
11
12 int main()
13 {
14 using namespace boost::math;
15 using namespace boost::math::tools;
16
17 std::cout << std::scientific << std::setprecision(40);
18
19 boost::mt19937 rnd;
20 boost::variate_generator<
21 boost::mt19937,
22 boost::uniform_int<> > gen(rnd, boost::uniform_int<>(1, 12));
23
24 for(unsigned i = 1; i < 12; ++i)
25 {
26 std::vector<int> coef;
27 for(unsigned j = 0; j < i; ++j)
28 {
29 coef.push_back(gen());
30 }
31 std::cout <<
32 " //\n"
33 " // Polynomials of order " << i-1 << "\n"
34 " //\n"
35 " static const U n" << i << "c[" << i << "] = { ";
36 for(unsigned j = 0; j < i; ++j)
37 {
38 if(j)
39 std::cout << ", ";
40 std::cout << coef[j];
41 }
42 std::cout << " };\n";
43 std::cout <<
44 " static const std::array<U, " << i << "> n" << i << "a = { ";
45 for(unsigned j = 0; j < i; ++j)
46 {
47 if(j)
48 std::cout << ", ";
49 std::cout << coef[j];
50 }
51 std::cout << " };\n";
52
53 mp_t r1 = boost::math::tools::evaluate_polynomial(&coef[0], mp_t(0.125), i);
54 mp_t r2 = boost::math::tools::evaluate_polynomial(&coef[0], mp_t(0.25), i);
55 mp_t r3 = boost::math::tools::evaluate_polynomial(&coef[0], mp_t(0.75), i);
56 mp_t r4 = boost::math::tools::evaluate_polynomial(&coef[0], mp_t(1) - mp_t(1) / 64, i);
57
58 std::cout <<
59 " BOOST_CHECK_CLOSE(\n"
60 " boost::math::tools::evaluate_polynomial(n" << i << "c, static_cast<T>(0.125), " << i << "),\n"
61 " static_cast<T>(" << r1 << "L),\n"
62 " tolerance);\n";
63 std::cout <<
64 " BOOST_CHECK_CLOSE(\n"
65 " boost::math::tools::evaluate_polynomial(n" << i << "c, static_cast<T>(0.25), " << i << "),\n"
66 " static_cast<T>(" << r2 << "L),\n"
67 " tolerance);\n";
68 std::cout <<
69 " BOOST_CHECK_CLOSE(\n"
70 " boost::math::tools::evaluate_polynomial(n" << i << "c, static_cast<T>(0.75), " << i << "),\n"
71 " static_cast<T>(" << r3 << "L),\n"
72 " tolerance);\n";
73 std::cout <<
74 " BOOST_CHECK_CLOSE(\n"
75 " boost::math::tools::evaluate_polynomial(n" << i << "c, static_cast<T>(1.0f - 1.0f/64.0f), " << i << "),\n"
76 " static_cast<T>(" << r4 << "L),\n"
77 " tolerance);\n\n";
78
79 std::cout <<
80 " BOOST_CHECK_CLOSE(\n"
81 " boost::math::tools::evaluate_polynomial(n" << i << "c, static_cast<T>(0.125)),\n"
82 " static_cast<T>(" << r1 << "L),\n"
83 " tolerance);\n";
84 std::cout <<
85 " BOOST_CHECK_CLOSE(\n"
86 " boost::math::tools::evaluate_polynomial(n" << i << "c, static_cast<T>(0.25)),\n"
87 " static_cast<T>(" << r2 << "L),\n"
88 " tolerance);\n";
89 std::cout <<
90 " BOOST_CHECK_CLOSE(\n"
91 " boost::math::tools::evaluate_polynomial(n" << i << "c, static_cast<T>(0.75)),\n"
92 " static_cast<T>(" << r3 << "L),\n"
93 " tolerance);\n";
94 std::cout <<
95 " BOOST_CHECK_CLOSE(\n"
96 " boost::math::tools::evaluate_polynomial(n" << i << "c, static_cast<T>(1.0f - 1.0f/64.0f)),\n"
97 " static_cast<T>(" << r4 << "L),\n"
98 " tolerance);\n\n";
99
100 std::cout <<
101 " BOOST_CHECK_CLOSE(\n"
102 " boost::math::tools::evaluate_polynomial(n" << i << "a, static_cast<T>(0.125)),\n"
103 " static_cast<T>(" << r1 << "L),\n"
104 " tolerance);\n";
105 std::cout <<
106 " BOOST_CHECK_CLOSE(\n"
107 " boost::math::tools::evaluate_polynomial(n" << i << "a, static_cast<T>(0.25)),\n"
108 " static_cast<T>(" << r2 << "L),\n"
109 " tolerance);\n";
110 std::cout <<
111 " BOOST_CHECK_CLOSE(\n"
112 " boost::math::tools::evaluate_polynomial(n" << i << "a, static_cast<T>(0.75)),\n"
113 " static_cast<T>(" << r3 << "L),\n"
114 " tolerance);\n";
115 std::cout <<
116 " BOOST_CHECK_CLOSE(\n"
117 " boost::math::tools::evaluate_polynomial(n" << i << "a, static_cast<T>(1.0f - 1.0f/64.0f)),\n"
118 " static_cast<T>(" << r4 << "L),\n"
119 " tolerance);\n\n";
120
121 r1 = boost::math::tools::evaluate_even_polynomial(&coef[0], mp_t(0.125), i);
122 r2 = boost::math::tools::evaluate_even_polynomial(&coef[0], mp_t(0.25), i);
123 r3 = boost::math::tools::evaluate_even_polynomial(&coef[0], mp_t(0.75), i);
124 r4 = boost::math::tools::evaluate_even_polynomial(&coef[0], mp_t(1) - mp_t(1) / 64, i);
125
126 std::cout <<
127 " BOOST_CHECK_CLOSE(\n"
128 " boost::math::tools::evaluate_even_polynomial(n" << i << "c, static_cast<T>(0.125), " << i << "),\n"
129 " static_cast<T>(" << r1 << "L),\n"
130 " tolerance);\n";
131 std::cout <<
132 " BOOST_CHECK_CLOSE(\n"
133 " boost::math::tools::evaluate_even_polynomial(n" << i << "c, static_cast<T>(0.25), " << i << "),\n"
134 " static_cast<T>(" << r2 << "L),\n"
135 " tolerance);\n";
136 std::cout <<
137 " BOOST_CHECK_CLOSE(\n"
138 " boost::math::tools::evaluate_even_polynomial(n" << i << "c, static_cast<T>(0.75), " << i << "),\n"
139 " static_cast<T>(" << r3 << "L),\n"
140 " tolerance);\n";
141 std::cout <<
142 " BOOST_CHECK_CLOSE(\n"
143 " boost::math::tools::evaluate_even_polynomial(n" << i << "c, static_cast<T>(1.0f - 1.0f/64.0f), " << i << "),\n"
144 " static_cast<T>(" << r4 << "L),\n"
145 " tolerance);\n\n";
146
147 std::cout <<
148 " BOOST_CHECK_CLOSE(\n"
149 " boost::math::tools::evaluate_even_polynomial(n" << i << "c, static_cast<T>(0.125)),\n"
150 " static_cast<T>(" << r1 << "L),\n"
151 " tolerance);\n";
152 std::cout <<
153 " BOOST_CHECK_CLOSE(\n"
154 " boost::math::tools::evaluate_even_polynomial(n" << i << "c, static_cast<T>(0.25)),\n"
155 " static_cast<T>(" << r2 << "L),\n"
156 " tolerance);\n";
157 std::cout <<
158 " BOOST_CHECK_CLOSE(\n"
159 " boost::math::tools::evaluate_even_polynomial(n" << i << "c, static_cast<T>(0.75)),\n"
160 " static_cast<T>(" << r3 << "L),\n"
161 " tolerance);\n";
162 std::cout <<
163 " BOOST_CHECK_CLOSE(\n"
164 " boost::math::tools::evaluate_even_polynomial(n" << i << "c, static_cast<T>(1.0f - 1.0f/64.0f)),\n"
165 " static_cast<T>(" << r4 << "L),\n"
166 " tolerance);\n\n";
167
168 std::cout <<
169 " BOOST_CHECK_CLOSE(\n"
170 " boost::math::tools::evaluate_even_polynomial(n" << i << "a, static_cast<T>(0.125)),\n"
171 " static_cast<T>(" << r1 << "L),\n"
172 " tolerance);\n";
173 std::cout <<
174 " BOOST_CHECK_CLOSE(\n"
175 " boost::math::tools::evaluate_even_polynomial(n" << i << "a, static_cast<T>(0.25)),\n"
176 " static_cast<T>(" << r2 << "L),\n"
177 " tolerance);\n";
178 std::cout <<
179 " BOOST_CHECK_CLOSE(\n"
180 " boost::math::tools::evaluate_even_polynomial(n" << i << "a, static_cast<T>(0.75)),\n"
181 " static_cast<T>(" << r3 << "L),\n"
182 " tolerance);\n";
183 std::cout <<
184 " BOOST_CHECK_CLOSE(\n"
185 " boost::math::tools::evaluate_even_polynomial(n" << i << "a, static_cast<T>(1.0f - 1.0f/64.0f)),\n"
186 " static_cast<T>(" << r4 << "L),\n"
187 " tolerance);\n\n";
188
189 if(i > 1)
190 {
191 r1 = boost::math::tools::evaluate_odd_polynomial(&coef[0], mp_t(0.125), i);
192 r2 = boost::math::tools::evaluate_odd_polynomial(&coef[0], mp_t(0.25), i);
193 r3 = boost::math::tools::evaluate_odd_polynomial(&coef[0], mp_t(0.75), i);
194 r4 = boost::math::tools::evaluate_odd_polynomial(&coef[0], mp_t(1) - mp_t(1) / 64, i);
195
196 std::cout <<
197 " BOOST_CHECK_CLOSE(\n"
198 " boost::math::tools::evaluate_odd_polynomial(n" << i << "c, static_cast<T>(0.125), " << i << "),\n"
199 " static_cast<T>(" << r1 << "L),\n"
200 " tolerance);\n";
201 std::cout <<
202 " BOOST_CHECK_CLOSE(\n"
203 " boost::math::tools::evaluate_odd_polynomial(n" << i << "c, static_cast<T>(0.25), " << i << "),\n"
204 " static_cast<T>(" << r2 << "L),\n"
205 " tolerance);\n";
206 std::cout <<
207 " BOOST_CHECK_CLOSE(\n"
208 " boost::math::tools::evaluate_odd_polynomial(n" << i << "c, static_cast<T>(0.75), " << i << "),\n"
209 " static_cast<T>(" << r3 << "L),\n"
210 " tolerance);\n";
211 std::cout <<
212 " BOOST_CHECK_CLOSE(\n"
213 " boost::math::tools::evaluate_odd_polynomial(n" << i << "c, static_cast<T>(1.0f - 1.0f/64.0f), " << i << "),\n"
214 " static_cast<T>(" << r4 << "L),\n"
215 " tolerance);\n\n";
216
217 std::cout <<
218 " BOOST_CHECK_CLOSE(\n"
219 " boost::math::tools::evaluate_odd_polynomial(n" << i << "c, static_cast<T>(0.125)),\n"
220 " static_cast<T>(" << r1 << "L),\n"
221 " tolerance);\n";
222 std::cout <<
223 " BOOST_CHECK_CLOSE(\n"
224 " boost::math::tools::evaluate_odd_polynomial(n" << i << "c, static_cast<T>(0.25)),\n"
225 " static_cast<T>(" << r2 << "L),\n"
226 " tolerance);\n";
227 std::cout <<
228 " BOOST_CHECK_CLOSE(\n"
229 " boost::math::tools::evaluate_odd_polynomial(n" << i << "c, static_cast<T>(0.75)),\n"
230 " static_cast<T>(" << r3 << "L),\n"
231 " tolerance);\n";
232 std::cout <<
233 " BOOST_CHECK_CLOSE(\n"
234 " boost::math::tools::evaluate_odd_polynomial(n" << i << "c, static_cast<T>(1.0f - 1.0f/64.0f)),\n"
235 " static_cast<T>(" << r4 << "L),\n"
236 " tolerance);\n\n";
237
238 std::cout <<
239 " BOOST_CHECK_CLOSE(\n"
240 " boost::math::tools::evaluate_odd_polynomial(n" << i << "a, static_cast<T>(0.125)),\n"
241 " static_cast<T>(" << r1 << "L),\n"
242 " tolerance);\n";
243 std::cout <<
244 " BOOST_CHECK_CLOSE(\n"
245 " boost::math::tools::evaluate_odd_polynomial(n" << i << "a, static_cast<T>(0.25)),\n"
246 " static_cast<T>(" << r2 << "L),\n"
247 " tolerance);\n";
248 std::cout <<
249 " BOOST_CHECK_CLOSE(\n"
250 " boost::math::tools::evaluate_odd_polynomial(n" << i << "a, static_cast<T>(0.75)),\n"
251 " static_cast<T>(" << r3 << "L),\n"
252 " tolerance);\n";
253 std::cout <<
254 " BOOST_CHECK_CLOSE(\n"
255 " boost::math::tools::evaluate_odd_polynomial(n" << i << "a, static_cast<T>(1.0f - 1.0f/64.0f)),\n"
256 " static_cast<T>(" << r4 << "L),\n"
257 " tolerance);\n\n";
258 }
259
260 r1 = boost::math::tools::evaluate_polynomial(&coef[0], mp_t(0.125), i);
261 r2 = boost::math::tools::evaluate_polynomial(&coef[0], mp_t(0.25), i);
262 r3 = boost::math::tools::evaluate_polynomial(&coef[0], mp_t(0.75), i);
263 r4 = boost::math::tools::evaluate_polynomial(&coef[0], mp_t(1) - mp_t(1) / 64, i);
264
265 coef.clear();
266 for(unsigned j = 0; j < i; ++j)
267 {
268 coef.push_back(gen());
269 }
270 std::cout <<
271 " //\n"
272 " // Rational functions of order " << i-1 << "\n"
273 " //\n"
274 " static const U d" << i << "c[" << i << "] = { ";
275 for(unsigned j = 0; j < i; ++j)
276 {
277 if(j)
278 std::cout << ", ";
279 std::cout << coef[j];
280 }
281 std::cout << " };\n";
282 std::cout <<
283 " static const std::array<U, " << i << "> d" << i << "a = { ";
284 for(unsigned j = 0; j < i; ++j)
285 {
286 if(j)
287 std::cout << ", ";
288 std::cout << coef[j];
289 }
290 std::cout << " };\n";
291
292 mp_t r1d = boost::math::tools::evaluate_polynomial(&coef[0], mp_t(0.125), i);
293 mp_t r2d = boost::math::tools::evaluate_polynomial(&coef[0], mp_t(0.25), i);
294 mp_t r3d = boost::math::tools::evaluate_polynomial(&coef[0], mp_t(0.75), i);
295 mp_t r4d = boost::math::tools::evaluate_polynomial(&coef[0], mp_t(1) - mp_t(1) / 64, i);
296
297 std::cout <<
298 " BOOST_CHECK_CLOSE(\n"
299 " boost::math::tools::evaluate_rational(n" << i << "c, d" << i << "c, static_cast<T>(0.125), " << i << "),\n"
300 " static_cast<T>(" << r1/r1d << "L),\n"
301 " tolerance);\n";
302 std::cout <<
303 " BOOST_CHECK_CLOSE(\n"
304 " boost::math::tools::evaluate_rational(n" << i << "c, d" << i << "c, static_cast<T>(0.25), " << i << "),\n"
305 " static_cast<T>(" << r2/r2d << "L),\n"
306 " tolerance);\n";
307 std::cout <<
308 " BOOST_CHECK_CLOSE(\n"
309 " boost::math::tools::evaluate_rational(n" << i << "c, d" << i << "c, static_cast<T>(0.75), " << i << "),\n"
310 " static_cast<T>(" << r3/r3d << "L),\n"
311 " tolerance);\n";
312 std::cout <<
313 " BOOST_CHECK_CLOSE(\n"
314 " boost::math::tools::evaluate_rational(n" << i << "c, d" << i << "c, static_cast<T>(1.0f - 1.0f/64.0f), " << i << "),\n"
315 " static_cast<T>(" << r4/r4d << "L),\n"
316 " tolerance);\n\n";
317
318 std::cout <<
319 " BOOST_CHECK_CLOSE(\n"
320 " boost::math::tools::evaluate_rational(n" << i << "c, d" << i << "c, static_cast<T>(0.125)),\n"
321 " static_cast<T>(" << r1/r1d << "L),\n"
322 " tolerance);\n";
323 std::cout <<
324 " BOOST_CHECK_CLOSE(\n"
325 " boost::math::tools::evaluate_rational(n" << i << "c, d" << i << "c, static_cast<T>(0.25)),\n"
326 " static_cast<T>(" << r2/r2d << "L),\n"
327 " tolerance);\n";
328 std::cout <<
329 " BOOST_CHECK_CLOSE(\n"
330 " boost::math::tools::evaluate_rational(n" << i << "c, d" << i << "c, static_cast<T>(0.75)),\n"
331 " static_cast<T>(" << r3/r3d << "L),\n"
332 " tolerance);\n";
333 std::cout <<
334 " BOOST_CHECK_CLOSE(\n"
335 " boost::math::tools::evaluate_rational(n" << i << "c, d" << i << "c, static_cast<T>(1.0f - 1.0f/64.0f)),\n"
336 " static_cast<T>(" << r4/r4d << "L),\n"
337 " tolerance);\n\n";
338
339 std::cout <<
340 " BOOST_CHECK_CLOSE(\n"
341 " boost::math::tools::evaluate_rational(n" << i << "a, d" << i << "a, static_cast<T>(0.125)),\n"
342 " static_cast<T>(" << r1/r1d << "L),\n"
343 " tolerance);\n";
344 std::cout <<
345 " BOOST_CHECK_CLOSE(\n"
346 " boost::math::tools::evaluate_rational(n" << i << "a, d" << i << "a, static_cast<T>(0.25)),\n"
347 " static_cast<T>(" << r2/r2d << "L),\n"
348 " tolerance);\n";
349 std::cout <<
350 " BOOST_CHECK_CLOSE(\n"
351 " boost::math::tools::evaluate_rational(n" << i << "a, d" << i << "a, static_cast<T>(0.75)),\n"
352 " static_cast<T>(" << r3/r3d << "L),\n"
353 " tolerance);\n";
354 std::cout <<
355 " BOOST_CHECK_CLOSE(\n"
356 " boost::math::tools::evaluate_rational(n" << i << "a, d" << i << "a, static_cast<T>(1.0f - 1.0f/64.0f)),\n"
357 " static_cast<T>(" << r4/r4d << "L),\n"
358 " tolerance);\n\n";
359 }
360
361 return 0;
362 }
363
364
365