=================================================================== RCS file: /home/cvs/OpenXM_contrib/gmp/mpf/Attic/cmp_ui.c,v retrieving revision 1.1.1.2 retrieving revision 1.1.1.3 diff -u -p -r1.1.1.2 -r1.1.1.3 --- OpenXM_contrib/gmp/mpf/Attic/cmp_ui.c 2000/09/09 14:13:13 1.1.1.2 +++ OpenXM_contrib/gmp/mpf/Attic/cmp_ui.c 2003/08/25 16:06:35 1.1.1.3 @@ -1,6 +1,6 @@ /* mpf_cmp_ui -- Compare a float with an unsigned integer. -Copyright (C) 1993, 1994, 1995, 1999 Free Software Foundation, Inc. +Copyright 1993, 1994, 1995, 1999, 2001, 2002 Free Software Foundation, Inc. This file is part of the GNU MP Library. @@ -23,17 +23,12 @@ MA 02111-1307, USA. */ #include "gmp-impl.h" int -#if __STDC__ -mpf_cmp_ui (mpf_srcptr u, unsigned long int vlimb) -#else -mpf_cmp_ui (u, vlimb) - mpf_srcptr u; - unsigned long int vlimb; -#endif +mpf_cmp_ui (mpf_srcptr u, unsigned long int vval) { mp_srcptr up; mp_size_t usize; mp_exp_t uexp; + mp_limb_t ulimb; uexp = u->_mp_exp; usize = u->_mp_size; @@ -43,36 +38,52 @@ mpf_cmp_ui (u, vlimb) return -1; /* We rely on usize being non-negative in the code that follows. */ - if (vlimb == 0) + if (vval == 0) return usize != 0; /* 2. Are the exponents different (V's exponent == 1)? */ +#if GMP_NAIL_BITS != 0 + if (uexp > 1 + (vval > GMP_NUMB_MAX)) + return 1; + if (uexp < 1 + (vval > GMP_NUMB_MAX)) + return -1; +#else if (uexp > 1) return 1; if (uexp < 1) return -1; +#endif up = u->_mp_d; + ulimb = up[usize - 1]; +#if GMP_NAIL_BITS != 0 + if (usize >= 2 && uexp == 2) + { + if ((ulimb >> GMP_NAIL_BITS) != 0) + return 1; + ulimb = (ulimb << GMP_NUMB_BITS) | up[usize - 2]; + usize--; + } +#endif + usize--; + /* 3. Compare the most significant mantissa limb with V. */ - if (up[usize - 1] > vlimb) + if (ulimb > vval) return 1; - else if (up[usize - 1] < vlimb) + else if (ulimb < vval) return -1; -#define STRICT_MPF_NORMALIZATION 0 -#if ! STRICT_MPF_NORMALIZATION /* Ignore zeroes at the low end of U. */ while (*up == 0) { up++; usize--; } -#endif /* 4. Now, if the number of limbs are different, we have a difference since we have made sure the trailing limbs are not zero. */ - if (usize > 1) + if (usize > 0) return 1; /* Wow, we got zero even if we tried hard to avoid it. */