tset_si.c revision 1.1.1.2 1 1.1 mrg /* Test file for mpfr_set_si and mpfr_set_ui.
2 1.1 mrg
3 1.1.1.2 mrg Copyright 1999, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 Free Software Foundation, Inc.
4 1.1.1.2 mrg Contributed by the AriC and Caramel 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 #include <limits.h>
26 1.1 mrg
27 1.1 mrg #include "mpfr-test.h"
28 1.1 mrg
29 1.1 mrg #define ERROR(str) {printf("Error for "str"\n"); exit(1);}
30 1.1 mrg
31 1.1 mrg static void
32 1.1 mrg test_2exp (void)
33 1.1 mrg {
34 1.1 mrg mpfr_t x;
35 1.1 mrg int res;
36 1.1 mrg
37 1.1 mrg mpfr_init2 (x, 32);
38 1.1 mrg
39 1.1 mrg mpfr_set_ui_2exp (x, 1, 0, MPFR_RNDN);
40 1.1 mrg if (mpfr_cmp_ui(x, 1))
41 1.1 mrg ERROR("(1U,0)");
42 1.1 mrg
43 1.1 mrg mpfr_set_ui_2exp (x, 1024, -10, MPFR_RNDN);
44 1.1 mrg if (mpfr_cmp_ui(x, 1))
45 1.1 mrg ERROR("(1024U,-10)");
46 1.1 mrg
47 1.1 mrg mpfr_set_ui_2exp (x, 1024, 10, MPFR_RNDN);
48 1.1 mrg if (mpfr_cmp_ui(x, 1024*1024))
49 1.1 mrg ERROR("(1024U,+10)");
50 1.1 mrg
51 1.1 mrg mpfr_set_si_2exp (x, -1024L * 1024L, -10, MPFR_RNDN);
52 1.1 mrg if (mpfr_cmp_si(x, -1024))
53 1.1 mrg ERROR("(1M,-10)");
54 1.1 mrg
55 1.1 mrg mpfr_set_ui_2exp (x, 0x92345678, 16, MPFR_RNDN);
56 1.1 mrg if (mpfr_cmp_str (x, "92345678@4", 16, MPFR_RNDN))
57 1.1 mrg ERROR("(x92345678U,+16)");
58 1.1 mrg
59 1.1 mrg mpfr_set_si_2exp (x, -0x1ABCDEF0, -256, MPFR_RNDN);
60 1.1 mrg if (mpfr_cmp_str (x, "-1ABCDEF0@-64", 16, MPFR_RNDN))
61 1.1 mrg ERROR("(-x1ABCDEF0,-256)");
62 1.1 mrg
63 1.1 mrg mpfr_set_prec (x, 2);
64 1.1 mrg res = mpfr_set_si_2exp (x, 7, 10, MPFR_RNDU);
65 1.1 mrg if (mpfr_cmp_ui (x, 1<<13) || res <= 0)
66 1.1 mrg ERROR ("Prec 2 + si_2exp");
67 1.1 mrg
68 1.1 mrg res = mpfr_set_ui_2exp (x, 7, 10, MPFR_RNDU);
69 1.1 mrg if (mpfr_cmp_ui (x, 1<<13) || res <= 0)
70 1.1 mrg ERROR ("Prec 2 + ui_2exp");
71 1.1 mrg
72 1.1 mrg mpfr_clear_flags ();
73 1.1 mrg mpfr_set_ui_2exp (x, 17, MPFR_EMAX_MAX, MPFR_RNDN);
74 1.1 mrg if (!mpfr_inf_p (x) || MPFR_IS_NEG (x))
75 1.1 mrg ERROR ("mpfr_set_ui_2exp and overflow (bad result)");
76 1.1 mrg if (!mpfr_overflow_p ())
77 1.1 mrg ERROR ("mpfr_set_ui_2exp and overflow (overflow flag not set)");
78 1.1 mrg
79 1.1 mrg mpfr_clear_flags ();
80 1.1 mrg mpfr_set_si_2exp (x, 17, MPFR_EMAX_MAX, MPFR_RNDN);
81 1.1 mrg if (!mpfr_inf_p (x) || MPFR_IS_NEG (x))
82 1.1 mrg ERROR ("mpfr_set_si_2exp (pos) and overflow (bad result)");
83 1.1 mrg if (!mpfr_overflow_p ())
84 1.1 mrg ERROR ("mpfr_set_si_2exp (pos) and overflow (overflow flag not set)");
85 1.1 mrg
86 1.1 mrg mpfr_clear_flags ();
87 1.1 mrg mpfr_set_si_2exp (x, -17, MPFR_EMAX_MAX, MPFR_RNDN);
88 1.1 mrg if (!mpfr_inf_p (x) || MPFR_IS_POS (x))
89 1.1 mrg ERROR ("mpfr_set_si_2exp (neg) and overflow (bad result)");
90 1.1 mrg if (!mpfr_overflow_p ())
91 1.1 mrg ERROR ("mpfr_set_si_2exp (neg) and overflow (overflow flag not set)");
92 1.1 mrg
93 1.1 mrg mpfr_clear (x);
94 1.1 mrg }
95 1.1 mrg
96 1.1 mrg static void
97 1.1 mrg test_macros (void)
98 1.1 mrg {
99 1.1 mrg mpfr_t x[3];
100 1.1 mrg mpfr_ptr p;
101 1.1 mrg int r;
102 1.1 mrg
103 1.1 mrg mpfr_inits (x[0], x[1], x[2], (mpfr_ptr) 0);
104 1.1 mrg p = x[0];
105 1.1 mrg r = 0;
106 1.1 mrg mpfr_set_ui (p++, 0, (mpfr_rnd_t) r++);
107 1.1 mrg if (p != x[1] || r != 1)
108 1.1 mrg {
109 1.1 mrg printf ("Error in mpfr_set_ui macro: p - x[0] = %d (expecting 1), "
110 1.1 mrg "r = %d (expecting 1)\n", (int) (p - x[0]), r);
111 1.1 mrg exit (1);
112 1.1 mrg }
113 1.1 mrg p = x[0];
114 1.1 mrg r = 0;
115 1.1 mrg mpfr_set_si (p++, 0, (mpfr_rnd_t) r++);
116 1.1 mrg if (p != x[1] || r != 1)
117 1.1 mrg {
118 1.1 mrg printf ("Error in mpfr_set_si macro: p - x[0] = %d (expecting 1), "
119 1.1 mrg "r = %d (expecting 1)\n", (int) (p - x[0]), r);
120 1.1 mrg exit (1);
121 1.1 mrg }
122 1.1 mrg mpfr_clears (x[0], x[1], x[2], (mpfr_ptr) 0);
123 1.1 mrg }
124 1.1 mrg
125 1.1.1.2 mrg static void
126 1.1.1.2 mrg test_macros_keyword (void)
127 1.1.1.2 mrg {
128 1.1.1.2 mrg mpfr_t x;
129 1.1.1.2 mrg unsigned long i;
130 1.1.1.2 mrg
131 1.1.1.2 mrg mpfr_init2 (x, 64);
132 1.1.1.2 mrg #define MKN 0x1000000
133 1.1.1.2 mrg #define long short
134 1.1.1.2 mrg mpfr_set_ui (x, MKN, MPFR_RNDN);
135 1.1.1.2 mrg #undef long
136 1.1.1.2 mrg i = mpfr_get_ui (x, MPFR_RNDN);
137 1.1.1.2 mrg if (i != MKN)
138 1.1.1.2 mrg {
139 1.1.1.2 mrg printf ("Error in test_macros_keyword: expected 0x%lx, got 0x%lx.\n",
140 1.1.1.2 mrg (unsigned long) MKN, i);
141 1.1.1.2 mrg exit (1);
142 1.1.1.2 mrg }
143 1.1.1.2 mrg mpfr_clear (x);
144 1.1.1.2 mrg }
145 1.1.1.2 mrg
146 1.1 mrg /* FIXME: Comparing against mpfr_get_si/ui is not ideal, it'd be better to
147 1.1 mrg have all tests examine the bits in mpfr_t for what should come out. */
148 1.1 mrg
149 1.1 mrg int
150 1.1 mrg main (int argc, char *argv[])
151 1.1 mrg {
152 1.1 mrg mpfr_t x;
153 1.1 mrg long k, z, d, N;
154 1.1 mrg unsigned long zl, dl;
155 1.1 mrg int inex;
156 1.1 mrg int r;
157 1.1 mrg mpfr_exp_t emin, emax;
158 1.1 mrg int flag;
159 1.1 mrg
160 1.1 mrg tests_start_mpfr ();
161 1.1 mrg
162 1.1 mrg mpfr_init2 (x, 100);
163 1.1 mrg
164 1.1 mrg N = (argc==1) ? 100000 : atol (argv[1]);
165 1.1 mrg
166 1.1 mrg for (k = 1; k <= N; k++)
167 1.1 mrg {
168 1.1 mrg z = (long) (randlimb () & LONG_MAX) + LONG_MIN / 2;
169 1.1 mrg inex = mpfr_set_si (x, z, MPFR_RNDZ);
170 1.1 mrg d = mpfr_get_si (x, MPFR_RNDZ);
171 1.1 mrg if (d != z)
172 1.1 mrg {
173 1.1 mrg printf ("Error in mpfr_set_si: expected %ld got %ld\n", z, d);
174 1.1 mrg exit (1);
175 1.1 mrg }
176 1.1 mrg if (inex)
177 1.1 mrg {
178 1.1 mrg printf ("Error in mpfr_set_si: inex value incorrect for %ld: %d\n",
179 1.1 mrg z, inex);
180 1.1 mrg exit (1);
181 1.1 mrg }
182 1.1 mrg }
183 1.1 mrg
184 1.1 mrg for (k = 1; k <= N; k++)
185 1.1 mrg {
186 1.1 mrg zl = randlimb ();
187 1.1 mrg inex = mpfr_set_ui (x, zl, MPFR_RNDZ);
188 1.1 mrg dl = mpfr_get_ui (x, MPFR_RNDZ);
189 1.1 mrg if (dl != zl)
190 1.1 mrg {
191 1.1 mrg printf ("Error in mpfr_set_ui: expected %lu got %lu\n", zl, dl);
192 1.1 mrg exit (1);
193 1.1 mrg }
194 1.1 mrg if (inex)
195 1.1 mrg {
196 1.1 mrg printf ("Error in mpfr_set_ui: inex value incorrect for %lu: %d\n",
197 1.1 mrg zl, inex);
198 1.1 mrg exit (1);
199 1.1 mrg }
200 1.1 mrg }
201 1.1 mrg
202 1.1 mrg mpfr_set_prec (x, 2);
203 1.1 mrg if (mpfr_set_si (x, 5, MPFR_RNDZ) >= 0)
204 1.1 mrg {
205 1.1 mrg printf ("Wrong inexact flag for x=5, rnd=MPFR_RNDZ\n");
206 1.1 mrg exit (1);
207 1.1 mrg }
208 1.1 mrg
209 1.1 mrg mpfr_set_prec (x, 2);
210 1.1 mrg if (mpfr_set_si (x, -5, MPFR_RNDZ) <= 0)
211 1.1 mrg {
212 1.1 mrg printf ("Wrong inexact flag for x=-5, rnd=MPFR_RNDZ\n");
213 1.1 mrg exit (1);
214 1.1 mrg }
215 1.1 mrg
216 1.1 mrg mpfr_set_prec (x, 3);
217 1.1 mrg inex = mpfr_set_si (x, 77617, MPFR_RNDD); /* should be 65536 */
218 1.1 mrg if (MPFR_MANT(x)[0] != ((mp_limb_t)1 << (mp_bits_per_limb-1))
219 1.1 mrg || inex >= 0)
220 1.1 mrg {
221 1.1 mrg printf ("Error in mpfr_set_si(x:3, 77617, MPFR_RNDD)\n");
222 1.1 mrg mpfr_print_binary (x);
223 1.1 mrg puts ("");
224 1.1 mrg exit (1);
225 1.1 mrg }
226 1.1 mrg inex = mpfr_set_ui (x, 77617, MPFR_RNDD); /* should be 65536 */
227 1.1 mrg if (MPFR_MANT(x)[0] != ((mp_limb_t)1 << (mp_bits_per_limb-1))
228 1.1 mrg || inex >= 0)
229 1.1 mrg {
230 1.1 mrg printf ("Error in mpfr_set_ui(x:3, 77617, MPFR_RNDD)\n");
231 1.1 mrg mpfr_print_binary (x);
232 1.1 mrg puts ("");
233 1.1 mrg exit (1);
234 1.1 mrg }
235 1.1 mrg
236 1.1 mrg mpfr_set_prec (x, 2);
237 1.1 mrg inex = mpfr_set_si (x, 33096, MPFR_RNDU);
238 1.1 mrg if (mpfr_get_si (x, MPFR_RNDZ) != 49152 || inex <= 0)
239 1.1 mrg {
240 1.1 mrg printf ("Error in mpfr_set_si, exp. 49152, got %ld, inex %d\n",
241 1.1 mrg mpfr_get_si (x, MPFR_RNDZ), inex);
242 1.1 mrg exit (1);
243 1.1 mrg }
244 1.1 mrg inex = mpfr_set_ui (x, 33096, MPFR_RNDU);
245 1.1 mrg if (mpfr_get_si (x, MPFR_RNDZ) != 49152)
246 1.1 mrg {
247 1.1 mrg printf ("Error in mpfr_set_ui, exp. 49152, got %ld, inex %d\n",
248 1.1 mrg mpfr_get_si (x, MPFR_RNDZ), inex);
249 1.1 mrg exit (1);
250 1.1 mrg }
251 1.1.1.2 mrg /* Also test the mpfr_set_ui function (instead of macro). */
252 1.1.1.2 mrg inex = (mpfr_set_ui) (x, 33096, MPFR_RNDU);
253 1.1.1.2 mrg if (mpfr_get_si (x, MPFR_RNDZ) != 49152)
254 1.1.1.2 mrg {
255 1.1.1.2 mrg printf ("Error in mpfr_set_ui function, exp. 49152, got %ld, inex %d\n",
256 1.1.1.2 mrg mpfr_get_si (x, MPFR_RNDZ), inex);
257 1.1.1.2 mrg exit (1);
258 1.1.1.2 mrg }
259 1.1 mrg
260 1.1 mrg for (r = 0 ; r < MPFR_RND_MAX ; r++)
261 1.1 mrg {
262 1.1 mrg mpfr_set_si (x, -1, (mpfr_rnd_t) r);
263 1.1 mrg mpfr_set_ui (x, 0, (mpfr_rnd_t) r);
264 1.1 mrg if (MPFR_IS_NEG (x) || mpfr_get_ui (x, (mpfr_rnd_t) r) != 0)
265 1.1 mrg {
266 1.1 mrg printf ("mpfr_set_ui (x, 0) gives -0 for %s\n",
267 1.1 mrg mpfr_print_rnd_mode ((mpfr_rnd_t) r));
268 1.1 mrg exit (1);
269 1.1 mrg }
270 1.1 mrg
271 1.1 mrg mpfr_set_si (x, -1, (mpfr_rnd_t) r);
272 1.1 mrg mpfr_set_si (x, 0, (mpfr_rnd_t) r);
273 1.1 mrg if (MPFR_IS_NEG (x) || mpfr_get_si (x, (mpfr_rnd_t) r) != 0)
274 1.1 mrg {
275 1.1 mrg printf ("mpfr_set_si (x, 0) gives -0 for %s\n",
276 1.1 mrg mpfr_print_rnd_mode ((mpfr_rnd_t) r));
277 1.1 mrg exit (1);
278 1.1 mrg }
279 1.1 mrg }
280 1.1 mrg
281 1.1 mrg /* check potential bug in case mp_limb_t is unsigned */
282 1.1 mrg emax = mpfr_get_emax ();
283 1.1 mrg set_emax (0);
284 1.1 mrg mpfr_set_si (x, -1, MPFR_RNDN);
285 1.1 mrg if (mpfr_sgn (x) >= 0)
286 1.1 mrg {
287 1.1 mrg printf ("mpfr_set_si (x, -1) fails\n");
288 1.1 mrg exit (1);
289 1.1 mrg }
290 1.1 mrg set_emax (emax);
291 1.1 mrg
292 1.1 mrg emax = mpfr_get_emax ();
293 1.1 mrg set_emax (5);
294 1.1 mrg mpfr_set_prec (x, 2);
295 1.1 mrg mpfr_set_si (x, -31, MPFR_RNDN);
296 1.1 mrg if (mpfr_sgn (x) >= 0)
297 1.1 mrg {
298 1.1 mrg printf ("mpfr_set_si (x, -31) fails\n");
299 1.1 mrg exit (1);
300 1.1 mrg }
301 1.1 mrg set_emax (emax);
302 1.1 mrg
303 1.1 mrg /* test for get_ui */
304 1.1 mrg mpfr_set_ui (x, 0, MPFR_RNDN);
305 1.1 mrg MPFR_ASSERTN(mpfr_get_ui (x, MPFR_RNDN) == 0);
306 1.1 mrg mpfr_set_ui (x, ULONG_MAX, MPFR_RNDU);
307 1.1 mrg mpfr_nextabove (x);
308 1.1 mrg mpfr_get_ui (x, MPFR_RNDU);
309 1.1 mrg
310 1.1 mrg /* another test for get_ui */
311 1.1 mrg mpfr_set_prec (x, 10);
312 1.1 mrg mpfr_set_str_binary (x, "10.101");
313 1.1 mrg dl = mpfr_get_ui (x, MPFR_RNDN);
314 1.1 mrg MPFR_ASSERTN (dl == 3);
315 1.1 mrg
316 1.1 mrg mpfr_set_str_binary (x, "-1.0");
317 1.1 mrg mpfr_get_ui (x, MPFR_RNDN);
318 1.1 mrg
319 1.1 mrg mpfr_set_str_binary (x, "0.1");
320 1.1 mrg dl = mpfr_get_ui (x, MPFR_RNDN);
321 1.1 mrg MPFR_ASSERTN (dl == 0);
322 1.1 mrg dl = mpfr_get_ui (x, MPFR_RNDZ);
323 1.1 mrg MPFR_ASSERTN (dl == 0);
324 1.1 mrg dl = mpfr_get_ui (x, MPFR_RNDD);
325 1.1 mrg MPFR_ASSERTN (dl == 0);
326 1.1 mrg dl = mpfr_get_ui (x, MPFR_RNDU);
327 1.1 mrg MPFR_ASSERTN (dl == 1);
328 1.1 mrg
329 1.1 mrg /* coverage tests */
330 1.1 mrg mpfr_set_prec (x, 2);
331 1.1 mrg mpfr_set_si (x, -7, MPFR_RNDD);
332 1.1 mrg MPFR_ASSERTN(mpfr_cmp_si (x, -8) == 0);
333 1.1 mrg mpfr_set_prec (x, 2);
334 1.1 mrg mpfr_set_ui (x, 7, MPFR_RNDU);
335 1.1 mrg MPFR_ASSERTN(mpfr_cmp_ui (x, 8) == 0);
336 1.1 mrg emax = mpfr_get_emax ();
337 1.1 mrg set_emax (3);
338 1.1 mrg mpfr_set_ui (x, 7, MPFR_RNDU);
339 1.1 mrg MPFR_ASSERTN(mpfr_inf_p (x) && mpfr_sgn (x) > 0);
340 1.1 mrg set_emax (1);
341 1.1 mrg MPFR_ASSERTN( mpfr_set_ui (x, 7, MPFR_RNDU) );
342 1.1 mrg MPFR_ASSERTN(mpfr_inf_p (x) && mpfr_sgn (x) > 0);
343 1.1 mrg set_emax (emax);
344 1.1 mrg mpfr_set_ui_2exp (x, 17, -50, MPFR_RNDN);
345 1.1 mrg MPFR_ASSERTN (mpfr_get_ui (x, MPFR_RNDD) == 0);
346 1.1 mrg MPFR_ASSERTN (mpfr_get_si (x, MPFR_RNDD) == 0);
347 1.1 mrg
348 1.1 mrg /* Test for ERANGE flag + correct behaviour if overflow */
349 1.1 mrg mpfr_set_prec (x, 256);
350 1.1 mrg mpfr_set_ui (x, ULONG_MAX, MPFR_RNDN);
351 1.1 mrg mpfr_clear_erangeflag ();
352 1.1 mrg dl = mpfr_get_ui (x, MPFR_RNDN);
353 1.1 mrg if (dl != ULONG_MAX || mpfr_erangeflag_p ())
354 1.1 mrg {
355 1.1 mrg printf ("ERROR for get_ui + ERANGE + ULONG_MAX (1)\n");
356 1.1 mrg exit (1);
357 1.1 mrg }
358 1.1 mrg mpfr_add_ui (x, x, 1, MPFR_RNDN);
359 1.1 mrg dl = mpfr_get_ui (x, MPFR_RNDN);
360 1.1 mrg if (dl != ULONG_MAX || !mpfr_erangeflag_p ())
361 1.1 mrg {
362 1.1 mrg printf ("ERROR for get_ui + ERANGE + ULONG_MAX (2)\n");
363 1.1 mrg exit (1);
364 1.1 mrg }
365 1.1 mrg mpfr_set_si (x, -1, MPFR_RNDN);
366 1.1 mrg mpfr_clear_erangeflag ();
367 1.1 mrg dl = mpfr_get_ui (x, MPFR_RNDN);
368 1.1 mrg if (dl != 0 || !mpfr_erangeflag_p ())
369 1.1 mrg {
370 1.1 mrg printf ("ERROR for get_ui + ERANGE + -1 \n");
371 1.1 mrg exit (1);
372 1.1 mrg }
373 1.1 mrg mpfr_set_si (x, LONG_MAX, MPFR_RNDN);
374 1.1 mrg mpfr_clear_erangeflag ();
375 1.1 mrg d = mpfr_get_si (x, MPFR_RNDN);
376 1.1 mrg if (d != LONG_MAX || mpfr_erangeflag_p ())
377 1.1 mrg {
378 1.1 mrg printf ("ERROR for get_si + ERANGE + LONG_MAX (1): %ld\n", d);
379 1.1 mrg exit (1);
380 1.1 mrg }
381 1.1 mrg mpfr_add_ui (x, x, 1, MPFR_RNDN);
382 1.1 mrg d = mpfr_get_si (x, MPFR_RNDN);
383 1.1 mrg if (d != LONG_MAX || !mpfr_erangeflag_p ())
384 1.1 mrg {
385 1.1 mrg printf ("ERROR for get_si + ERANGE + LONG_MAX (2)\n");
386 1.1 mrg exit (1);
387 1.1 mrg }
388 1.1 mrg mpfr_set_si (x, LONG_MIN, MPFR_RNDN);
389 1.1 mrg mpfr_clear_erangeflag ();
390 1.1 mrg d = mpfr_get_si (x, MPFR_RNDN);
391 1.1 mrg if (d != LONG_MIN || mpfr_erangeflag_p ())
392 1.1 mrg {
393 1.1 mrg printf ("ERROR for get_si + ERANGE + LONG_MIN (1)\n");
394 1.1 mrg exit (1);
395 1.1 mrg }
396 1.1 mrg mpfr_sub_ui (x, x, 1, MPFR_RNDN);
397 1.1 mrg d = mpfr_get_si (x, MPFR_RNDN);
398 1.1 mrg if (d != LONG_MIN || !mpfr_erangeflag_p ())
399 1.1 mrg {
400 1.1 mrg printf ("ERROR for get_si + ERANGE + LONG_MIN (2)\n");
401 1.1 mrg exit (1);
402 1.1 mrg }
403 1.1 mrg
404 1.1 mrg mpfr_set_nan (x);
405 1.1 mrg mpfr_clear_erangeflag ();
406 1.1 mrg d = mpfr_get_ui (x, MPFR_RNDN);
407 1.1 mrg if (d != 0 || !mpfr_erangeflag_p ())
408 1.1 mrg {
409 1.1 mrg printf ("ERROR for get_ui + NaN\n");
410 1.1 mrg exit (1);
411 1.1 mrg }
412 1.1 mrg mpfr_clear_erangeflag ();
413 1.1 mrg d = mpfr_get_si (x, MPFR_RNDN);
414 1.1 mrg if (d != 0 || !mpfr_erangeflag_p ())
415 1.1 mrg {
416 1.1 mrg printf ("ERROR for get_si + NaN\n");
417 1.1 mrg exit (1);
418 1.1 mrg }
419 1.1 mrg
420 1.1 mrg emin = mpfr_get_emin ();
421 1.1 mrg mpfr_set_prec (x, 2);
422 1.1 mrg
423 1.1 mrg mpfr_set_emin (4);
424 1.1 mrg mpfr_clear_flags ();
425 1.1 mrg mpfr_set_ui (x, 7, MPFR_RNDU);
426 1.1 mrg flag = mpfr_underflow_p ();
427 1.1 mrg mpfr_set_emin (emin);
428 1.1 mrg if (mpfr_cmp_ui (x, 8) != 0)
429 1.1 mrg {
430 1.1 mrg printf ("Error for mpfr_set_ui (x, 7, MPFR_RNDU), prec = 2, emin = 4\n");
431 1.1 mrg exit (1);
432 1.1 mrg }
433 1.1 mrg if (flag)
434 1.1 mrg {
435 1.1 mrg printf ("mpfr_set_ui (x, 7, MPFR_RNDU) should not underflow "
436 1.1 mrg "with prec = 2, emin = 4\n");
437 1.1 mrg exit (1);
438 1.1 mrg }
439 1.1 mrg
440 1.1 mrg mpfr_set_emin (4);
441 1.1 mrg mpfr_clear_flags ();
442 1.1 mrg mpfr_set_si (x, -7, MPFR_RNDD);
443 1.1 mrg flag = mpfr_underflow_p ();
444 1.1 mrg mpfr_set_emin (emin);
445 1.1 mrg if (mpfr_cmp_si (x, -8) != 0)
446 1.1 mrg {
447 1.1 mrg printf ("Error for mpfr_set_si (x, -7, MPFR_RNDD), prec = 2, emin = 4\n");
448 1.1 mrg exit (1);
449 1.1 mrg }
450 1.1 mrg if (flag)
451 1.1 mrg {
452 1.1 mrg printf ("mpfr_set_si (x, -7, MPFR_RNDD) should not underflow "
453 1.1 mrg "with prec = 2, emin = 4\n");
454 1.1 mrg exit (1);
455 1.1 mrg }
456 1.1 mrg
457 1.1 mrg mpfr_clear (x);
458 1.1 mrg
459 1.1 mrg test_2exp ();
460 1.1 mrg test_macros ();
461 1.1.1.2 mrg test_macros_keyword ();
462 1.1 mrg tests_end_mpfr ();
463 1.1 mrg return 0;
464 1.1 mrg }
465