summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKevin Ryde <user42@zip.com.au>2002-05-08 01:14:28 +0200
committerKevin Ryde <user42@zip.com.au>2002-05-08 01:14:28 +0200
commit707d3ccd42d2c4407089bdc24ab7bd6ea619c9bb (patch)
treede5af9a82244732b8afc9e3d4e059b90a407a4fc
parentd19b9b19017f093abb5161227f32551e9f380567 (diff)
downloadgmp-707d3ccd42d2c4407089bdc24ab7bd6ea619c9bb.tar.gz
* mpf/fits_u.h, mpf/fits_s.h, tests/mpf/t-fits.c: Ignore fraction
part, making the code match the documentation.
-rw-r--r--mpf/fits_s.h25
-rw-r--r--mpf/fits_u.h25
-rw-r--r--tests/mpf/t-fits.c117
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";
@@ -92,6 +97,13 @@ main (void)
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";
EXPECT (mpf_fits_ushort_p, 0);
@@ -103,6 +115,12 @@ main (void)
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";
EXPECT (mpf_fits_uint_p, 0);
@@ -113,6 +131,11 @@ main (void)
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";
EXPECT (mpf_fits_ulong_p, 0);
@@ -125,6 +148,13 @@ main (void)
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";
EXPECT (mpf_fits_sshort_p, 0);
@@ -136,6 +166,12 @@ main (void)
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";
EXPECT (mpf_fits_sint_p, 0);
@@ -146,6 +182,11 @@ main (void)
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";
EXPECT (mpf_fits_slong_p, 0);
@@ -158,6 +199,13 @@ main (void)
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";
EXPECT (mpf_fits_sshort_p, 0);
@@ -169,6 +217,12 @@ main (void)
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";
EXPECT (mpf_fits_sint_p, 0);
@@ -179,6 +233,11 @@ main (void)
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";
EXPECT (mpf_fits_slong_p, 0);
@@ -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);
}