tcan_round.c revision 1.1 1 1.1 mrg /* Test file for mpfr_can_round.
2 1.1 mrg
3 1.1 mrg Copyright 1999, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc.
4 1.1 mrg Contributed by the Arenaire and Cacao projects, INRIA.
5 1.1 mrg
6 1.1 mrg This file is part of the GNU MPFR Library.
7 1.1 mrg
8 1.1 mrg The GNU MPFR Library is free software; you can redistribute it and/or modify
9 1.1 mrg it under the terms of the GNU Lesser General Public License as published by
10 1.1 mrg the Free Software Foundation; either version 3 of the License, or (at your
11 1.1 mrg option) any later version.
12 1.1 mrg
13 1.1 mrg The GNU MPFR Library is distributed in the hope that it will be useful, but
14 1.1 mrg WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
15 1.1 mrg or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
16 1.1 mrg License for more details.
17 1.1 mrg
18 1.1 mrg You should have received a copy of the GNU Lesser General Public License
19 1.1 mrg along with the GNU MPFR Library; see the file COPYING.LESSER. If not, see
20 1.1 mrg http://www.gnu.org/licenses/ or write to the Free Software Foundation, Inc.,
21 1.1 mrg 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. */
22 1.1 mrg
23 1.1 mrg #include <stdio.h>
24 1.1 mrg #include <stdlib.h>
25 1.1 mrg
26 1.1 mrg #include "mpfr-test.h"
27 1.1 mrg
28 1.1 mrg #define MAX_LIMB_SIZE 100
29 1.1 mrg
30 1.1 mrg static void
31 1.1 mrg check_round_p (void)
32 1.1 mrg {
33 1.1 mrg mp_limb_t buf[MAX_LIMB_SIZE];
34 1.1 mrg mp_size_t n, i;
35 1.1 mrg mpfr_prec_t p;
36 1.1 mrg mpfr_exp_t err;
37 1.1 mrg int r1, r2;
38 1.1 mrg
39 1.1 mrg for (n = 2 ; n <= MAX_LIMB_SIZE ; n++)
40 1.1 mrg {
41 1.1 mrg /* avoid mpn_random which leaks memory */
42 1.1 mrg for (i = 0; i < n; i++)
43 1.1 mrg buf[i] = randlimb ();
44 1.1 mrg p = randlimb() % ((n-1) * GMP_NUMB_BITS) + MPFR_PREC_MIN;
45 1.1 mrg err = p + randlimb () % GMP_NUMB_BITS;
46 1.1 mrg r1 = mpfr_round_p (buf, n, err, p);
47 1.1 mrg r2 = mpfr_can_round_raw (buf, n, MPFR_SIGN_POS, err,
48 1.1 mrg MPFR_RNDN, MPFR_RNDZ, p);
49 1.1 mrg if (r1 != r2)
50 1.1 mrg {
51 1.1 mrg printf ("mpfr_round_p(%d) != mpfr_can_round(%d)!\n"
52 1.1 mrg "bn = %ld, err0 = %ld, prec = %lu\nbp = ",
53 1.1 mrg r1, r2, n, err, (unsigned long) p);
54 1.1 mrg gmp_printf ("%NX\n", buf, n);
55 1.1 mrg exit (1);
56 1.1 mrg }
57 1.1 mrg }
58 1.1 mrg }
59 1.1 mrg
60 1.1 mrg int
61 1.1 mrg main (void)
62 1.1 mrg {
63 1.1 mrg mpfr_t x;
64 1.1 mrg mpfr_prec_t i, j;
65 1.1 mrg
66 1.1 mrg tests_start_mpfr ();
67 1.1 mrg
68 1.1 mrg /* checks that rounds to nearest sets the last
69 1.1 mrg bit to zero in case of equal distance */
70 1.1 mrg mpfr_init2 (x, 59);
71 1.1 mrg mpfr_set_str_binary (x, "-0.10010001010111000011110010111010111110000000111101100111111E663");
72 1.1 mrg if (mpfr_can_round (x, 54, MPFR_RNDZ, MPFR_RNDZ, 53) != 0)
73 1.1 mrg {
74 1.1 mrg printf ("Error (1) in mpfr_can_round\n");
75 1.1 mrg exit (1);
76 1.1 mrg }
77 1.1 mrg
78 1.1 mrg mpfr_set_str_binary (x, "-Inf");
79 1.1 mrg if (mpfr_can_round (x, 2000, MPFR_RNDZ, MPFR_RNDZ, 2000) != 0)
80 1.1 mrg {
81 1.1 mrg printf ("Error (2) in mpfr_can_round\n");
82 1.1 mrg exit (1);
83 1.1 mrg }
84 1.1 mrg
85 1.1 mrg mpfr_set_prec (x, 64);
86 1.1 mrg mpfr_set_str_binary (x, "0.1011001000011110000110000110001111101011000010001110011000000000");
87 1.1 mrg if (mpfr_can_round (x, 65, MPFR_RNDN, MPFR_RNDN, 54))
88 1.1 mrg {
89 1.1 mrg printf ("Error (3) in mpfr_can_round\n");
90 1.1 mrg exit (1);
91 1.1 mrg }
92 1.1 mrg
93 1.1 mrg mpfr_set_prec (x, 137);
94 1.1 mrg mpfr_set_str_binary (x, "-0.10111001101001010110011000110100111010011101101010010100101100001110000100111111011101010110001010111100100101110111100001000010000000000E-97");
95 1.1 mrg if (mpfr_can_round (x, 132, MPFR_RNDU, MPFR_RNDZ, 128) == 0)
96 1.1 mrg {
97 1.1 mrg printf ("Error (4) in mpfr_can_round\n");
98 1.1 mrg exit (1);
99 1.1 mrg }
100 1.1 mrg
101 1.1 mrg /* in the following, we can round but cannot determine the inexact flag */
102 1.1 mrg mpfr_set_prec (x, 86);
103 1.1 mrg mpfr_set_str_binary (x, "-0.11100100010011001111011010100111101010011000000000000000000000000000000000000000000000E-80");
104 1.1 mrg if (mpfr_can_round (x, 81, MPFR_RNDU, MPFR_RNDZ, 44) == 0)
105 1.1 mrg {
106 1.1 mrg printf ("Error (5) in mpfr_can_round\n");
107 1.1 mrg exit (1);
108 1.1 mrg }
109 1.1 mrg
110 1.1 mrg mpfr_set_prec (x, 62);
111 1.1 mrg mpfr_set_str (x, "0.ff4ca619c76ba69", 16, MPFR_RNDZ);
112 1.1 mrg for (i = 30; i < 99; i++)
113 1.1 mrg for (j = 30; j < 99; j++)
114 1.1 mrg {
115 1.1 mrg int r1, r2;
116 1.1 mrg for (r1 = 0; r1 < MPFR_RND_MAX ; r1++)
117 1.1 mrg for (r2 = 0; r2 < MPFR_RND_MAX ; r2++)
118 1.1 mrg mpfr_can_round (x, i, (mpfr_rnd_t) r1, (mpfr_rnd_t) r2, j); /* test for assertions */
119 1.1 mrg }
120 1.1 mrg
121 1.1 mrg mpfr_clear (x);
122 1.1 mrg
123 1.1 mrg check_round_p ();
124 1.1 mrg
125 1.1 mrg tests_end_mpfr ();
126 1.1 mrg return 0;
127 1.1 mrg }
128