diff options
author | vlefevre <vlefevre@280ebfd0-de03-0410-8827-d642c229c3f4> | 2001-11-10 00:47:44 +0000 |
---|---|---|
committer | vlefevre <vlefevre@280ebfd0-de03-0410-8827-d642c229c3f4> | 2001-11-10 00:47:44 +0000 |
commit | 3bdb8b4f6f3ab6fc0c2aa5f71535a2c7133cc04c (patch) | |
tree | 2152f1a3b670953a57de26f2ecadc1b56226440f /mpfr-impl.h | |
parent | dcebc5b873e9698d03d4e31784c17b668b9bad5b (diff) | |
download | mpfr-3bdb8b4f6f3ab6fc0c2aa5f71535a2c7133cc04c.tar.gz |
MP_LIMB_T_ONE defined.
mp_size_unsigned_t defined.
Important bugs fixed (in particular when int has fewer than 32 bits).
Still unavoidable possible bugs due to the fact that mp_size_t is signed.
git-svn-id: svn://scm.gforge.inria.fr/svn/mpfr/trunk@1487 280ebfd0-de03-0410-8827-d642c229c3f4
Diffstat (limited to 'mpfr-impl.h')
-rw-r--r-- | mpfr-impl.h | 33 |
1 files changed, 20 insertions, 13 deletions
diff --git a/mpfr-impl.h b/mpfr-impl.h index 10c4e4105..d69b3fc3a 100644 --- a/mpfr-impl.h +++ b/mpfr-impl.h @@ -22,10 +22,14 @@ MA 02111-1307, USA. */ /* This unsigned type must correspond to the signed one defined in gmp.h */ #if defined (_CRAY) && ! defined (_CRAYMPP) typedef unsigned int mp_exp_unsigned_t; +typedef unsigned int mp_size_unsigned_t; #else typedef unsigned long int mp_exp_unsigned_t; +typedef unsigned long int mp_size_unsigned_t; #endif +#define MP_LIMB_T_ONE ((mp_limb_t) 1) + /* Assertions */ /* Compile with -DMPFR_DEBUG_LEVEL=<level> to change the debug level */ @@ -68,23 +72,26 @@ typedef union ieee_double_extract Ieee_double_extract; bit 30 of _mpfr_size is used for Nan flag, bit 29 of _mpfr_size is used for Inf flag, remaining bits are used to store the number of allocated limbs */ -#define MPFR_CLEAR_FLAGS(x) (((x) -> _mpfr_size &= ~(3 << 29))) -#define MPFR_IS_NAN(x) (((x)->_mpfr_size >> 30)&1) -#define MPFR_SET_NAN(x) ((x)->_mpfr_size |= (1<<30)) -#define MPFR_CLEAR_NAN(x) (((x) -> _mpfr_size &= ~(1 << 30))) -#define MPFR_IS_INF(x) (((x)->_mpfr_size >> 29)&1) -#define MPFR_SET_INF(x) ((x)->_mpfr_size |= (1<<29)) -#define MPFR_CLEAR_INF(x) ((x)->_mpfr_size &= ~(1 << 29)) +#define MPFR_CLEAR_FLAGS(x) \ + (((x) -> _mpfr_size &= ~((mp_size_unsigned_t) 3 << 29))) +#define MPFR_IS_NAN(x) (((x)->_mpfr_size >> 30) & 1) +#define MPFR_SET_NAN(x) ((x)->_mpfr_size |= ((mp_size_unsigned_t) 1 << 30)) +#define MPFR_CLEAR_NAN(x) \ + (((x) -> _mpfr_size &= ~((mp_size_unsigned_t) 1 << 30))) +#define MPFR_IS_INF(x) (((x)->_mpfr_size >> 29) & 1) +#define MPFR_SET_INF(x) ((x)->_mpfr_size |= ((mp_size_unsigned_t) 1 << 29)) +#define MPFR_CLEAR_INF(x) ((x)->_mpfr_size &= ~((mp_size_unsigned_t) 1 << 29)) #define MPFR_IS_FP(x) ((((x) -> _mpfr_size >> 29) & 3) == 0) -#define MPFR_ABSSIZE(x) ((x)->_mpfr_size & ((1<<29)-1)) +#define MPFR_ABSSIZE(x) \ + ((x)->_mpfr_size & (((mp_size_unsigned_t) 1 << 29) - 1)) #define MPFR_SIZE(x) ((x)->_mpfr_size) #define MPFR_EXP(x) ((x)->_mpfr_exp) #define MPFR_MANT(x) ((x)->_mpfr_d) -#define MPFR_ISNONNEG(x) (MPFR_NOTZERO((x)) && MPFR_SIGN(x)>=0) -#define MPFR_ISNEG(x) (MPFR_NOTZERO((x)) && MPFR_SIGN(x)==-1) -#define MPFR_SET_POS(x) (MPFR_SIZE(x) &= ~(((mp_size_t)1)<<31)) -#define MPFR_SET_NEG(x) (MPFR_SIZE(x) |= (((mp_size_t)1)<<31)) -#define MPFR_CHANGE_SIGN(x) (MPFR_SIZE(x) ^= (((mp_size_t)1)<<31)) +#define MPFR_ISNONNEG(x) (MPFR_NOTZERO((x)) && MPFR_SIGN(x) >= 0) +#define MPFR_ISNEG(x) (MPFR_NOTZERO((x)) && MPFR_SIGN(x) == -1) +#define MPFR_SET_POS(x) (MPFR_SIZE(x) &= ~(((mp_size_unsigned_t) 1) << 31)) +#define MPFR_SET_NEG(x) (MPFR_SIZE(x) |= (((mp_size_unsigned_t) 1) << 31)) +#define MPFR_CHANGE_SIGN(x) (MPFR_SIZE(x) ^= (((mp_size_unsigned_t) 1) << 31)) #define MPFR_SET_SAME_SIGN(x, y) \ (MPFR_SIGN((x)) != MPFR_SIGN((y)) && (MPFR_CHANGE_SIGN((x)), 0)) #define MPFR_PREC(x) ((x)->_mpfr_prec) |