Index: gcc/mpfr/tests/trint.c |
diff --git a/gcc/mpfr/tests/trint.c b/gcc/mpfr/tests/trint.c |
deleted file mode 100644 |
index 7eee49709353326dbd379b64e7efc14b0d6f5ca3..0000000000000000000000000000000000000000 |
--- a/gcc/mpfr/tests/trint.c |
+++ /dev/null |
@@ -1,384 +0,0 @@ |
-/* Test file for mpfr_rint, mpfr_trunc, mpfr_floor, mpfr_ceil, mpfr_round. |
- |
-Copyright 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, Inc. |
-Contributed by the Arenaire and Cacao projects, INRIA. |
- |
-This file is part of the GNU MPFR Library. |
- |
-The GNU MPFR Library is free software; you can redistribute it and/or modify |
-it under the terms of the GNU Lesser General Public License as published by |
-the Free Software Foundation; either version 2.1 of the License, or (at your |
-option) any later version. |
- |
-The GNU MPFR Library is distributed in the hope that it will be useful, but |
-WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY |
-or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public |
-License for more details. |
- |
-You should have received a copy of the GNU Lesser General Public License |
-along with the GNU MPFR Library; see the file COPYING.LIB. If not, write to |
-the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, |
-MA 02110-1301, USA. */ |
- |
-#include <stdio.h> |
-#include <stdlib.h> |
-#include <string.h> |
- |
-#include "mpfr-test.h" |
- |
-#if __MPFR_STDC (199901L) |
-# include <math.h> |
-#endif |
- |
-static void |
-special (void) |
-{ |
- mpfr_t x, y; |
- mp_exp_t emax; |
- |
- mpfr_init (x); |
- mpfr_init (y); |
- |
- mpfr_set_nan (x); |
- mpfr_rint (y, x, GMP_RNDN); |
- MPFR_ASSERTN(mpfr_nan_p (y)); |
- |
- mpfr_set_inf (x, 1); |
- mpfr_rint (y, x, GMP_RNDN); |
- MPFR_ASSERTN(mpfr_inf_p (y) && mpfr_sgn (y) > 0); |
- |
- mpfr_set_inf (x, -1); |
- mpfr_rint (y, x, GMP_RNDN); |
- MPFR_ASSERTN(mpfr_inf_p (y) && mpfr_sgn (y) < 0); |
- |
- mpfr_set_ui (x, 0, GMP_RNDN); |
- mpfr_rint (y, x, GMP_RNDN); |
- MPFR_ASSERTN(mpfr_cmp_ui (y, 0) == 0 && MPFR_IS_POS(y)); |
- |
- mpfr_set_ui (x, 0, GMP_RNDN); |
- mpfr_neg (x, x, GMP_RNDN); |
- mpfr_rint (y, x, GMP_RNDN); |
- MPFR_ASSERTN(mpfr_cmp_ui (y, 0) == 0 && MPFR_IS_NEG(y)); |
- |
- /* coverage test */ |
- mpfr_set_prec (x, 2); |
- mpfr_set_ui (x, 1, GMP_RNDN); |
- mpfr_mul_2exp (x, x, mp_bits_per_limb, GMP_RNDN); |
- mpfr_rint (y, x, GMP_RNDN); |
- MPFR_ASSERTN(mpfr_cmp (y, x) == 0); |
- |
- /* another coverage test */ |
- emax = mpfr_get_emax (); |
- set_emax (1); |
- mpfr_set_prec (x, 3); |
- mpfr_set_str_binary (x, "1.11E0"); |
- mpfr_set_prec (y, 2); |
- mpfr_rint (y, x, GMP_RNDU); /* x rounds to 1.0E1=0.1E2 which overflows */ |
- MPFR_ASSERTN(mpfr_inf_p (y) && mpfr_sgn (y) > 0); |
- set_emax (emax); |
- |
- /* yet another */ |
- mpfr_set_prec (x, 97); |
- mpfr_set_prec (y, 96); |
- mpfr_set_str_binary (x, "-0.1011111001101111000111011100011100000110110110110000000111010001000101001111101010101011010111100E97"); |
- mpfr_rint (y, x, GMP_RNDN); |
- MPFR_ASSERTN(mpfr_cmp (y, x) == 0); |
- |
- mpfr_set_prec (x, 53); |
- mpfr_set_prec (y, 53); |
- mpfr_set_str_binary (x, "0.10101100000000101001010101111111000000011111010000010E-1"); |
- mpfr_rint (y, x, GMP_RNDU); |
- MPFR_ASSERTN(mpfr_cmp_ui (y, 1) == 0); |
- mpfr_rint (y, x, GMP_RNDD); |
- MPFR_ASSERTN(mpfr_cmp_ui (y, 0) == 0 && MPFR_IS_POS(y)); |
- |
- mpfr_set_prec (x, 36); |
- mpfr_set_prec (y, 2); |
- mpfr_set_str_binary (x, "-11000110101010111111110111001.0000100"); |
- mpfr_rint (y, x, GMP_RNDN); |
- mpfr_set_str_binary (x, "-11E27"); |
- MPFR_ASSERTN(mpfr_cmp (y, x) == 0); |
- |
- mpfr_set_prec (x, 39); |
- mpfr_set_prec (y, 29); |
- mpfr_set_str_binary (x, "-0.100010110100011010001111001001001100111E39"); |
- mpfr_rint (y, x, GMP_RNDN); |
- mpfr_set_str_binary (x, "-0.10001011010001101000111100101E39"); |
- MPFR_ASSERTN(mpfr_cmp (y, x) == 0); |
- |
- mpfr_set_prec (x, 46); |
- mpfr_set_prec (y, 32); |
- mpfr_set_str_binary (x, "-0.1011100110100101000001011111101011001001101001E32"); |
- mpfr_rint (y, x, GMP_RNDN); |
- mpfr_set_str_binary (x, "-0.10111001101001010000010111111011E32"); |
- MPFR_ASSERTN(mpfr_cmp (y, x) == 0); |
- |
- /* coverage test for mpfr_round */ |
- mpfr_set_prec (x, 3); |
- mpfr_set_str_binary (x, "1.01E1"); /* 2.5 */ |
- mpfr_set_prec (y, 2); |
- mpfr_round (y, x); |
- /* since mpfr_round breaks ties away, should give 3 and not 2 as with |
- the "round to even" rule */ |
- MPFR_ASSERTN(mpfr_cmp_ui (y, 3) == 0); |
- /* same test for the function */ |
- (mpfr_round) (y, x); |
- MPFR_ASSERTN(mpfr_cmp_ui (y, 3) == 0); |
- |
- mpfr_set_prec (x, 6); |
- mpfr_set_prec (y, 3); |
- mpfr_set_str_binary (x, "110.111"); |
- mpfr_round (y, x); |
- if (mpfr_cmp_ui (y, 7)) |
- { |
- printf ("Error in round(110.111)\n"); |
- exit (1); |
- } |
- |
- /* Bug found by Mark J Watkins */ |
- mpfr_set_prec (x, 84); |
- mpfr_set_str_binary (x, |
- "0.110011010010001000000111101101001111111100101110010000000000000" \ |
- "000000000000000000000E32"); |
- mpfr_round (x, x); |
- if (mpfr_cmp_str (x, "0.1100110100100010000001111011010100000000000000" \ |
- "00000000000000000000000000000000000000E32", 2, GMP_RNDN)) |
- { |
- printf ("Rounding error when dest=src\n"); |
- exit (1); |
- } |
- |
- mpfr_clear (x); |
- mpfr_clear (y); |
-} |
- |
-#if __MPFR_STDC (199901L) |
- |
-static void |
-test_fct (double (*f)(double), int (*g)(), char *s, mp_rnd_t r) |
-{ |
- double d, y; |
- mpfr_t dd, yy; |
- |
- mpfr_init2 (dd, 53); |
- mpfr_init2 (yy, 53); |
- for (d = -5.0; d <= 5.0; d += 0.25) |
- { |
- mpfr_set_d (dd, d, r); |
- y = (*f)(d); |
- if (g == &mpfr_rint) |
- mpfr_rint (yy, dd, r); |
- else |
- (*g)(yy, dd); |
- mpfr_set_d (dd, y, r); |
- if (mpfr_cmp (yy, dd)) |
- { |
- printf ("test_against_libc: incorrect result for %s, rnd = %s," |
- " d = %g\ngot ", s, mpfr_print_rnd_mode (r), d); |
- mpfr_out_str (stdout, 10, 0, yy, GMP_RNDN); |
- printf (" instead of %g\n", y); |
- exit (1); |
- } |
- } |
- mpfr_clear (dd); |
- mpfr_clear (yy); |
-} |
- |
-#define TEST_FCT(F) test_fct (&F, &mpfr_##F, #F, r) |
- |
-static void |
-test_against_libc (void) |
-{ |
- mp_rnd_t r = GMP_RNDN; |
- |
-#if HAVE_ROUND |
- TEST_FCT (round); |
-#endif |
-#if HAVE_TRUNC |
- TEST_FCT (trunc); |
-#endif |
-#if HAVE_FLOOR |
- TEST_FCT (floor); |
-#endif |
-#if HAVE_CEIL |
- TEST_FCT (ceil); |
-#endif |
-#if HAVE_NEARBYINT |
- for (r = 0; r < GMP_RND_MAX ; r++) |
- if (mpfr_set_machine_rnd_mode (r) == 0) |
- test_fct (&nearbyint, &mpfr_rint, "rint", r); |
-#endif |
-} |
- |
-#endif |
- |
-static void |
-err (char *str, mp_size_t s, mpfr_t x, mpfr_t y, mp_prec_t p, mp_rnd_t r, |
- int trint, int inexact) |
-{ |
- printf ("Error: %s\ns = %u, p = %u, r = %s, trint = %d, inexact = %d\nx = ", |
- str, (unsigned int) s, (unsigned int) p, mpfr_print_rnd_mode (r), |
- trint, inexact); |
- mpfr_print_binary (x); |
- printf ("\ny = "); |
- mpfr_print_binary (y); |
- printf ("\n"); |
- exit (1); |
-} |
- |
-int |
-main (int argc, char *argv[]) |
-{ |
- mp_size_t s; |
- mpz_t z; |
- mp_prec_t p; |
- mpfr_t x, y, t, u, v; |
- int r; |
- int inexact, sign_t; |
- |
- tests_start_mpfr (); |
- |
- mpfr_init (x); |
- mpfr_init (y); |
- mpz_init (z); |
- mpfr_init (t); |
- mpfr_init (u); |
- mpfr_init (v); |
- mpz_set_ui (z, 1); |
- for (s = 2; s < 100; s++) |
- { |
- /* z has exactly s bits */ |
- |
- mpz_mul_2exp (z, z, 1); |
- if (randlimb () % 2) |
- mpz_add_ui (z, z, 1); |
- mpfr_set_prec (x, s); |
- mpfr_set_prec (t, s); |
- mpfr_set_prec (u, s); |
- if (mpfr_set_z (x, z, GMP_RNDN)) |
- { |
- printf ("Error: mpfr_set_z should be exact (s = %u)\n", |
- (unsigned int) s); |
- exit (1); |
- } |
- if (randlimb () % 2) |
- mpfr_neg (x, x, GMP_RNDN); |
- if (randlimb () % 2) |
- mpfr_div_2ui (x, x, randlimb () % s, GMP_RNDN); |
- for (p = 2; p < 100; p++) |
- { |
- int trint; |
- mpfr_set_prec (y, p); |
- mpfr_set_prec (v, p); |
- for (r = 0; r < GMP_RND_MAX ; r++) |
- for (trint = 0; trint < 3; trint++) |
- { |
- if (trint == 2) |
- inexact = mpfr_rint (y, x, (mp_rnd_t) r); |
- else if (r == GMP_RNDN) |
- inexact = mpfr_round (y, x); |
- else if (r == GMP_RNDZ) |
- inexact = (trint ? mpfr_trunc (y, x) : |
- mpfr_rint_trunc (y, x, GMP_RNDZ)); |
- else if (r == GMP_RNDU) |
- inexact = (trint ? mpfr_ceil (y, x) : |
- mpfr_rint_ceil (y, x, GMP_RNDU)); |
- else /* r = GMP_RNDD */ |
- inexact = (trint ? mpfr_floor (y, x) : |
- mpfr_rint_floor (y, x, GMP_RNDD)); |
- if (mpfr_sub (t, y, x, GMP_RNDN)) |
- err ("subtraction 1 should be exact", |
- s, x, y, p, (mp_rnd_t) r, trint, inexact); |
- sign_t = mpfr_cmp_ui (t, 0); |
- if (trint != 0 && |
- (((inexact == 0) && (sign_t != 0)) || |
- ((inexact < 0) && (sign_t >= 0)) || |
- ((inexact > 0) && (sign_t <= 0)))) |
- err ("wrong inexact flag", s, x, y, p, (mp_rnd_t) r, trint, inexact); |
- if (inexact == 0) |
- continue; /* end of the test for exact results */ |
- |
- if (((r == GMP_RNDD || (r == GMP_RNDZ && MPFR_SIGN (x) > 0)) |
- && inexact > 0) || |
- ((r == GMP_RNDU || (r == GMP_RNDZ && MPFR_SIGN (x) < 0)) |
- && inexact < 0)) |
- err ("wrong rounding direction", |
- s, x, y, p, (mp_rnd_t) r, trint, inexact); |
- if (inexact < 0) |
- { |
- mpfr_add_ui (v, y, 1, GMP_RNDU); |
- if (mpfr_cmp (v, x) <= 0) |
- err ("representable integer between x and its " |
- "rounded value", s, x, y, p, (mp_rnd_t) r, trint, inexact); |
- } |
- else |
- { |
- mpfr_sub_ui (v, y, 1, GMP_RNDD); |
- if (mpfr_cmp (v, x) >= 0) |
- err ("representable integer between x and its " |
- "rounded value", s, x, y, p, (mp_rnd_t) r, trint, inexact); |
- } |
- if (r == GMP_RNDN) |
- { |
- int cmp; |
- if (mpfr_sub (u, v, x, GMP_RNDN)) |
- err ("subtraction 2 should be exact", |
- s, x, y, p, (mp_rnd_t) r, trint, inexact); |
- cmp = mpfr_cmp_abs (t, u); |
- if (cmp > 0) |
- err ("faithful rounding, but not the nearest integer", |
- s, x, y, p, (mp_rnd_t) r, trint, inexact); |
- if (cmp < 0) |
- continue; |
- /* |t| = |u|: x is the middle of two consecutive |
- representable integers. */ |
- if (trint == 2) |
- { |
- /* halfway case for mpfr_rint in GMP_RNDN rounding |
- mode: round to an even integer or mantissa. */ |
- mpfr_div_2ui (y, y, 1, GMP_RNDZ); |
- if (!mpfr_integer_p (y)) |
- err ("halfway case for mpfr_rint, result isn't an" |
- " even integer", s, x, y, p, (mp_rnd_t) r, trint, inexact); |
- /* If floor(x) and ceil(x) aren't both representable |
- integers, the mantissa must be even. */ |
- mpfr_sub (v, v, y, GMP_RNDN); |
- mpfr_abs (v, v, GMP_RNDN); |
- if (mpfr_cmp_ui (v, 1) != 0) |
- { |
- mpfr_div_2si (y, y, MPFR_EXP (y) - MPFR_PREC (y) |
- + 1, GMP_RNDN); |
- if (!mpfr_integer_p (y)) |
- err ("halfway case for mpfr_rint, mantissa isn't" |
- " even", s, x, y, p, (mp_rnd_t) r, trint, inexact); |
- } |
- } |
- else |
- { /* halfway case for mpfr_round: x must have been |
- rounded away from zero. */ |
- if ((MPFR_SIGN (x) > 0 && inexact < 0) || |
- (MPFR_SIGN (x) < 0 && inexact > 0)) |
- err ("halfway case for mpfr_round, bad rounding" |
- " direction", s, x, y, p, (mp_rnd_t) r, trint, inexact); |
- } |
- } |
- } |
- } |
- } |
- mpfr_clear (x); |
- mpfr_clear (y); |
- mpz_clear (z); |
- mpfr_clear (t); |
- mpfr_clear (u); |
- mpfr_clear (v); |
- |
- special (); |
- |
-#if __MPFR_STDC (199901L) |
- if (argc > 1 && strcmp (argv[1], "-s") == 0) |
- test_against_libc (); |
-#endif |
- |
- tests_end_mpfr (); |
- return 0; |
-} |