diff options
author | vlefevre <vlefevre@280ebfd0-de03-0410-8827-d642c229c3f4> | 2002-04-15 14:16:20 +0000 |
---|---|---|
committer | vlefevre <vlefevre@280ebfd0-de03-0410-8827-d642c229c3f4> | 2002-04-15 14:16:20 +0000 |
commit | 9f58b933a500c19055d86957603df79126da30d3 (patch) | |
tree | 35d6f41be3a5c7d3359fbc60b0d5fc4d4d0273c5 | |
parent | 8c197c96c8da846a77c4d6031c289d7d4ab2d5dd (diff) | |
download | mpfr-9f58b933a500c19055d86957603df79126da30d3.tar.gz |
mpfr_cmp_ui_2exp and mpfr_cmp_si_2exp can no longer be called with a NaN.
Misc bugs fixed.
git-svn-id: svn://scm.gforge.inria.fr/svn/mpfr/trunk@1880 280ebfd0-de03-0410-8827-d642c229c3f4
-rw-r--r-- | cmp_ui.c | 120 |
1 files changed, 66 insertions, 54 deletions
@@ -1,6 +1,6 @@ /* mpfr_cmp_ui -- compare a floating-point number with a machine integer -Copyright 1999, 2001 Free Software Foundation, Inc. +Copyright 1999, 2001, 2002 Free Software Foundation, Inc. This file is part of the MPFR Library. @@ -32,40 +32,51 @@ MA 02111-1307, USA. */ */ int -mpfr_cmp_ui_2exp (mpfr_srcptr b, unsigned long int i, int f ) +mpfr_cmp_ui_2exp (mpfr_srcptr b, unsigned long int i, int f) { - int e, k, bn; mp_limb_t c, *bp; + int e, k, bn; + mp_limb_t c, *bp; - if (MPFR_IS_NAN(b)) return 1; + MPFR_ASSERTN(!MPFR_IS_NAN(b)); - if (MPFR_IS_INF(b)) return (MPFR_SIGN(b) > 0) ? 1 : -1; + if (MPFR_IS_INF(b)) + return MPFR_SIGN(b); /* now b is neither NaN nor +/-Infinity */ - if (!MPFR_NOTZERO(b)) return((i) ? -1 : 0); - else if (MPFR_SIGN(b) < 0) return -1; + if (MPFR_IS_ZERO(b)) + return i ? -1 : 0; + else if (MPFR_SIGN(b) < 0) + return -1; /* now b>0 */ - else if (i==0) return 1; - else { /* b>0, i>0 */ - e = MPFR_EXP(b); /* 2^(e-1) <= b < 2^e */ - if (e>f+BITS_PER_MP_LIMB) return 1; + else if (i == 0) + return 1; + else + { /* b>0, i>0 */ + e = MPFR_EXP(b); /* 2^(e-1) <= b < 2^e */ + if (e > f + BITS_PER_MP_LIMB) + return 1; c = (mp_limb_t) i; count_leading_zeros(k, c); - k = f+BITS_PER_MP_LIMB - k; /* 2^(k-1) <= i*2^f < 2^k */ - if (k!=e) return (e-k); + k = f + BITS_PER_MP_LIMB - k; /* 2^(k-1) <= i*2^f < 2^k */ + if (k != e) + return e - k; /* now k=e */ - c <<= (f+BITS_PER_MP_LIMB-k); - bn = (MPFR_PREC(b)-1)/BITS_PER_MP_LIMB; + c <<= f + BITS_PER_MP_LIMB - k; + bn = (MPFR_PREC(b) - 1) / BITS_PER_MP_LIMB; bp = MPFR_MANT(b) + bn; - if (*bp>c) return 1; - else if (*bp<c) return -1; + if (*bp > c) + return 1; + if (*bp < c) + return -1; /* most significant limbs agree, check remaining limbs from b */ - while (--bn>=0) - if (*--bp) return 1; + while (--bn >= 0) + if (*--bp) + return 1; return 0; - } + } } /* returns a positive value if b>i*2^f, @@ -74,43 +85,44 @@ mpfr_cmp_ui_2exp (mpfr_srcptr b, unsigned long int i, int f ) */ int -mpfr_cmp_si_2exp (mpfr_srcptr b, long int i, int f ) +mpfr_cmp_si_2exp (mpfr_srcptr b, long int i, int f) { - int e, k, bn, si; mp_limb_t c, *bp; + int e, k, bn, si; + mp_limb_t c, *bp; - if (MPFR_IS_NAN(b)) - return 1; + MPFR_ASSERTN(!MPFR_IS_NAN(b)); - si = (i<0) ? -1 : 1; /* sign of i */ - if ((MPFR_SIGN(b) * si < 0) || MPFR_IS_INF(b)) + si = i < 0 ? -1 : 1; /* sign of i */ + if (MPFR_IS_INF(b) || (MPFR_NOTZERO(b) && MPFR_SIGN(b) != si)) return MPFR_SIGN(b); - /* both signs differ */ - else if (!MPFR_NOTZERO(b) || (i==0)) { /* one is zero */ - if (i==0) return ((MPFR_NOTZERO(b)) ? MPFR_SIGN(b) : 0); - else return si; /* b is zero */ - - } - else { /* b and i are of same sign */ - e = MPFR_EXP(b); /* 2^(e-1) <= b < 2^e */ - if (e>f+BITS_PER_MP_LIMB) return si; - - c = (mp_limb_t) ((i<0) ? -i : i); - count_leading_zeros(k, c); - k = f+BITS_PER_MP_LIMB - k; /* 2^(k-1) <= i*2^f < 2^k */ - if (k!=e) return (si*(e-k)); - - /* now k=e */ - c <<= (f+BITS_PER_MP_LIMB-k); - bn = (MPFR_PREC(b)-1)/BITS_PER_MP_LIMB; - bp = MPFR_MANT(b) + bn; - if (*bp>c) return si; - else if (*bp<c) return -si; - - /* most significant limbs agree, check remaining limbs from b */ - while (--bn>=0) - if (*--bp) return si; - return 0; - } + else if (MPFR_IS_ZERO(b) || i == 0) + return i == 0 ? (MPFR_IS_ZERO(b) ? 0 : MPFR_SIGN(b)) : si; + else + { /* b and i are of same sign */ + e = MPFR_EXP(b); /* 2^(e-1) <= b < 2^e */ + if (e > f + BITS_PER_MP_LIMB) + return si; + + c = i < 0 ? - (mp_limb_t) i : (mp_limb_t) i; + count_leading_zeros(k, c); + k = f + BITS_PER_MP_LIMB - k; /* 2^(k-1) <= i*2^f < 2^k */ + if (k != e) + return si * (e - k); + + /* now k = e */ + c <<= f + BITS_PER_MP_LIMB - k; + bn = (MPFR_PREC(b) - 1) / BITS_PER_MP_LIMB; + bp = MPFR_MANT(b) + bn; + if (*bp > c) + return si; + if (*bp < c) + return -si; + + /* most significant limbs agree, check remaining limbs from b */ + while (--bn >= 0) + if (*--bp) + return si; + return 0; + } } - |