tget_z.c revision 1.1.1.3 1 1.1 mrg /* Test file for mpz_set_fr / mpfr_get_z.
2 1.1 mrg
3 1.1.1.3 mrg Copyright 2004, 2006-2016 Free Software Foundation, Inc.
4 1.1.1.3 mrg Contributed by the AriC and Caramba 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 static void
29 1.1 mrg check_diff (void)
30 1.1 mrg {
31 1.1 mrg int inex;
32 1.1 mrg mpfr_t x;
33 1.1 mrg mpz_t z;
34 1.1 mrg mpfr_exp_t emin;
35 1.1 mrg
36 1.1 mrg mpz_init (z);
37 1.1 mrg mpfr_init2 (x, 2);
38 1.1 mrg
39 1.1 mrg mpfr_set_ui (x, 2047, MPFR_RNDU);
40 1.1 mrg mpz_set_fr (z, x, MPFR_RNDN);
41 1.1 mrg if (mpz_cmp_ui (z, 2048) != 0)
42 1.1 mrg {
43 1.1 mrg printf ("get_z RU 2048 failed\n");
44 1.1 mrg exit (1);
45 1.1 mrg }
46 1.1 mrg
47 1.1 mrg mpfr_set_prec (x, 6);
48 1.1 mrg mpfr_set_str (x, "17.5", 10, MPFR_RNDN);
49 1.1 mrg inex = mpfr_get_z (z, x, MPFR_RNDN);
50 1.1 mrg if (inex <= 0 || mpz_cmp_ui (z, 18) != 0)
51 1.1 mrg {
52 1.1 mrg printf ("get_z RN 17.5 failed\n");
53 1.1 mrg exit (1);
54 1.1 mrg }
55 1.1 mrg
56 1.1 mrg /* save default emin */
57 1.1 mrg emin = mpfr_get_emin ();;
58 1.1 mrg
59 1.1 mrg mpfr_set_emin (17);
60 1.1 mrg mpfr_set_ui (x, 0, MPFR_RNDN);
61 1.1 mrg inex = mpfr_get_z (z, x, MPFR_RNDN);
62 1.1 mrg if (inex != 0 || mpz_cmp_ui (z, 0) != 0)
63 1.1 mrg {
64 1.1 mrg printf ("get_z 0 failed\n");
65 1.1 mrg exit (1);
66 1.1 mrg }
67 1.1 mrg
68 1.1 mrg /* restore default emin */
69 1.1 mrg mpfr_set_emin (emin);
70 1.1 mrg
71 1.1 mrg mpfr_clear (x);
72 1.1 mrg mpz_clear (z);
73 1.1 mrg }
74 1.1 mrg
75 1.1 mrg static void
76 1.1 mrg check_one (mpz_ptr z)
77 1.1 mrg {
78 1.1 mrg int inex;
79 1.1 mrg int sh, neg;
80 1.1 mrg mpfr_t f;
81 1.1 mrg mpz_t got;
82 1.1 mrg
83 1.1 mrg mpfr_init2 (f, MAX( mpz_sizeinbase (z, 2), MPFR_PREC_MIN) );
84 1.1 mrg mpz_init (got);
85 1.1 mrg
86 1.1 mrg for (sh = -2*GMP_NUMB_BITS ; sh < 2*GMP_NUMB_BITS ; sh++)
87 1.1 mrg {
88 1.1 mrg for (neg = 0; neg <= 1; neg++)
89 1.1 mrg {
90 1.1 mrg mpz_neg (z, z);
91 1.1 mrg mpfr_set_z (f, z, MPFR_RNDN);
92 1.1 mrg
93 1.1 mrg if (sh < 0)
94 1.1 mrg {
95 1.1 mrg mpz_tdiv_q_2exp (z, z, -sh);
96 1.1 mrg mpfr_div_2exp (f, f, -sh, MPFR_RNDN);
97 1.1 mrg }
98 1.1 mrg else
99 1.1 mrg {
100 1.1 mrg mpz_mul_2exp (z, z, sh);
101 1.1 mrg mpfr_mul_2exp (f, f, sh, MPFR_RNDN);
102 1.1 mrg }
103 1.1 mrg
104 1.1 mrg inex = mpfr_get_z (got, f, MPFR_RNDZ);
105 1.1 mrg
106 1.1 mrg if (mpz_cmp (got, z) != 0)
107 1.1 mrg {
108 1.1 mrg printf ("Wrong result for shift=%d\n", sh);
109 1.1 mrg printf (" f "); mpfr_dump (f);
110 1.1 mrg printf (" got "); mpz_dump (got);
111 1.1 mrg printf (" want "); mpz_dump (z);
112 1.1 mrg exit (1);
113 1.1 mrg }
114 1.1 mrg if (! SAME_SIGN (inex, - mpfr_cmp_z (f, z)))
115 1.1 mrg {
116 1.1 mrg printf ("Wrong inexact value for shift=%d\n", sh);
117 1.1 mrg printf (" f "); mpfr_dump (f);
118 1.1 mrg printf (" got %+d\n", inex);
119 1.1 mrg printf (" want %+d\n", -mpfr_cmp_z (f, z));
120 1.1 mrg exit (1);
121 1.1 mrg }
122 1.1 mrg }
123 1.1 mrg }
124 1.1 mrg
125 1.1 mrg mpfr_clear (f);
126 1.1 mrg mpz_clear (got);
127 1.1 mrg }
128 1.1 mrg
129 1.1 mrg static void
130 1.1 mrg check (void)
131 1.1 mrg {
132 1.1 mrg mpz_t z;
133 1.1 mrg
134 1.1 mrg mpz_init (z);
135 1.1 mrg
136 1.1 mrg mpz_set_ui (z, 0L);
137 1.1 mrg check_one (z);
138 1.1 mrg
139 1.1 mrg mpz_set_si (z, 123L);
140 1.1 mrg check_one (z);
141 1.1 mrg
142 1.1 mrg mpz_rrandomb (z, RANDS, 2*GMP_NUMB_BITS);
143 1.1 mrg check_one (z);
144 1.1 mrg
145 1.1 mrg mpz_rrandomb (z, RANDS, 5*GMP_NUMB_BITS);
146 1.1 mrg check_one (z);
147 1.1 mrg
148 1.1 mrg mpz_clear (z);
149 1.1 mrg }
150 1.1 mrg
151 1.1 mrg static void
152 1.1 mrg special (void)
153 1.1 mrg {
154 1.1 mrg int inex;
155 1.1 mrg mpfr_t x;
156 1.1 mrg mpz_t z;
157 1.1 mrg int i;
158 1.1 mrg mpfr_exp_t e;
159 1.1 mrg
160 1.1 mrg mpfr_init2 (x, 2);
161 1.1 mrg mpz_init (z);
162 1.1 mrg
163 1.1 mrg for (i = -1; i <= 1; i++)
164 1.1 mrg {
165 1.1 mrg if (i != 0)
166 1.1 mrg mpfr_set_nan (x);
167 1.1 mrg else
168 1.1 mrg mpfr_set_inf (x, i);
169 1.1 mrg mpfr_clear_flags ();
170 1.1 mrg inex = mpfr_get_z (z, x, MPFR_RNDN);
171 1.1 mrg if (!mpfr_erangeflag_p () || inex != 0 || mpz_cmp_ui (z, 0) != 0)
172 1.1 mrg {
173 1.1 mrg printf ("special() failed on mpfr_get_z for i = %d\n", i);
174 1.1 mrg exit (1);
175 1.1 mrg }
176 1.1 mrg mpfr_clear_flags ();
177 1.1 mrg e = mpfr_get_z_2exp (z, x);
178 1.1 mrg if (!mpfr_erangeflag_p () || e != __gmpfr_emin ||
179 1.1 mrg mpz_cmp_ui (z, 0) != 0)
180 1.1 mrg {
181 1.1 mrg printf ("special() failed on mpfr_get_z_2exp for i = %d\n", i);
182 1.1 mrg exit (1);
183 1.1 mrg }
184 1.1 mrg }
185 1.1 mrg
186 1.1 mrg mpfr_clear (x);
187 1.1 mrg mpz_clear (z);
188 1.1 mrg }
189 1.1 mrg
190 1.1 mrg int
191 1.1 mrg main (void)
192 1.1 mrg {
193 1.1 mrg tests_start_mpfr ();
194 1.1 mrg
195 1.1 mrg check ();
196 1.1 mrg check_diff ();
197 1.1 mrg special ();
198 1.1 mrg
199 1.1 mrg tests_end_mpfr ();
200 1.1 mrg return 0;
201 1.1 mrg }
202