summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorvlefevre <vlefevre@280ebfd0-de03-0410-8827-d642c229c3f4>2002-04-15 14:16:20 +0000
committervlefevre <vlefevre@280ebfd0-de03-0410-8827-d642c229c3f4>2002-04-15 14:16:20 +0000
commit9f58b933a500c19055d86957603df79126da30d3 (patch)
tree35d6f41be3a5c7d3359fbc60b0d5fc4d4d0273c5
parent8c197c96c8da846a77c4d6031c289d7d4ab2d5dd (diff)
downloadmpfr-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.c120
1 files changed, 66 insertions, 54 deletions
diff --git a/cmp_ui.c b/cmp_ui.c
index 410d1de2f..82d84a421 100644
--- a/cmp_ui.c
+++ b/cmp_ui.c
@@ -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;
+ }
}
-