cdiv_qr.c revision 1.1.1.2 1 1.1 mrg /* mpz_cdiv_qr -- Division rounding the quotient towards +infinity. The
2 1.1 mrg remainder gets the opposite sign as the denominator.
3 1.1 mrg
4 1.1.1.2 mrg Copyright 1994, 1995, 1996, 2000, 2001, 2005, 2012 Free Software Foundation,
5 1.1.1.2 mrg Inc.
6 1.1 mrg
7 1.1 mrg This file is part of the GNU MP Library.
8 1.1 mrg
9 1.1 mrg The GNU MP Library is free software; you can redistribute it and/or modify
10 1.1 mrg it under the terms of the GNU Lesser General Public License as published by
11 1.1 mrg the Free Software Foundation; either version 3 of the License, or (at your
12 1.1 mrg option) any later version.
13 1.1 mrg
14 1.1 mrg The GNU MP Library is distributed in the hope that it will be useful, but
15 1.1 mrg WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
16 1.1 mrg or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
17 1.1 mrg License for more details.
18 1.1 mrg
19 1.1 mrg You should have received a copy of the GNU Lesser General Public License
20 1.1 mrg along with the GNU MP Library. If not, see http://www.gnu.org/licenses/. */
21 1.1 mrg
22 1.1 mrg #include "gmp.h"
23 1.1 mrg #include "gmp-impl.h"
24 1.1 mrg
25 1.1 mrg void
26 1.1 mrg mpz_cdiv_qr (mpz_ptr quot, mpz_ptr rem, mpz_srcptr dividend, mpz_srcptr divisor)
27 1.1 mrg {
28 1.1.1.2 mrg mp_size_t divisor_size = SIZ (divisor);
29 1.1 mrg mp_size_t xsize;
30 1.1 mrg mpz_t temp_divisor; /* N.B.: lives until function returns! */
31 1.1 mrg TMP_DECL;
32 1.1 mrg
33 1.1 mrg TMP_MARK;
34 1.1 mrg
35 1.1 mrg /* We need the original value of the divisor after the quotient and
36 1.1 mrg remainder have been preliminary calculated. We have to copy it to
37 1.1 mrg temporary space if it's the same variable as either QUOT or REM. */
38 1.1 mrg if (quot == divisor || rem == divisor)
39 1.1 mrg {
40 1.1 mrg MPZ_TMP_INIT (temp_divisor, ABS (divisor_size));
41 1.1 mrg mpz_set (temp_divisor, divisor);
42 1.1 mrg divisor = temp_divisor;
43 1.1 mrg }
44 1.1 mrg
45 1.1.1.2 mrg xsize = SIZ (dividend) ^ divisor_size;;
46 1.1 mrg mpz_tdiv_qr (quot, rem, dividend, divisor);
47 1.1 mrg
48 1.1.1.2 mrg if (xsize >= 0 && SIZ (rem) != 0)
49 1.1 mrg {
50 1.1 mrg mpz_add_ui (quot, quot, 1L);
51 1.1 mrg mpz_sub (rem, rem, divisor);
52 1.1 mrg }
53 1.1 mrg
54 1.1 mrg TMP_FREE;
55 1.1 mrg }
56