1 /* mpq_inv(dest,src) -- invert a rational number, i.e. set DEST to SRC
2 with the numerator and denominator swapped.
4 Copyright 1991, 1994, 1995, 2000, 2001 Free Software Foundation, Inc.
6 This file is part of the GNU MP Library.
8 The GNU MP Library is free software; you can redistribute it and/or modify
9 it under the terms of the GNU Lesser General Public License as published by
10 the Free Software Foundation; either version 3 of the License, or (at your
11 option) any later version.
13 The GNU MP Library is distributed in the hope that it will be useful, but
14 WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
15 or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
16 License for more details.
18 You should have received a copy of the GNU Lesser General Public License
19 along with the GNU MP Library. If not, see http://www.gnu.org/licenses/. */
25 mpq_inv (MP_RAT
*dest
, const MP_RAT
*src
)
27 mp_size_t num_size
= src
->_mp_num
._mp_size
;
28 mp_size_t den_size
= src
->_mp_den
._mp_size
;
38 dest
->_mp_den
._mp_size
= num_size
;
39 dest
->_mp_num
._mp_size
= den_size
;
41 /* If dest == src we may just swap the numerator and denominator, but
42 we have to ensure the new denominator is positive. */
46 mp_size_t alloc
= dest
->_mp_num
._mp_alloc
;
47 mp_ptr limb_ptr
= dest
->_mp_num
._mp_d
;
49 dest
->_mp_num
._mp_alloc
= dest
->_mp_den
._mp_alloc
;
50 dest
->_mp_num
._mp_d
= dest
->_mp_den
._mp_d
;
52 dest
->_mp_den
._mp_alloc
= alloc
;
53 dest
->_mp_den
._mp_d
= limb_ptr
;
57 den_size
= ABS (den_size
);
58 if (dest
->_mp_num
._mp_alloc
< den_size
)
59 _mpz_realloc (&(dest
->_mp_num
), den_size
);
61 if (dest
->_mp_den
._mp_alloc
< num_size
)
62 _mpz_realloc (&(dest
->_mp_den
), num_size
);
64 MPN_COPY (dest
->_mp_num
._mp_d
, src
->_mp_den
._mp_d
, den_size
);
65 MPN_COPY (dest
->_mp_den
._mp_d
, src
->_mp_num
._mp_d
, num_size
);