diff options
author | vlefevre <vlefevre@280ebfd0-de03-0410-8827-d642c229c3f4> | 2003-05-22 21:39:40 +0000 |
---|---|---|
committer | vlefevre <vlefevre@280ebfd0-de03-0410-8827-d642c229c3f4> | 2003-05-22 21:39:40 +0000 |
commit | 44b4dd94bb98c8d9e7850ae401232bd1b2ea3028 (patch) | |
tree | 9670f0ef8017d42ad2a2062dc08c63c022e450c8 /mpfr-impl.h | |
parent | 2f3cb289a102043a22bd32c5950db37199fb3fd2 (diff) | |
download | mpfr-44b4dd94bb98c8d9e7850ae401232bd1b2ea3028.tar.gz |
Macros MPFR_EXP_INVALID (invalid exponent value) and MPFR_EXP_CHECK
added. Code update to use MPFR_GET_EXP and MPFR_SET_EXP instead of
MPFR_EXP to allow more bug detection related to special values.
Macros MPFR_SET_NAN, MPFR_SET_INF, MPFR_SET_ZERO and MPFR_INIT set
the exponent of the number to MPFR_EXP_INVALID if MPFR_EXP_CHECK
is defined. Compile with -DMPFR_EXP_CHECK and make check to see
the potential problems; currently, 40 of 76 tests fail.
git-svn-id: svn://scm.gforge.inria.fr/svn/mpfr/trunk@2301 280ebfd0-de03-0410-8827-d642c229c3f4
Diffstat (limited to 'mpfr-impl.h')
-rw-r--r-- | mpfr-impl.h | 28 |
1 files changed, 19 insertions, 9 deletions
diff --git a/mpfr-impl.h b/mpfr-impl.h index 0da56412f..284b42322 100644 --- a/mpfr-impl.h +++ b/mpfr-impl.h @@ -84,12 +84,17 @@ typedef unsigned long int mp_size_unsigned_t; #define MPFR_ASSERTD(expr) ((void) 0) #endif -#if WANT_ASSERT -#define MPFR_GET_EXP(x) mpfr_get_exp(x) -#define MPFR_SET_EXP(x, exp) MPFR_ASSERTD (!mpfr_set_exp ((x), (exp))) +/* Invalid exponent value (to track bugs...) */ +#define MPFR_EXP_INVALID ((mp_exp_t) 1 << 30) + +#if MPFR_EXP_CHECK +#define MPFR_GET_EXP(x) mpfr_get_exp (x) +#define MPFR_SET_EXP(x, exp) MPFR_ASSERTN (!mpfr_set_exp ((x), (exp))) +#define MPFR_SET_INVALID_EXP(x) ((void) (MPFR_EXP (x) = MPFR_EXP_INVALID)) #else -#define MPFR_GET_EXP(x) MPFR_EXP(x) -#define MPFR_SET_EXP(x, exp) ((void) (MPFR_EXP(x) = (exp))) +#define MPFR_GET_EXP(x) MPFR_EXP (x) +#define MPFR_SET_EXP(x, exp) ((void) (MPFR_EXP (x) = (exp))) +#define MPFR_SET_INVALID_EXP(x) ((void) 0) #endif /* Definition of constants */ @@ -181,11 +186,15 @@ long double __gmpfr_longdouble_volatile __GMP_PROTO ((long double)) ATTRIBUTE_CO #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_SET_NAN(x) \ + (MPFR_SET_INVALID_EXP(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_SET_INF(x) \ + (MPFR_SET_INVALID_EXP(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) \ @@ -209,7 +218,8 @@ long double __gmpfr_longdouble_volatile __GMP_PROTO ((long double)) ATTRIBUTE_CO #define MPFR_IS_ZERO(x) \ (MPFR_MANT(x)[(MPFR_PREC(x)-1)/BITS_PER_MP_LIMB] == (mp_limb_t) 0) #define MPFR_SET_ZERO(x) \ - (MPFR_MANT(x)[(MPFR_PREC(x)-1)/BITS_PER_MP_LIMB] = (mp_limb_t) 0) + (MPFR_SET_INVALID_EXP(x), \ + MPFR_MANT(x)[(MPFR_PREC(x)-1)/BITS_PER_MP_LIMB] = (mp_limb_t) 0) #define MPFR_ESIZE(x) \ ((MPFR_PREC((x)) - 1) / BITS_PER_MP_LIMB + 1) #define MPFR_EVEN_INEX 2 @@ -229,7 +239,7 @@ long double __gmpfr_longdouble_volatile __GMP_PROTO ((long double)) ATTRIBUTE_CO MPFR_PREC(x) = (p), \ MPFR_MANT(x) = (xp), \ MPFR_SIZE(x) = (s), \ - MPFR_SET_EXP((x), 0)) + MPFR_SET_INVALID_EXP(x)) /* same when xp is already allocated */ #define MPFR_INIT1(xp, x, p, s) \ (MPFR_PREC(x) = (p), MPFR_MANT(x) = (xp), MPFR_SIZE(x) = (s)) |