1#![allow(non_camel_case_types)]
2
3use derivative::Derivative;
6
7use flint_sys::deps::*;
8use flint_sys::flint::*;
9use flint_sys::fmpq::fmpq;
10use flint_sys::fmpz::fmpz;
11
12use crate::fmpr::fmpr_struct;
13use crate::mag::mag_struct;
14use libc::{c_char, c_int, FILE};
15
16#[repr(C)]
17#[derive(Debug, Copy, Clone)]
18pub struct mantissa_noptr_struct {
19 pub d: [mp_limb_t; 2usize],
20}
21
22#[repr(C)]
23#[derive(Debug, Copy, Clone)]
24pub struct mantissa_ptr_struct {
25 pub alloc: mp_size_t,
26 pub d: mp_ptr,
27}
28
29#[repr(C)]
30#[derive(Copy, Clone)]
31pub union mantissa_struct {
32 pub noptr: mantissa_noptr_struct,
33 pub ptr: mantissa_ptr_struct,
34}
35
36#[repr(C)]
37#[derive(Copy, Clone, Derivative)]
38#[derivative(Debug)]
39pub struct arf_struct {
40 pub exp: fmpz,
41 pub size: mp_size_t,
42 #[derivative(Debug="ignore")]
43 pub d: mantissa_struct,
44}
45
46pub type arf_t = [arf_struct; 1usize];
47pub type arf_ptr = *mut arf_struct;
48pub type arf_srcptr = *const arf_struct;
49
50extern "C" {
51 pub fn arf_rounds_down(rnd: c_int, sgnbit: c_int) -> c_int;
52 pub fn arf_rounds_up(rnd: c_int, sgnbit: c_int) -> c_int;
53 pub fn arf_rnd_to_mpfr(rnd: c_int) -> mpfr_rnd_t;
54 pub fn _arf_promote(x: *mut arf_struct, n: mp_size_t);
55 pub fn _arf_demote(x: *mut arf_struct);
56 pub fn arf_init(x: *mut arf_struct);
57 pub fn arf_clear(x: *mut arf_struct);
58 pub fn arf_zero(x: *mut arf_struct);
59 pub fn arf_pos_inf(x: *mut arf_struct);
60 pub fn arf_neg_inf(x: *mut arf_struct);
61 pub fn arf_nan(x: *mut arf_struct);
62 pub fn arf_is_special(x: *const arf_struct) -> c_int;
63 pub fn arf_is_zero(x: *const arf_struct) -> c_int;
64 pub fn arf_is_pos_inf(x: *const arf_struct) -> c_int;
65 pub fn arf_is_neg_inf(x: *const arf_struct) -> c_int;
66 pub fn arf_is_nan(x: *const arf_struct) -> c_int;
67 pub fn arf_is_normal(x: *const arf_struct) -> c_int;
68 pub fn arf_is_finite(x: *const arf_struct) -> c_int;
69 pub fn arf_is_inf(x: *const arf_struct) -> c_int;
70 pub fn arf_one(x: *mut arf_struct);
71 pub fn arf_is_one(x: *const arf_struct) -> c_int;
72 pub fn arf_sgn(x: *const arf_struct) -> c_int;
73 pub fn arf_cmp(x: *const arf_struct, y: *const arf_struct) -> c_int;
74 pub fn arf_cmpabs(x: *const arf_struct, y: *const arf_struct) -> c_int;
75 pub fn arf_cmpabs_ui(x: *const arf_struct, y: mp_limb_t) -> c_int;
76 pub fn arf_cmpabs_d(x: *const arf_struct, y: f64) -> c_int;
77 pub fn arf_cmp_si(x: *const arf_struct, y: mp_limb_signed_t) -> c_int;
78 pub fn arf_cmp_ui(x: *const arf_struct, y: mp_limb_t) -> c_int;
79 pub fn arf_cmp_d(x: *const arf_struct, y: f64) -> c_int;
80 pub fn arf_swap(y: *mut arf_struct, x: *mut arf_struct);
81 pub fn arf_set(y: *mut arf_struct, x: *const arf_struct);
82 pub fn arf_neg(y: *mut arf_struct, x: *const arf_struct);
83 pub fn arf_init_set_ui(x: *mut arf_struct, v: mp_limb_t);
84 pub fn arf_init_set_si(x: *mut arf_struct, v: mp_limb_signed_t);
85 pub fn arf_set_ui(x: *mut arf_struct, v: mp_limb_t);
86 pub fn arf_set_si(x: *mut arf_struct, v: mp_limb_signed_t);
87 pub fn arf_init_set_shallow(z: *mut arf_struct, x: *const arf_struct);
88 pub fn arf_init_neg_shallow(z: *mut arf_struct, x: *const arf_struct);
89 pub fn arf_init_set_mag_shallow(y: *mut arf_struct, x: *const mag_struct);
90 pub fn arf_init_neg_mag_shallow(z: *mut arf_struct, x: *const mag_struct);
91 pub fn arf_cmpabs_mag(x: *const arf_struct, y: *const mag_struct) -> c_int;
92 pub fn arf_mag_cmpabs(x: *const mag_struct, y: *const arf_struct) -> c_int;
93 pub fn arf_set_mpn(y: *mut arf_struct, x: mp_srcptr, xn: mp_size_t, sgnbit: c_int);
94 pub fn arf_set_mpz(y: *mut arf_struct, x: *const __mpz_struct);
95 pub fn arf_set_fmpz(y: *mut arf_struct, x: *const fmpz);
96 pub fn _arf_set_round_ui(
97 x: *mut arf_struct,
98 v: mp_limb_t,
99 sgnbit: c_int,
100 prec: mp_limb_signed_t,
101 rnd: c_int,
102 ) -> c_int;
103 pub fn _arf_set_round_uiui(
104 z: *mut arf_struct,
105 fix: *mut mp_limb_signed_t,
106 hi: mp_limb_t,
107 lo: mp_limb_t,
108 sgnbit: c_int,
109 prec: mp_limb_signed_t,
110 rnd: c_int,
111 ) -> c_int;
112 pub fn _arf_set_round_mpn(
113 y: *mut arf_struct,
114 exp_shift: *mut mp_limb_signed_t,
115 x: mp_srcptr,
116 xn: mp_size_t,
117 sgnbit: c_int,
118 prec: mp_limb_signed_t,
119 rnd: c_int,
120 ) -> c_int;
121 pub fn arf_set_round_ui(
122 x: *mut arf_struct,
123 v: mp_limb_t,
124 prec: mp_limb_signed_t,
125 rnd: c_int,
126 ) -> c_int;
127 pub fn arf_set_round_si(
128 x: *mut arf_struct,
129 v: mp_limb_signed_t,
130 prec: mp_limb_signed_t,
131 rnd: c_int,
132 ) -> c_int;
133 pub fn arf_set_round_mpz(
134 y: *mut arf_struct,
135 x: *const __mpz_struct,
136 prec: mp_limb_signed_t,
137 rnd: c_int,
138 ) -> c_int;
139 pub fn arf_set_round_fmpz(
140 y: *mut arf_struct,
141 x: *const fmpz,
142 prec: mp_limb_signed_t,
143 rnd: c_int,
144 ) -> c_int;
145 pub fn arf_set_round(
146 y: *mut arf_struct,
147 x: *const arf_struct,
148 prec: mp_limb_signed_t,
149 rnd: c_int,
150 ) -> c_int;
151 pub fn arf_neg_round(
152 y: *mut arf_struct,
153 x: *const arf_struct,
154 prec: mp_limb_signed_t,
155 rnd: c_int,
156 ) -> c_int;
157 pub fn arf_get_fmpr(y: *mut fmpr_struct, x: *const arf_struct);
158 pub fn arf_set_fmpr(y: *mut arf_struct, x: *const fmpr_struct);
159 pub fn arf_get_mpfr(x: *mut __mpfr_struct, y: *const arf_struct, rnd: mpfr_rnd_t) -> c_int;
160 pub fn arf_set_mpfr(x: *mut arf_struct, y: *const __mpfr_struct);
161 pub fn arf_equal(x: *const arf_struct, y: *const arf_struct) -> c_int;
162 pub fn arf_equal_si(x: *const arf_struct, y: mp_limb_signed_t) -> c_int;
163 pub fn arf_min(z: *mut arf_struct, a: *const arf_struct, b: *const arf_struct);
164 pub fn arf_max(z: *mut arf_struct, a: *const arf_struct, b: *const arf_struct);
165 pub fn arf_abs(y: *mut arf_struct, x: *const arf_struct);
166 pub fn arf_bits(x: *const arf_struct) -> mp_limb_signed_t;
167 pub fn arf_bot(e: *mut fmpz, x: *const arf_struct);
168 pub fn arf_is_int(x: *const arf_struct) -> c_int;
169 pub fn arf_is_int_2exp_si(x: *const arf_struct, e: mp_limb_signed_t) -> c_int;
170 pub fn arf_cmp_2exp_si(x: *const arf_struct, e: mp_limb_signed_t) -> c_int;
171 pub fn arf_cmpabs_2exp_si(x: *const arf_struct, e: mp_limb_signed_t) -> c_int;
172 pub fn arf_set_si_2exp_si(x: *mut arf_struct, man: mp_limb_signed_t, exp: mp_limb_signed_t);
173 pub fn arf_set_ui_2exp_si(x: *mut arf_struct, man: mp_limb_t, exp: mp_limb_signed_t);
174 pub fn arf_mul_2exp_si(y: *mut arf_struct, x: *const arf_struct, e: mp_limb_signed_t);
175 pub fn arf_mul_2exp_fmpz(y: *mut arf_struct, x: *const arf_struct, e: *const fmpz);
176 pub fn arf_set_round_fmpz_2exp(
177 y: *mut arf_struct,
178 x: *const fmpz,
179 exp: *const fmpz,
180 prec: mp_limb_signed_t,
181 rnd: c_int,
182 ) -> c_int;
183 pub fn arf_abs_bound_lt_2exp_fmpz(b: *mut fmpz, x: *const arf_struct);
184 pub fn arf_abs_bound_le_2exp_fmpz(b: *mut fmpz, x: *const arf_struct);
185 pub fn arf_abs_bound_lt_2exp_si(x: *const arf_struct) -> mp_limb_signed_t;
186 pub fn arf_frexp(man: *mut arf_struct, exp: *mut fmpz, x: *const arf_struct);
187 pub fn arf_get_fmpz_2exp(man: *mut fmpz, exp: *mut fmpz, x: *const arf_struct);
188 pub fn _arf_get_integer_mpn(
189 y: mp_ptr,
190 x: mp_srcptr,
191 xn: mp_size_t,
192 exp: mp_limb_signed_t,
193 ) -> c_int;
194 pub fn _arf_set_mpn_fixed(
195 z: *mut arf_struct,
196 xp: mp_srcptr,
197 xn: mp_size_t,
198 fixn: mp_size_t,
199 negative: c_int,
200 prec: mp_limb_signed_t,
201 rnd: c_int,
202 ) -> c_int;
203 pub fn arf_get_fmpz(z: *mut fmpz, x: *const arf_struct, rnd: c_int) -> c_int;
204 pub fn arf_get_si(x: *const arf_struct, rnd: c_int) -> mp_limb_signed_t;
205 pub fn arf_get_fmpz_fixed_fmpz(y: *mut fmpz, x: *const arf_struct, e: *const fmpz) -> c_int;
206 pub fn arf_get_fmpz_fixed_si(y: *mut fmpz, x: *const arf_struct, e: mp_limb_signed_t) -> c_int;
207 pub fn arf_set_fmpz_2exp(x: *mut arf_struct, man: *const fmpz, exp: *const fmpz);
208 pub fn arf_floor(z: *mut arf_struct, x: *const arf_struct);
209 pub fn arf_ceil(z: *mut arf_struct, x: *const arf_struct);
210 pub fn arf_debug(x: *const arf_struct);
211 pub fn arf_fprint(file: *mut FILE, x: *const arf_struct);
212 pub fn arf_fprintd(file: *mut FILE, y: *const arf_struct, d: mp_limb_signed_t);
213 pub fn arf_print(x: *const arf_struct);
214 pub fn arf_printd(y: *const arf_struct, d: mp_limb_signed_t);
215 pub fn arf_randtest(
216 x: *mut arf_struct,
217 state: *mut flint_rand_s,
218 bits: mp_limb_signed_t,
219 mag_bits: mp_limb_signed_t,
220 );
221 pub fn arf_randtest_not_zero(
222 x: *mut arf_struct,
223 state: *mut flint_rand_s,
224 bits: mp_limb_signed_t,
225 mag_bits: mp_limb_signed_t,
226 );
227 pub fn arf_randtest_special(
228 x: *mut arf_struct,
229 state: *mut flint_rand_s,
230 bits: mp_limb_signed_t,
231 mag_bits: mp_limb_signed_t,
232 );
233 pub fn arf_urandom(
234 x: *mut arf_struct,
235 state: *mut flint_rand_s,
236 bits: mp_limb_signed_t,
237 rnd: c_int,
238 );
239 pub static mut __arf_mul_tmp: mp_ptr;
240 pub static mut __arf_mul_alloc: mp_limb_signed_t;
241 pub fn _arf_mul_tmp_cleanup();
242 pub fn arf_mul_special(z: *mut arf_struct, x: *const arf_struct, y: *const arf_struct);
243 pub fn arf_mul_via_mpfr(
244 z: *mut arf_struct,
245 x: *const arf_struct,
246 y: *const arf_struct,
247 prec: mp_limb_signed_t,
248 rnd: c_int,
249 ) -> c_int;
250 pub fn arf_mul_rnd_any(
251 z: arf_ptr,
252 x: arf_srcptr,
253 y: arf_srcptr,
254 prec: mp_limb_signed_t,
255 rnd: c_int,
256 ) -> c_int;
257 pub fn arf_mul_rnd_down(
258 z: arf_ptr,
259 x: arf_srcptr,
260 y: arf_srcptr,
261 prec: mp_limb_signed_t,
262 ) -> c_int;
263 pub fn arf_neg_mul(
264 z: *mut arf_struct,
265 x: *const arf_struct,
266 y: *const arf_struct,
267 prec: mp_limb_signed_t,
268 rnd: c_int,
269 ) -> c_int;
270 pub fn arf_mul_ui(
271 z: arf_ptr,
272 x: arf_srcptr,
273 y: mp_limb_t,
274 prec: mp_limb_signed_t,
275 rnd: c_int,
276 ) -> c_int;
277 pub fn arf_mul_si(
278 z: arf_ptr,
279 x: arf_srcptr,
280 y: mp_limb_signed_t,
281 prec: mp_limb_signed_t,
282 rnd: c_int,
283 ) -> c_int;
284 pub fn arf_mul_mpz(
285 z: arf_ptr,
286 x: arf_srcptr,
287 y: *const __mpz_struct,
288 prec: mp_limb_signed_t,
289 rnd: c_int,
290 ) -> c_int;
291 pub fn arf_mul_fmpz(
292 z: arf_ptr,
293 x: arf_srcptr,
294 y: *const fmpz,
295 prec: mp_limb_signed_t,
296 rnd: c_int,
297 ) -> c_int;
298 pub static mut __arf_add_tmp: mp_ptr;
299 pub static mut __arf_add_alloc: mp_limb_signed_t;
300 pub fn _arf_add_tmp_cleanup();
301 pub fn _arf_add_mpn(
302 z: *mut arf_struct,
303 xp: mp_srcptr,
304 xn: mp_size_t,
305 xsgnbit: c_int,
306 xexp: *const fmpz,
307 yp: mp_srcptr,
308 yn: mp_size_t,
309 ysgnbit: c_int,
310 shift: mp_limb_t,
311 prec: mp_limb_signed_t,
312 rnd: c_int,
313 ) -> c_int;
314 pub fn arf_add(
315 z: arf_ptr,
316 x: arf_srcptr,
317 y: arf_srcptr,
318 prec: mp_limb_signed_t,
319 rnd: c_int,
320 ) -> c_int;
321 pub fn arf_add_si(
322 z: arf_ptr,
323 x: arf_srcptr,
324 y: mp_limb_signed_t,
325 prec: mp_limb_signed_t,
326 rnd: c_int,
327 ) -> c_int;
328 pub fn arf_add_ui(
329 z: arf_ptr,
330 x: arf_srcptr,
331 y: mp_limb_t,
332 prec: mp_limb_signed_t,
333 rnd: c_int,
334 ) -> c_int;
335 pub fn arf_add_fmpz(
336 z: arf_ptr,
337 x: arf_srcptr,
338 y: *const fmpz,
339 prec: mp_limb_signed_t,
340 rnd: c_int,
341 ) -> c_int;
342 pub fn arf_add_fmpz_2exp(
343 z: arf_ptr,
344 x: arf_srcptr,
345 y: *const fmpz,
346 exp: *const fmpz,
347 prec: mp_limb_signed_t,
348 rnd: c_int,
349 ) -> c_int;
350 pub fn arf_sub(
351 z: arf_ptr,
352 x: arf_srcptr,
353 y: arf_srcptr,
354 prec: mp_limb_signed_t,
355 rnd: c_int,
356 ) -> c_int;
357 pub fn arf_sub_si(
358 z: arf_ptr,
359 x: arf_srcptr,
360 y: mp_limb_signed_t,
361 prec: mp_limb_signed_t,
362 rnd: c_int,
363 ) -> c_int;
364 pub fn arf_sub_ui(
365 z: arf_ptr,
366 x: arf_srcptr,
367 y: mp_limb_t,
368 prec: mp_limb_signed_t,
369 rnd: c_int,
370 ) -> c_int;
371 pub fn arf_sub_fmpz(
372 z: arf_ptr,
373 x: arf_srcptr,
374 y: *const fmpz,
375 prec: mp_limb_signed_t,
376 rnd: c_int,
377 ) -> c_int;
378 pub fn arf_addmul(
379 z: arf_ptr,
380 x: arf_srcptr,
381 y: arf_srcptr,
382 prec: mp_limb_signed_t,
383 rnd: c_int,
384 ) -> c_int;
385 pub fn arf_addmul_ui(
386 z: arf_ptr,
387 x: arf_srcptr,
388 y: mp_limb_t,
389 prec: mp_limb_signed_t,
390 rnd: c_int,
391 ) -> c_int;
392 pub fn arf_addmul_si(
393 z: arf_ptr,
394 x: arf_srcptr,
395 y: mp_limb_signed_t,
396 prec: mp_limb_signed_t,
397 rnd: c_int,
398 ) -> c_int;
399 pub fn arf_addmul_mpz(
400 z: arf_ptr,
401 x: arf_srcptr,
402 y: *const __mpz_struct,
403 prec: mp_limb_signed_t,
404 rnd: c_int,
405 ) -> c_int;
406 pub fn arf_addmul_fmpz(
407 z: arf_ptr,
408 x: arf_srcptr,
409 y: *const fmpz,
410 prec: mp_limb_signed_t,
411 rnd: c_int,
412 ) -> c_int;
413 pub fn arf_submul(
414 z: arf_ptr,
415 x: arf_srcptr,
416 y: arf_srcptr,
417 prec: mp_limb_signed_t,
418 rnd: c_int,
419 ) -> c_int;
420 pub fn arf_submul_ui(
421 z: arf_ptr,
422 x: arf_srcptr,
423 y: mp_limb_t,
424 prec: mp_limb_signed_t,
425 rnd: c_int,
426 ) -> c_int;
427 pub fn arf_submul_si(
428 z: arf_ptr,
429 x: arf_srcptr,
430 y: mp_limb_signed_t,
431 prec: mp_limb_signed_t,
432 rnd: c_int,
433 ) -> c_int;
434 pub fn arf_submul_mpz(
435 z: arf_ptr,
436 x: arf_srcptr,
437 y: *const __mpz_struct,
438 prec: mp_limb_signed_t,
439 rnd: c_int,
440 ) -> c_int;
441 pub fn arf_submul_fmpz(
442 z: arf_ptr,
443 x: arf_srcptr,
444 y: *const fmpz,
445 prec: mp_limb_signed_t,
446 rnd: c_int,
447 ) -> c_int;
448 pub fn arf_sosq(
449 z: *mut arf_struct,
450 x: *const arf_struct,
451 y: *const arf_struct,
452 prec: mp_limb_signed_t,
453 rnd: c_int,
454 ) -> c_int;
455 pub fn arf_div(
456 z: arf_ptr,
457 x: arf_srcptr,
458 y: arf_srcptr,
459 prec: mp_limb_signed_t,
460 rnd: c_int,
461 ) -> c_int;
462 pub fn arf_div_ui(
463 z: arf_ptr,
464 x: arf_srcptr,
465 y: mp_limb_t,
466 prec: mp_limb_signed_t,
467 rnd: c_int,
468 ) -> c_int;
469 pub fn arf_ui_div(
470 z: arf_ptr,
471 x: mp_limb_t,
472 y: arf_srcptr,
473 prec: mp_limb_signed_t,
474 rnd: c_int,
475 ) -> c_int;
476 pub fn arf_div_si(
477 z: arf_ptr,
478 x: arf_srcptr,
479 y: mp_limb_signed_t,
480 prec: mp_limb_signed_t,
481 rnd: c_int,
482 ) -> c_int;
483 pub fn arf_si_div(
484 z: arf_ptr,
485 x: mp_limb_signed_t,
486 y: arf_srcptr,
487 prec: mp_limb_signed_t,
488 rnd: c_int,
489 ) -> c_int;
490 pub fn arf_div_fmpz(
491 z: arf_ptr,
492 x: arf_srcptr,
493 y: *const fmpz,
494 prec: mp_limb_signed_t,
495 rnd: c_int,
496 ) -> c_int;
497 pub fn arf_fmpz_div(
498 z: arf_ptr,
499 x: *const fmpz,
500 y: arf_srcptr,
501 prec: mp_limb_signed_t,
502 rnd: c_int,
503 ) -> c_int;
504 pub fn arf_fmpz_div_fmpz(
505 z: arf_ptr,
506 x: *const fmpz,
507 y: *const fmpz,
508 prec: mp_limb_signed_t,
509 rnd: c_int,
510 ) -> c_int;
511 pub fn arf_sqrt(z: arf_ptr, x: arf_srcptr, prec: mp_limb_signed_t, rnd: c_int) -> c_int;
512 pub fn arf_sqrt_ui(
513 z: *mut arf_struct,
514 x: mp_limb_t,
515 prec: mp_limb_signed_t,
516 rnd: c_int,
517 ) -> c_int;
518 pub fn arf_sqrt_fmpz(
519 z: *mut arf_struct,
520 x: *const fmpz,
521 prec: mp_limb_signed_t,
522 rnd: c_int,
523 ) -> c_int;
524 pub fn arf_rsqrt(z: arf_ptr, x: arf_srcptr, prec: mp_limb_signed_t, rnd: c_int) -> c_int;
525 pub fn arf_root(
526 z: *mut arf_struct,
527 x: *const arf_struct,
528 k: mp_limb_t,
529 prec: mp_limb_signed_t,
530 rnd: c_int,
531 ) -> c_int;
532 pub fn arf_get_mag(y: *mut mag_struct, x: *const arf_struct);
533 pub fn arf_get_mag_lower(y: *mut mag_struct, x: *const arf_struct);
534 pub fn arf_set_mag(y: *mut arf_struct, x: *const mag_struct);
535 pub fn mag_init_set_arf(y: *mut mag_struct, x: *const arf_struct);
536 pub fn mag_fast_init_set_arf(y: *mut mag_struct, x: *const arf_struct);
537 pub fn arf_mag_fast_add_ulp(
538 z: *mut mag_struct,
539 x: *const mag_struct,
540 y: *const arf_struct,
541 prec: mp_limb_signed_t,
542 );
543 pub fn arf_mag_add_ulp(
544 z: *mut mag_struct,
545 x: *const mag_struct,
546 y: *const arf_struct,
547 prec: mp_limb_signed_t,
548 );
549 pub fn arf_mag_set_ulp(z: *mut mag_struct, y: *const arf_struct, prec: mp_limb_signed_t);
550 pub fn arf_get_fmpq(y: *mut fmpq, x: *const arf_struct);
551 pub fn arf_set_fmpq(
552 y: *mut arf_struct,
553 x: *const fmpq,
554 prec: mp_limb_signed_t,
555 rnd: c_int,
556 ) -> c_int;
557 pub fn arf_complex_mul(
558 e: *mut arf_struct,
559 f: *mut arf_struct,
560 a: *const arf_struct,
561 b: *const arf_struct,
562 c: *const arf_struct,
563 d: *const arf_struct,
564 prec: mp_limb_signed_t,
565 rnd: c_int,
566 ) -> c_int;
567 pub fn arf_complex_mul_fallback(
568 e: *mut arf_struct,
569 f: *mut arf_struct,
570 a: *const arf_struct,
571 b: *const arf_struct,
572 c: *const arf_struct,
573 d: *const arf_struct,
574 prec: mp_limb_signed_t,
575 rnd: c_int,
576 ) -> c_int;
577 pub fn arf_complex_sqr(
578 e: *mut arf_struct,
579 f: *mut arf_struct,
580 a: *const arf_struct,
581 b: *const arf_struct,
582 prec: mp_limb_signed_t,
583 rnd: c_int,
584 ) -> c_int;
585 pub fn arf_sum(
586 s: *mut arf_struct,
587 terms: arf_srcptr,
588 len: mp_limb_signed_t,
589 prec: mp_limb_signed_t,
590 rnd: c_int,
591 ) -> c_int;
592 pub fn arf_get_d(x: *const arf_struct, rnd: c_int) -> f64;
593 pub fn arf_set_d(x: *mut arf_struct, v: f64);
594 pub fn arf_allocated_bytes(x: *const arf_struct) -> mp_limb_signed_t;
595 pub fn arf_get_str(x: *const arf_struct, n: mp_limb_signed_t) -> *mut c_char;
596 pub fn arf_load_str(res: *mut arf_struct, data: *const c_char) -> c_int;
597 pub fn arf_dump_str(x: *const arf_struct) -> *mut c_char;
598 pub fn arf_load_file(res: *mut arf_struct, stream: *mut FILE) -> c_int;
599 pub fn arf_dump_file(stream: *mut FILE, x: *const arf_struct) -> c_int;
600}
601
602#[inline]
605pub unsafe fn arf_mul(
606 z: arf_ptr,
607 x: arf_srcptr,
608 y: arf_srcptr,
609 prec: mp_limb_signed_t,
610 rnd: c_int) -> c_int
611{
612 if rnd == crate::FMPR_RND_DOWN {
613 arf_mul_rnd_down(z, x, y, prec)
614 } else {
615 arf_mul_rnd_any(z, x, y, prec, rnd)
616 }
617}
618
619#[cfg(test)]
620mod tests {
621 use super::*;
622 use std::mem::MaybeUninit;
623 use libc::c_long;
624 use quickcheck::quickcheck;
625
626 quickcheck! {
627 fn test_arf_mul(x_int: c_int, y_int: c_int) -> bool {
628 let mut x = MaybeUninit::uninit();
629 let mut y = MaybeUninit::uninit();
630 let mut z = MaybeUninit::uninit();
631
632 unsafe {
633 let x_long = x_int as c_long;
634 let y_long = y_int as c_long;
635
636 arf_init_set_si(x.as_mut_ptr(), x_long);
637 arf_init_set_si(y.as_mut_ptr(), y_long);
638 arf_init(z.as_mut_ptr());
639
640 arf_mul(z.as_mut_ptr(), x.as_ptr(), y.as_ptr(), 130, crate::ARF_RND_NEAR);
641 let res = arf_equal_si(z.as_ptr(), x_long*y_long);
642
643 arf_clear(x.as_mut_ptr());
644 arf_clear(y.as_mut_ptr());
645 arf_clear(z.as_mut_ptr());
646
647 res != 0
648 }
649 }
650 }
651}