xref: /dflybsd-src/contrib/gmp/mpf/cmp_ui.c (revision d365564473a20a528d07c59cad8ee2f4bea5546f)
14b6a78b7SSimon Schubert /* mpf_cmp_ui -- Compare a float with an unsigned integer.
24b6a78b7SSimon Schubert 
34b6a78b7SSimon Schubert Copyright 1993, 1994, 1995, 1999, 2001, 2002 Free Software Foundation, Inc.
44b6a78b7SSimon Schubert 
54b6a78b7SSimon Schubert This file is part of the GNU MP Library.
64b6a78b7SSimon Schubert 
74b6a78b7SSimon Schubert The GNU MP Library is free software; you can redistribute it and/or modify
84b6a78b7SSimon Schubert it under the terms of the GNU Lesser General Public License as published by
94b6a78b7SSimon Schubert the Free Software Foundation; either version 3 of the License, or (at your
104b6a78b7SSimon Schubert option) any later version.
114b6a78b7SSimon Schubert 
124b6a78b7SSimon Schubert The GNU MP Library is distributed in the hope that it will be useful, but
134b6a78b7SSimon Schubert WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
144b6a78b7SSimon Schubert or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public
154b6a78b7SSimon Schubert License for more details.
164b6a78b7SSimon Schubert 
174b6a78b7SSimon Schubert You should have received a copy of the GNU Lesser General Public License
184b6a78b7SSimon Schubert along with the GNU MP Library.  If not, see http://www.gnu.org/licenses/.  */
194b6a78b7SSimon Schubert 
204b6a78b7SSimon Schubert #include "gmp.h"
214b6a78b7SSimon Schubert #include "gmp-impl.h"
224b6a78b7SSimon Schubert 
234b6a78b7SSimon Schubert int
mpf_cmp_ui(mpf_srcptr u,unsigned long int vval)24*d2d4b659SJohn Marino mpf_cmp_ui (mpf_srcptr u, unsigned long int vval) __GMP_NOTHROW
254b6a78b7SSimon Schubert {
264b6a78b7SSimon Schubert   mp_srcptr up;
274b6a78b7SSimon Schubert   mp_size_t usize;
284b6a78b7SSimon Schubert   mp_exp_t uexp;
294b6a78b7SSimon Schubert   mp_limb_t ulimb;
304b6a78b7SSimon Schubert 
314b6a78b7SSimon Schubert   uexp = u->_mp_exp;
324b6a78b7SSimon Schubert   usize = u->_mp_size;
334b6a78b7SSimon Schubert 
344b6a78b7SSimon Schubert   /* 1. Is U negative?  */
354b6a78b7SSimon Schubert   if (usize < 0)
364b6a78b7SSimon Schubert     return -1;
374b6a78b7SSimon Schubert   /* We rely on usize being non-negative in the code that follows.  */
384b6a78b7SSimon Schubert 
394b6a78b7SSimon Schubert   if (vval == 0)
404b6a78b7SSimon Schubert     return usize != 0;
414b6a78b7SSimon Schubert 
424b6a78b7SSimon Schubert   /* 2. Are the exponents different (V's exponent == 1)?  */
434b6a78b7SSimon Schubert #if GMP_NAIL_BITS != 0
444b6a78b7SSimon Schubert   if (uexp > 1 + (vval > GMP_NUMB_MAX))
454b6a78b7SSimon Schubert     return 1;
464b6a78b7SSimon Schubert   if (uexp < 1 + (vval > GMP_NUMB_MAX))
474b6a78b7SSimon Schubert     return -1;
484b6a78b7SSimon Schubert #else
494b6a78b7SSimon Schubert   if (uexp > 1)
504b6a78b7SSimon Schubert     return 1;
514b6a78b7SSimon Schubert   if (uexp < 1)
524b6a78b7SSimon Schubert     return -1;
534b6a78b7SSimon Schubert #endif
544b6a78b7SSimon Schubert 
554b6a78b7SSimon Schubert   up = u->_mp_d;
564b6a78b7SSimon Schubert 
574b6a78b7SSimon Schubert   ulimb = up[usize - 1];
584b6a78b7SSimon Schubert #if GMP_NAIL_BITS != 0
594b6a78b7SSimon Schubert   if (usize >= 2 && uexp == 2)
604b6a78b7SSimon Schubert     {
614b6a78b7SSimon Schubert       if ((ulimb >> GMP_NAIL_BITS) != 0)
624b6a78b7SSimon Schubert 	return 1;
634b6a78b7SSimon Schubert       ulimb = (ulimb << GMP_NUMB_BITS) | up[usize - 2];
644b6a78b7SSimon Schubert       usize--;
654b6a78b7SSimon Schubert     }
664b6a78b7SSimon Schubert #endif
674b6a78b7SSimon Schubert   usize--;
684b6a78b7SSimon Schubert 
694b6a78b7SSimon Schubert   /* 3. Compare the most significant mantissa limb with V.  */
704b6a78b7SSimon Schubert   if (ulimb > vval)
714b6a78b7SSimon Schubert     return 1;
724b6a78b7SSimon Schubert   else if (ulimb < vval)
734b6a78b7SSimon Schubert     return -1;
744b6a78b7SSimon Schubert 
754b6a78b7SSimon Schubert   /* Ignore zeroes at the low end of U.  */
764b6a78b7SSimon Schubert   while (*up == 0)
774b6a78b7SSimon Schubert     {
784b6a78b7SSimon Schubert       up++;
794b6a78b7SSimon Schubert       usize--;
804b6a78b7SSimon Schubert     }
814b6a78b7SSimon Schubert 
824b6a78b7SSimon Schubert   /* 4. Now, if the number of limbs are different, we have a difference
834b6a78b7SSimon Schubert      since we have made sure the trailing limbs are not zero.  */
844b6a78b7SSimon Schubert   if (usize > 0)
854b6a78b7SSimon Schubert     return 1;
864b6a78b7SSimon Schubert 
874b6a78b7SSimon Schubert   /* Wow, we got zero even if we tried hard to avoid it.  */
884b6a78b7SSimon Schubert   return 0;
894b6a78b7SSimon Schubert }
90