tset_si.c revision 1.1.1.1 1 1.1 mrg /* Test file for mpfr_set_si and mpfr_set_ui.
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 #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 mrg /* FIXME: Comparing against mpfr_get_si/ui is not ideal, it'd be better to
126 1.1 mrg have all tests examine the bits in mpfr_t for what should come out. */
127 1.1 mrg
128 1.1 mrg int
129 1.1 mrg main (int argc, char *argv[])
130 1.1 mrg {
131 1.1 mrg mpfr_t x;
132 1.1 mrg long k, z, d, N;
133 1.1 mrg unsigned long zl, dl;
134 1.1 mrg int inex;
135 1.1 mrg int r;
136 1.1 mrg mpfr_exp_t emin, emax;
137 1.1 mrg int flag;
138 1.1 mrg
139 1.1 mrg tests_start_mpfr ();
140 1.1 mrg
141 1.1 mrg mpfr_init2 (x, 100);
142 1.1 mrg
143 1.1 mrg N = (argc==1) ? 100000 : atol (argv[1]);
144 1.1 mrg
145 1.1 mrg for (k = 1; k <= N; k++)
146 1.1 mrg {
147 1.1 mrg z = (long) (randlimb () & LONG_MAX) + LONG_MIN / 2;
148 1.1 mrg inex = mpfr_set_si (x, z, MPFR_RNDZ);
149 1.1 mrg d = mpfr_get_si (x, MPFR_RNDZ);
150 1.1 mrg if (d != z)
151 1.1 mrg {
152 1.1 mrg printf ("Error in mpfr_set_si: expected %ld got %ld\n", z, d);
153 1.1 mrg exit (1);
154 1.1 mrg }
155 1.1 mrg if (inex)
156 1.1 mrg {
157 1.1 mrg printf ("Error in mpfr_set_si: inex value incorrect for %ld: %d\n",
158 1.1 mrg z, inex);
159 1.1 mrg exit (1);
160 1.1 mrg }
161 1.1 mrg }
162 1.1 mrg
163 1.1 mrg for (k = 1; k <= N; k++)
164 1.1 mrg {
165 1.1 mrg zl = randlimb ();
166 1.1 mrg inex = mpfr_set_ui (x, zl, MPFR_RNDZ);
167 1.1 mrg dl = mpfr_get_ui (x, MPFR_RNDZ);
168 1.1 mrg if (dl != zl)
169 1.1 mrg {
170 1.1 mrg printf ("Error in mpfr_set_ui: expected %lu got %lu\n", zl, dl);
171 1.1 mrg exit (1);
172 1.1 mrg }
173 1.1 mrg if (inex)
174 1.1 mrg {
175 1.1 mrg printf ("Error in mpfr_set_ui: inex value incorrect for %lu: %d\n",
176 1.1 mrg zl, inex);
177 1.1 mrg exit (1);
178 1.1 mrg }
179 1.1 mrg }
180 1.1 mrg
181 1.1 mrg mpfr_set_prec (x, 2);
182 1.1 mrg if (mpfr_set_si (x, 5, MPFR_RNDZ) >= 0)
183 1.1 mrg {
184 1.1 mrg printf ("Wrong inexact flag for x=5, rnd=MPFR_RNDZ\n");
185 1.1 mrg exit (1);
186 1.1 mrg }
187 1.1 mrg
188 1.1 mrg mpfr_set_prec (x, 2);
189 1.1 mrg if (mpfr_set_si (x, -5, MPFR_RNDZ) <= 0)
190 1.1 mrg {
191 1.1 mrg printf ("Wrong inexact flag for x=-5, rnd=MPFR_RNDZ\n");
192 1.1 mrg exit (1);
193 1.1 mrg }
194 1.1 mrg
195 1.1 mrg mpfr_set_prec (x, 3);
196 1.1 mrg inex = mpfr_set_si (x, 77617, MPFR_RNDD); /* should be 65536 */
197 1.1 mrg if (MPFR_MANT(x)[0] != ((mp_limb_t)1 << (mp_bits_per_limb-1))
198 1.1 mrg || inex >= 0)
199 1.1 mrg {
200 1.1 mrg printf ("Error in mpfr_set_si(x:3, 77617, MPFR_RNDD)\n");
201 1.1 mrg mpfr_print_binary (x);
202 1.1 mrg puts ("");
203 1.1 mrg exit (1);
204 1.1 mrg }
205 1.1 mrg inex = mpfr_set_ui (x, 77617, MPFR_RNDD); /* should be 65536 */
206 1.1 mrg if (MPFR_MANT(x)[0] != ((mp_limb_t)1 << (mp_bits_per_limb-1))
207 1.1 mrg || inex >= 0)
208 1.1 mrg {
209 1.1 mrg printf ("Error in mpfr_set_ui(x:3, 77617, MPFR_RNDD)\n");
210 1.1 mrg mpfr_print_binary (x);
211 1.1 mrg puts ("");
212 1.1 mrg exit (1);
213 1.1 mrg }
214 1.1 mrg
215 1.1 mrg mpfr_set_prec (x, 2);
216 1.1 mrg inex = mpfr_set_si (x, 33096, MPFR_RNDU);
217 1.1 mrg if (mpfr_get_si (x, MPFR_RNDZ) != 49152 || inex <= 0)
218 1.1 mrg {
219 1.1 mrg printf ("Error in mpfr_set_si, exp. 49152, got %ld, inex %d\n",
220 1.1 mrg mpfr_get_si (x, MPFR_RNDZ), inex);
221 1.1 mrg exit (1);
222 1.1 mrg }
223 1.1 mrg inex = mpfr_set_ui (x, 33096, MPFR_RNDU);
224 1.1 mrg if (mpfr_get_si (x, MPFR_RNDZ) != 49152)
225 1.1 mrg {
226 1.1 mrg printf ("Error in mpfr_set_ui, exp. 49152, got %ld, inex %d\n",
227 1.1 mrg mpfr_get_si (x, MPFR_RNDZ), inex);
228 1.1 mrg exit (1);
229 1.1 mrg }
230 1.1 mrg
231 1.1 mrg for (r = 0 ; r < MPFR_RND_MAX ; r++)
232 1.1 mrg {
233 1.1 mrg mpfr_set_si (x, -1, (mpfr_rnd_t) r);
234 1.1 mrg mpfr_set_ui (x, 0, (mpfr_rnd_t) r);
235 1.1 mrg if (MPFR_IS_NEG (x) || mpfr_get_ui (x, (mpfr_rnd_t) r) != 0)
236 1.1 mrg {
237 1.1 mrg printf ("mpfr_set_ui (x, 0) gives -0 for %s\n",
238 1.1 mrg mpfr_print_rnd_mode ((mpfr_rnd_t) r));
239 1.1 mrg exit (1);
240 1.1 mrg }
241 1.1 mrg
242 1.1 mrg mpfr_set_si (x, -1, (mpfr_rnd_t) r);
243 1.1 mrg mpfr_set_si (x, 0, (mpfr_rnd_t) r);
244 1.1 mrg if (MPFR_IS_NEG (x) || mpfr_get_si (x, (mpfr_rnd_t) r) != 0)
245 1.1 mrg {
246 1.1 mrg printf ("mpfr_set_si (x, 0) gives -0 for %s\n",
247 1.1 mrg mpfr_print_rnd_mode ((mpfr_rnd_t) r));
248 1.1 mrg exit (1);
249 1.1 mrg }
250 1.1 mrg }
251 1.1 mrg
252 1.1 mrg /* check potential bug in case mp_limb_t is unsigned */
253 1.1 mrg emax = mpfr_get_emax ();
254 1.1 mrg set_emax (0);
255 1.1 mrg mpfr_set_si (x, -1, MPFR_RNDN);
256 1.1 mrg if (mpfr_sgn (x) >= 0)
257 1.1 mrg {
258 1.1 mrg printf ("mpfr_set_si (x, -1) fails\n");
259 1.1 mrg exit (1);
260 1.1 mrg }
261 1.1 mrg set_emax (emax);
262 1.1 mrg
263 1.1 mrg emax = mpfr_get_emax ();
264 1.1 mrg set_emax (5);
265 1.1 mrg mpfr_set_prec (x, 2);
266 1.1 mrg mpfr_set_si (x, -31, MPFR_RNDN);
267 1.1 mrg if (mpfr_sgn (x) >= 0)
268 1.1 mrg {
269 1.1 mrg printf ("mpfr_set_si (x, -31) fails\n");
270 1.1 mrg exit (1);
271 1.1 mrg }
272 1.1 mrg set_emax (emax);
273 1.1 mrg
274 1.1 mrg /* test for get_ui */
275 1.1 mrg mpfr_set_ui (x, 0, MPFR_RNDN);
276 1.1 mrg MPFR_ASSERTN(mpfr_get_ui (x, MPFR_RNDN) == 0);
277 1.1 mrg mpfr_set_ui (x, ULONG_MAX, MPFR_RNDU);
278 1.1 mrg mpfr_nextabove (x);
279 1.1 mrg mpfr_get_ui (x, MPFR_RNDU);
280 1.1 mrg
281 1.1 mrg /* another test for get_ui */
282 1.1 mrg mpfr_set_prec (x, 10);
283 1.1 mrg mpfr_set_str_binary (x, "10.101");
284 1.1 mrg dl = mpfr_get_ui (x, MPFR_RNDN);
285 1.1 mrg MPFR_ASSERTN (dl == 3);
286 1.1 mrg
287 1.1 mrg mpfr_set_str_binary (x, "-1.0");
288 1.1 mrg mpfr_get_ui (x, MPFR_RNDN);
289 1.1 mrg
290 1.1 mrg mpfr_set_str_binary (x, "0.1");
291 1.1 mrg dl = mpfr_get_ui (x, MPFR_RNDN);
292 1.1 mrg MPFR_ASSERTN (dl == 0);
293 1.1 mrg dl = mpfr_get_ui (x, MPFR_RNDZ);
294 1.1 mrg MPFR_ASSERTN (dl == 0);
295 1.1 mrg dl = mpfr_get_ui (x, MPFR_RNDD);
296 1.1 mrg MPFR_ASSERTN (dl == 0);
297 1.1 mrg dl = mpfr_get_ui (x, MPFR_RNDU);
298 1.1 mrg MPFR_ASSERTN (dl == 1);
299 1.1 mrg
300 1.1 mrg /* coverage tests */
301 1.1 mrg mpfr_set_prec (x, 2);
302 1.1 mrg mpfr_set_si (x, -7, MPFR_RNDD);
303 1.1 mrg MPFR_ASSERTN(mpfr_cmp_si (x, -8) == 0);
304 1.1 mrg mpfr_set_prec (x, 2);
305 1.1 mrg mpfr_set_ui (x, 7, MPFR_RNDU);
306 1.1 mrg MPFR_ASSERTN(mpfr_cmp_ui (x, 8) == 0);
307 1.1 mrg emax = mpfr_get_emax ();
308 1.1 mrg set_emax (3);
309 1.1 mrg mpfr_set_ui (x, 7, MPFR_RNDU);
310 1.1 mrg MPFR_ASSERTN(mpfr_inf_p (x) && mpfr_sgn (x) > 0);
311 1.1 mrg set_emax (1);
312 1.1 mrg MPFR_ASSERTN( mpfr_set_ui (x, 7, MPFR_RNDU) );
313 1.1 mrg MPFR_ASSERTN(mpfr_inf_p (x) && mpfr_sgn (x) > 0);
314 1.1 mrg set_emax (emax);
315 1.1 mrg mpfr_set_ui_2exp (x, 17, -50, MPFR_RNDN);
316 1.1 mrg MPFR_ASSERTN (mpfr_get_ui (x, MPFR_RNDD) == 0);
317 1.1 mrg MPFR_ASSERTN (mpfr_get_si (x, MPFR_RNDD) == 0);
318 1.1 mrg
319 1.1 mrg /* Test for ERANGE flag + correct behaviour if overflow */
320 1.1 mrg mpfr_set_prec (x, 256);
321 1.1 mrg mpfr_set_ui (x, ULONG_MAX, MPFR_RNDN);
322 1.1 mrg mpfr_clear_erangeflag ();
323 1.1 mrg dl = mpfr_get_ui (x, MPFR_RNDN);
324 1.1 mrg if (dl != ULONG_MAX || mpfr_erangeflag_p ())
325 1.1 mrg {
326 1.1 mrg printf ("ERROR for get_ui + ERANGE + ULONG_MAX (1)\n");
327 1.1 mrg exit (1);
328 1.1 mrg }
329 1.1 mrg mpfr_add_ui (x, x, 1, MPFR_RNDN);
330 1.1 mrg dl = mpfr_get_ui (x, MPFR_RNDN);
331 1.1 mrg if (dl != ULONG_MAX || !mpfr_erangeflag_p ())
332 1.1 mrg {
333 1.1 mrg printf ("ERROR for get_ui + ERANGE + ULONG_MAX (2)\n");
334 1.1 mrg exit (1);
335 1.1 mrg }
336 1.1 mrg mpfr_set_si (x, -1, MPFR_RNDN);
337 1.1 mrg mpfr_clear_erangeflag ();
338 1.1 mrg dl = mpfr_get_ui (x, MPFR_RNDN);
339 1.1 mrg if (dl != 0 || !mpfr_erangeflag_p ())
340 1.1 mrg {
341 1.1 mrg printf ("ERROR for get_ui + ERANGE + -1 \n");
342 1.1 mrg exit (1);
343 1.1 mrg }
344 1.1 mrg mpfr_set_si (x, LONG_MAX, MPFR_RNDN);
345 1.1 mrg mpfr_clear_erangeflag ();
346 1.1 mrg d = mpfr_get_si (x, MPFR_RNDN);
347 1.1 mrg if (d != LONG_MAX || mpfr_erangeflag_p ())
348 1.1 mrg {
349 1.1 mrg printf ("ERROR for get_si + ERANGE + LONG_MAX (1): %ld\n", d);
350 1.1 mrg exit (1);
351 1.1 mrg }
352 1.1 mrg mpfr_add_ui (x, x, 1, MPFR_RNDN);
353 1.1 mrg d = mpfr_get_si (x, MPFR_RNDN);
354 1.1 mrg if (d != LONG_MAX || !mpfr_erangeflag_p ())
355 1.1 mrg {
356 1.1 mrg printf ("ERROR for get_si + ERANGE + LONG_MAX (2)\n");
357 1.1 mrg exit (1);
358 1.1 mrg }
359 1.1 mrg mpfr_set_si (x, LONG_MIN, MPFR_RNDN);
360 1.1 mrg mpfr_clear_erangeflag ();
361 1.1 mrg d = mpfr_get_si (x, MPFR_RNDN);
362 1.1 mrg if (d != LONG_MIN || mpfr_erangeflag_p ())
363 1.1 mrg {
364 1.1 mrg printf ("ERROR for get_si + ERANGE + LONG_MIN (1)\n");
365 1.1 mrg exit (1);
366 1.1 mrg }
367 1.1 mrg mpfr_sub_ui (x, x, 1, MPFR_RNDN);
368 1.1 mrg d = mpfr_get_si (x, MPFR_RNDN);
369 1.1 mrg if (d != LONG_MIN || !mpfr_erangeflag_p ())
370 1.1 mrg {
371 1.1 mrg printf ("ERROR for get_si + ERANGE + LONG_MIN (2)\n");
372 1.1 mrg exit (1);
373 1.1 mrg }
374 1.1 mrg
375 1.1 mrg mpfr_set_nan (x);
376 1.1 mrg mpfr_clear_erangeflag ();
377 1.1 mrg d = mpfr_get_ui (x, MPFR_RNDN);
378 1.1 mrg if (d != 0 || !mpfr_erangeflag_p ())
379 1.1 mrg {
380 1.1 mrg printf ("ERROR for get_ui + NaN\n");
381 1.1 mrg exit (1);
382 1.1 mrg }
383 1.1 mrg mpfr_clear_erangeflag ();
384 1.1 mrg d = mpfr_get_si (x, MPFR_RNDN);
385 1.1 mrg if (d != 0 || !mpfr_erangeflag_p ())
386 1.1 mrg {
387 1.1 mrg printf ("ERROR for get_si + NaN\n");
388 1.1 mrg exit (1);
389 1.1 mrg }
390 1.1 mrg
391 1.1 mrg emin = mpfr_get_emin ();
392 1.1 mrg mpfr_set_prec (x, 2);
393 1.1 mrg
394 1.1 mrg mpfr_set_emin (4);
395 1.1 mrg mpfr_clear_flags ();
396 1.1 mrg mpfr_set_ui (x, 7, MPFR_RNDU);
397 1.1 mrg flag = mpfr_underflow_p ();
398 1.1 mrg mpfr_set_emin (emin);
399 1.1 mrg if (mpfr_cmp_ui (x, 8) != 0)
400 1.1 mrg {
401 1.1 mrg printf ("Error for mpfr_set_ui (x, 7, MPFR_RNDU), prec = 2, emin = 4\n");
402 1.1 mrg exit (1);
403 1.1 mrg }
404 1.1 mrg if (flag)
405 1.1 mrg {
406 1.1 mrg printf ("mpfr_set_ui (x, 7, MPFR_RNDU) should not underflow "
407 1.1 mrg "with prec = 2, emin = 4\n");
408 1.1 mrg exit (1);
409 1.1 mrg }
410 1.1 mrg
411 1.1 mrg mpfr_set_emin (4);
412 1.1 mrg mpfr_clear_flags ();
413 1.1 mrg mpfr_set_si (x, -7, MPFR_RNDD);
414 1.1 mrg flag = mpfr_underflow_p ();
415 1.1 mrg mpfr_set_emin (emin);
416 1.1 mrg if (mpfr_cmp_si (x, -8) != 0)
417 1.1 mrg {
418 1.1 mrg printf ("Error for mpfr_set_si (x, -7, MPFR_RNDD), prec = 2, emin = 4\n");
419 1.1 mrg exit (1);
420 1.1 mrg }
421 1.1 mrg if (flag)
422 1.1 mrg {
423 1.1 mrg printf ("mpfr_set_si (x, -7, MPFR_RNDD) should not underflow "
424 1.1 mrg "with prec = 2, emin = 4\n");
425 1.1 mrg exit (1);
426 1.1 mrg }
427 1.1 mrg
428 1.1 mrg mpfr_clear (x);
429 1.1 mrg
430 1.1 mrg test_2exp ();
431 1.1 mrg test_macros ();
432 1.1 mrg tests_end_mpfr ();
433 1.1 mrg return 0;
434 1.1 mrg }
435