From 707d3ccd42d2c4407089bdc24ab7bd6ea619c9bb Mon Sep 17 00:00:00 2001 From: Kevin Ryde Date: Wed, 8 May 2002 01:14:28 +0200 Subject: * mpf/fits_u.h, mpf/fits_s.h, tests/mpf/t-fits.c: Ignore fraction part, making the code match the documentation. --- mpf/fits_s.h | 25 +++++------- mpf/fits_u.h | 25 +++++------- tests/mpf/t-fits.c | 117 ++++++++++++++++++++++++++++++++++++++++++++++++++--- 3 files changed, 129 insertions(+), 38 deletions(-) diff --git a/mpf/fits_s.h b/mpf/fits_s.h index 6f2318a0c..1586e7f9c 100644 --- a/mpf/fits_s.h +++ b/mpf/fits_s.h @@ -28,46 +28,39 @@ MA 02111-1307, USA. */ int FUNCTION (mpf_srcptr f) { - mp_size_t fs, fn, i; + mp_size_t fs, fn; mp_srcptr fp; mp_exp_t exp; mp_limb_t fl; fs = SIZ(f); if (fs == 0) - return 1; + return 1; /* zero fits */ exp = EXP(f); + if (exp < 1) + return 1; /* -1 < f < 1 truncates to zero, so fits */ + fp = PTR(f); fn = ABS (fs); if (exp == 1) { - fn -= 1; /* decrement to point at first fraction limb */ - fl = fp[fn]; + fl = fp[fn-1]; } #if GMP_NAIL_BITS != 0 else if (exp == 2 && MAXIMUM > GMP_NUMB_MAX) { - fn -= 1; - fl = fp[fn]; + fl = fp[fn-1]; if ((fl >> GMP_NAIL_BITS) != 0) return 0; fl = (fl << GMP_NUMB_BITS); - if (fn >= 1) - { - fn -= 1; /* decrement to point at first fraction limb */ - fl |= fp[fn]; - } + if (fn >= 2) + fl |= fp[fn-2]; } #endif else return 0; - /* any fraction limbs must be zero */ - for (i = fn - 1; i >= 0; i--) - if (fp[i] != 0) - return 0; - return fl <= (fs >= 0 ? (mp_limb_t) MAXIMUM : - (mp_limb_t) MINIMUM); } diff --git a/mpf/fits_u.h b/mpf/fits_u.h index d1d94583c..640f45193 100644 --- a/mpf/fits_u.h +++ b/mpf/fits_u.h @@ -1,6 +1,6 @@ /* mpf_fits_u*_p -- test whether an mpf fits a C unsigned type. -Copyright 2001 Free Software Foundation, Inc. +Copyright 2001, 2002 Free Software Foundation, Inc. This file is part of the GNU MP Library. @@ -28,7 +28,7 @@ MA 02111-1307, USA. */ int FUNCTION (mpf_srcptr f) { - mp_size_t fn, i; + mp_size_t fn; mp_srcptr fp; mp_exp_t exp; mp_limb_t fl; @@ -38,35 +38,28 @@ FUNCTION (mpf_srcptr f) return fn == 0; /* zero fits, negatives don't */ exp = EXP(f); + if (exp < 1) + return 1; /* 0 < f < 1 truncates to zero, so fits */ + fp = PTR(f); if (exp == 1) { - fn -= 1; /* decrement to point at first fraction limb */ - fl = fp[fn]; + fl = fp[fn-1]; } #if GMP_NAIL_BITS != 0 else if (exp == 2 && MAXIMUM > GMP_NUMB_MAX) { - fn -= 1; - fl = fp[fn]; + fl = fp[fn-1]; if ((fl >> GMP_NAIL_BITS) != 0) return 0; fl = (fl << GMP_NUMB_BITS); - if (fn >= 1) - { - fn -= 1; /* decrement to point at first fraction limb */ - fl |= fp[fn]; - } + if (fn >= 2) + fl |= fp[fn-2]; } #endif else return 0; - /* any fraction limbs must be zero */ - for (i = fn - 1; i >= 0; i--) - if (fp[i] != 0) - return 0; - return fl <= MAXIMUM; } diff --git a/tests/mpf/t-fits.c b/tests/mpf/t-fits.c index 7490c7acf..5a17dae56 100644 --- a/tests/mpf/t-fits.c +++ b/tests/mpf/t-fits.c @@ -1,6 +1,6 @@ /* Test mpf_fits_*_p -Copyright 2001 Free Software Foundation, Inc. +Copyright 2001, 2002 Free Software Foundation, Inc. This file is part of the GNU MP Library. @@ -49,13 +49,18 @@ MA 02111-1307, USA. */ int main (void) { - mpf_t f; + mpf_t f, f0p5; int got; const char *expr; int error = 0; tests_start (); mpf_init2 (f, 200L); + mpf_init2 (f0p5, 200L); + + /* 0.5 */ + mpf_set_ui (f0p5, 1L); + mpf_div_2exp (f0p5, f0p5, 1L); mpf_set_ui (f, 0L); expr = "0"; @@ -91,6 +96,13 @@ main (void) EXPECT (mpf_fits_uint_p, 1); EXPECT (mpf_fits_ushort_p, 1); + mpf_set_ui (f, (unsigned long) USHRT_MAX); + mpf_add (f, f, f0p5); + expr = "USHRT_MAX + 0.5"; + EXPECT (mpf_fits_ulong_p, 1); + EXPECT (mpf_fits_uint_p, 1); + EXPECT (mpf_fits_ushort_p, 1); + mpf_set_ui (f, (unsigned long) USHRT_MAX); mpf_add_ui (f, f, 1L); expr = "USHRT_MAX + 1"; @@ -102,6 +114,12 @@ main (void) EXPECT (mpf_fits_ulong_p, 1); EXPECT (mpf_fits_uint_p, 1); + mpf_set_ui (f, (unsigned long) UINT_MAX); + mpf_add (f, f, f0p5); + expr = "UINT_MAX + 0.5"; + EXPECT (mpf_fits_ulong_p, 1); + EXPECT (mpf_fits_uint_p, 1); + mpf_set_ui (f, (unsigned long) UINT_MAX); mpf_add_ui (f, f, 1L); expr = "UINT_MAX + 1"; @@ -112,6 +130,11 @@ main (void) expr = "ULONG_MAX"; EXPECT (mpf_fits_ulong_p, 1); + mpf_set_ui (f, ULONG_MAX); + mpf_add (f, f, f0p5); + expr = "ULONG_MAX + 0.5"; + EXPECT (mpf_fits_ulong_p, 1); + mpf_set_ui (f, ULONG_MAX); mpf_add_ui (f, f, 1L); expr = "ULONG_MAX + 1"; @@ -124,6 +147,13 @@ main (void) EXPECT (mpf_fits_sint_p, 1); EXPECT (mpf_fits_sshort_p, 1); + mpf_set_si (f, (long) SHRT_MAX); + expr = "SHRT_MAX + 0.5"; + mpf_add (f, f, f0p5); + EXPECT (mpf_fits_slong_p, 1); + EXPECT (mpf_fits_sint_p, 1); + EXPECT (mpf_fits_sshort_p, 1); + mpf_set_si (f, (long) SHRT_MAX); mpf_add_ui (f, f, 1L); expr = "SHRT_MAX + 1"; @@ -135,6 +165,12 @@ main (void) EXPECT (mpf_fits_slong_p, 1); EXPECT (mpf_fits_sint_p, 1); + mpf_set_si (f, (long) INT_MAX); + mpf_add (f, f, f0p5); + expr = "INT_MAX + 0.5"; + EXPECT (mpf_fits_slong_p, 1); + EXPECT (mpf_fits_sint_p, 1); + mpf_set_si (f, (long) INT_MAX); mpf_add_ui (f, f, 1L); expr = "INT_MAX + 1"; @@ -145,6 +181,11 @@ main (void) expr = "LONG_MAX"; EXPECT (mpf_fits_slong_p, 1); + mpf_set_si (f, LONG_MAX); + mpf_add (f, f, f0p5); + expr = "LONG_MAX + 0.5"; + EXPECT (mpf_fits_slong_p, 1); + mpf_set_si (f, LONG_MAX); mpf_add_ui (f, f, 1L); expr = "LONG_MAX + 1"; @@ -157,6 +198,13 @@ main (void) EXPECT (mpf_fits_sint_p, 1); EXPECT (mpf_fits_sshort_p, 1); + mpf_set_si (f, (long) SHRT_MIN); + mpf_sub (f, f, f0p5); + expr = "SHRT_MIN - 0.5"; + EXPECT (mpf_fits_slong_p, 1); + EXPECT (mpf_fits_sint_p, 1); + EXPECT (mpf_fits_sshort_p, 1); + mpf_set_si (f, (long) SHRT_MIN); mpf_sub_ui (f, f, 1L); expr = "SHRT_MIN + 1"; @@ -168,6 +216,12 @@ main (void) EXPECT (mpf_fits_slong_p, 1); EXPECT (mpf_fits_sint_p, 1); + mpf_set_si (f, (long) INT_MIN); + mpf_sub (f, f, f0p5); + expr = "INT_MIN - 0.5"; + EXPECT (mpf_fits_slong_p, 1); + EXPECT (mpf_fits_sint_p, 1); + mpf_set_si (f, (long) INT_MIN); mpf_sub_ui (f, f, 1L); expr = "INT_MIN + 1"; @@ -178,6 +232,11 @@ main (void) expr = "LONG_MIN"; EXPECT (mpf_fits_slong_p, 1); + mpf_set_si (f, LONG_MIN); + mpf_sub (f, f, f0p5); + expr = "LONG_MIN - 0.5"; + EXPECT (mpf_fits_slong_p, 1); + mpf_set_si (f, LONG_MIN); mpf_sub_ui (f, f, 1L); expr = "LONG_MIN + 1"; @@ -186,6 +245,34 @@ main (void) mpf_set_str_or_abort (f, "0.5", 10); expr = "0.5"; + EXPECT (mpf_fits_ulong_p, 1); + EXPECT (mpf_fits_uint_p, 1); + EXPECT (mpf_fits_ushort_p, 1); + EXPECT (mpf_fits_slong_p, 1); + EXPECT (mpf_fits_sint_p, 1); + EXPECT (mpf_fits_sshort_p, 1); + + mpf_set_str_or_abort (f, "-0.5", 10); + expr = "-0.5"; + EXPECT (mpf_fits_ulong_p, 0); + EXPECT (mpf_fits_uint_p, 0); + EXPECT (mpf_fits_ushort_p, 0); + EXPECT (mpf_fits_slong_p, 1); + EXPECT (mpf_fits_sint_p, 1); + EXPECT (mpf_fits_sshort_p, 1); + + + mpf_set_str_or_abort (f, "1.000000000000000000000000000000000001", 16); + expr = "1.000000000000000000000000000000000001 base 16"; + EXPECT (mpf_fits_ulong_p, 1); + EXPECT (mpf_fits_uint_p, 1); + EXPECT (mpf_fits_ushort_p, 1); + EXPECT (mpf_fits_slong_p, 1); + EXPECT (mpf_fits_sint_p, 1); + EXPECT (mpf_fits_sshort_p, 1); + + mpf_set_str_or_abort (f, "1@1000", 16); + expr = "1@1000 base 16"; EXPECT (mpf_fits_ulong_p, 0); EXPECT (mpf_fits_uint_p, 0); EXPECT (mpf_fits_ushort_p, 0); @@ -193,8 +280,11 @@ main (void) EXPECT (mpf_fits_sint_p, 0); EXPECT (mpf_fits_sshort_p, 0); - mpf_set_str_or_abort (f, "1.000000000000000000000000000000000001", 16); - expr = "1.000000000000000000000000000000000001 base 16"; + + mpf_set_ui (f, 1L); + mpf_mul_2exp (f, f, BITS_PER_ULONG + 1); + mpf_sub_ui (f, f, 1L); + expr = "2^(BITS_PER_ULONG+1) - 1"; EXPECT (mpf_fits_ulong_p, 0); EXPECT (mpf_fits_uint_p, 0); EXPECT (mpf_fits_ushort_p, 0); @@ -202,8 +292,22 @@ main (void) EXPECT (mpf_fits_sint_p, 0); EXPECT (mpf_fits_sshort_p, 0); - mpf_set_str_or_abort (f, "1@1000", 16); - expr = "1@1000 base 16"; + mpf_set_ui (f, 1L); + mpf_mul_2exp (f, f, BITS_PER_ULONG + 1); + mpf_sub_ui (f, f, 1L); + mpf_neg (f, f); + expr = "- (2^(BITS_PER_ULONG+1) - 1)"; + EXPECT (mpf_fits_ulong_p, 0); + EXPECT (mpf_fits_uint_p, 0); + EXPECT (mpf_fits_ushort_p, 0); + EXPECT (mpf_fits_slong_p, 0); + EXPECT (mpf_fits_sint_p, 0); + EXPECT (mpf_fits_sshort_p, 0); + + mpf_set_ui (f, 1L); + mpf_mul_2exp (f, f, BITS_PER_ULONG + 5); + mpf_sub_ui (f, f, 1L); + expr = "2^(BITS_PER_ULONG+5) - 1"; EXPECT (mpf_fits_ulong_p, 0); EXPECT (mpf_fits_uint_p, 0); EXPECT (mpf_fits_ushort_p, 0); @@ -216,6 +320,7 @@ main (void) abort (); mpf_clear (f); + mpf_clear (f0p5); tests_end (); exit (0); } -- cgit v1.2.1