154028e53SJohn Marino /* mpq_set_si(dest,ulong_num,ulong_den) -- Set DEST to the rational number
24b6a78b7SSimon Schubert ULONG_NUM/ULONG_DEN.
34b6a78b7SSimon Schubert
44b6a78b7SSimon Schubert Copyright 1991, 1994, 1995, 2001, 2003 Free Software Foundation, Inc.
54b6a78b7SSimon Schubert
64b6a78b7SSimon Schubert This file is part of the GNU MP Library.
74b6a78b7SSimon Schubert
84b6a78b7SSimon Schubert The GNU MP Library is free software; you can redistribute it and/or modify
94b6a78b7SSimon Schubert it under the terms of the GNU Lesser General Public License as published by
104b6a78b7SSimon Schubert the Free Software Foundation; either version 3 of the License, or (at your
114b6a78b7SSimon Schubert option) any later version.
124b6a78b7SSimon Schubert
134b6a78b7SSimon Schubert The GNU MP Library is distributed in the hope that it will be useful, but
144b6a78b7SSimon Schubert WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
154b6a78b7SSimon Schubert or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
164b6a78b7SSimon Schubert License for more details.
174b6a78b7SSimon Schubert
184b6a78b7SSimon Schubert You should have received a copy of the GNU Lesser General Public License
194b6a78b7SSimon Schubert along with the GNU MP Library. If not, see http://www.gnu.org/licenses/. */
204b6a78b7SSimon Schubert
214b6a78b7SSimon Schubert #include "gmp.h"
224b6a78b7SSimon Schubert #include "gmp-impl.h"
234b6a78b7SSimon Schubert
244b6a78b7SSimon Schubert void
mpq_set_si(MP_RAT * dest,signed long int num,unsigned long int den)254b6a78b7SSimon Schubert mpq_set_si (MP_RAT *dest, signed long int num, unsigned long int den)
264b6a78b7SSimon Schubert {
274b6a78b7SSimon Schubert unsigned long int abs_num;
284b6a78b7SSimon Schubert
294b6a78b7SSimon Schubert if (GMP_NUMB_BITS < BITS_PER_ULONG)
304b6a78b7SSimon Schubert {
314b6a78b7SSimon Schubert if (num == 0) /* Canonicalize 0/d to 0/1. */
324b6a78b7SSimon Schubert den = 1;
334b6a78b7SSimon Schubert mpz_set_si (mpq_numref (dest), num);
344b6a78b7SSimon Schubert mpz_set_ui (mpq_denref (dest), den);
354b6a78b7SSimon Schubert return;
364b6a78b7SSimon Schubert }
374b6a78b7SSimon Schubert
38*d2d4b659SJohn Marino abs_num = ABS_CAST (unsigned long, num);
394b6a78b7SSimon Schubert
404b6a78b7SSimon Schubert if (num == 0)
414b6a78b7SSimon Schubert {
424b6a78b7SSimon Schubert /* Canonicalize 0/d to 0/1. */
434b6a78b7SSimon Schubert den = 1;
444b6a78b7SSimon Schubert dest->_mp_num._mp_size = 0;
454b6a78b7SSimon Schubert }
464b6a78b7SSimon Schubert else
474b6a78b7SSimon Schubert {
484b6a78b7SSimon Schubert dest->_mp_num._mp_d[0] = abs_num;
494b6a78b7SSimon Schubert dest->_mp_num._mp_size = num > 0 ? 1 : -1;
504b6a78b7SSimon Schubert }
514b6a78b7SSimon Schubert
524b6a78b7SSimon Schubert dest->_mp_den._mp_d[0] = den;
534b6a78b7SSimon Schubert dest->_mp_den._mp_size = (den != 0);
544b6a78b7SSimon Schubert }
55