version 1.1.1.2, 2000/09/09 14:13:13 |
version 1.1.1.3, 2003/08/25 16:06:35 |
|
|
/* mpf_cmp_si -- Compare a float with a signed integer. |
/* mpf_cmp_si -- Compare a float with a signed integer. |
|
|
Copyright (C) 1993, 1994, 1995, 1999, 2000 Free Software Foundation, Inc. |
Copyright 1993, 1994, 1995, 1999, 2000, 2001, 2002 Free Software Foundation, |
|
Inc. |
|
|
This file is part of the GNU MP Library. |
This file is part of the GNU MP Library. |
|
|
Line 23 MA 02111-1307, USA. */ |
|
Line 24 MA 02111-1307, USA. */ |
|
#include "gmp-impl.h" |
#include "gmp-impl.h" |
|
|
int |
int |
#if __STDC__ |
mpf_cmp_si (mpf_srcptr u, long int vval) |
mpf_cmp_si (mpf_srcptr u, long int vslimb) |
|
#else |
|
mpf_cmp_si (u, vslimb) |
|
mpf_srcptr u; |
|
long int vslimb; |
|
#endif |
|
{ |
{ |
mp_srcptr up; |
mp_srcptr up; |
mp_size_t usize; |
mp_size_t usize; |
mp_exp_t uexp; |
mp_exp_t uexp; |
|
mp_limb_t ulimb; |
int usign; |
int usign; |
|
|
uexp = u->_mp_exp; |
uexp = u->_mp_exp; |
usize = u->_mp_size; |
usize = u->_mp_size; |
|
|
/* 1. Are the signs different? */ |
/* 1. Are the signs different? */ |
if ((usize < 0) == (vslimb < 0)) /* don't use xor, type size may differ */ |
if ((usize < 0) == (vval < 0)) /* don't use xor, type size may differ */ |
{ |
{ |
/* U and V are both non-negative or both negative. */ |
/* U and V are both non-negative or both negative. */ |
if (usize == 0) |
if (usize == 0) |
/* vslimb >= 0 */ |
/* vval >= 0 */ |
return -(vslimb != 0); |
return -(vval != 0); |
if (vslimb == 0) |
if (vval == 0) |
/* usize >= 0 */ |
/* usize >= 0 */ |
return usize != 0; |
return usize != 0; |
/* Fall out. */ |
/* Fall out. */ |
Line 60 mpf_cmp_si (u, vslimb) |
|
Line 56 mpf_cmp_si (u, vslimb) |
|
/* U and V have the same sign and are both non-zero. */ |
/* U and V have the same sign and are both non-zero. */ |
|
|
usign = usize >= 0 ? 1 : -1; |
usign = usize >= 0 ? 1 : -1; |
|
usize = ABS (usize); |
|
vval = ABS (vval); |
|
|
/* 2. Are the exponents different (V's exponent == 1)? */ |
/* 2. Are the exponents different (V's exponent == 1)? */ |
|
#if GMP_NAIL_BITS != 0 |
|
if (uexp > 1 + (vval > GMP_NUMB_MAX)) |
|
return usign; |
|
if (uexp < 1 + (vval > GMP_NUMB_MAX)) |
|
return -usign; |
|
#else |
if (uexp > 1) |
if (uexp > 1) |
return usign; |
return usign; |
if (uexp < 1) |
if (uexp < 1) |
return -usign; |
return -usign; |
|
#endif |
|
|
usize = ABS (usize); |
|
vslimb = ABS (vslimb); |
|
|
|
up = u->_mp_d; |
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. */ |
/* 3. Compare the most significant mantissa limb with V. */ |
if (up[usize - 1] > (unsigned long) vslimb) |
if (ulimb > (unsigned long) vval) |
return usign; |
return usign; |
else if (up[usize - 1] < (unsigned long) vslimb) |
else if (ulimb < (unsigned long) vval) |
return -usign; |
return -usign; |
|
|
#define STRICT_MPF_NORMALIZATION 0 |
|
#if ! STRICT_MPF_NORMALIZATION |
|
/* Ignore zeroes at the low end of U. */ |
/* Ignore zeroes at the low end of U. */ |
while (*up == 0) |
while (*up == 0) |
{ |
{ |
up++; |
up++; |
usize--; |
usize--; |
} |
} |
#endif |
|
|
|
/* 4. Now, if the number of limbs are different, we have a difference |
/* 4. Now, if the number of limbs are different, we have a difference |
since we have made sure the trailing limbs are not zero. */ |
since we have made sure the trailing limbs are not zero. */ |
if (usize > 1) |
if (usize > 0) |
return usign; |
return usign; |
|
|
/* Wow, we got zero even if we tried hard to avoid it. */ |
/* Wow, we got zero even if we tried hard to avoid it. */ |