1 /* Test file for mpfr_fms.
2
3 Copyright 2001-2023 Free Software Foundation, Inc.
4 Contributed by the AriC and Caramba projects, INRIA.
5
6 This file is part of the GNU MPFR Library.
7
8 The GNU MPFR Library is free software; you can redistribute it and/or modify
9 it under the terms of the GNU Lesser General Public License as published by
10 the Free Software Foundation; either version 3 of the License, or (at your
11 option) any later version.
12
13 The GNU MPFR Library is distributed in the hope that it will be useful, but
14 WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
15 or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
16 License for more details.
17
18 You should have received a copy of the GNU Lesser General Public License
19 along with the GNU MPFR Library; see the file COPYING.LESSER. If not, see
20 https://www.gnu.org/licenses/ or write to the Free Software Foundation, Inc.,
21 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. */
22
23 #include "mpfr-test.h"
24
25 /* When a * b is exact, the FMS is equivalent to the separate operations. */
26 static void
test_exact(void)27 test_exact (void)
28 {
29 const char *val[] =
30 { "@NaN@", "-@Inf@", "-2", "-1", "-0", "0", "1", "2", "@Inf@" };
31 int sv = numberof (val);
32 int i, j, k;
33 int rnd;
34 mpfr_t a, b, c, r1, r2;
35
36 mpfr_inits2 (8, a, b, c, r1, r2, (mpfr_ptr) 0);
37
38 for (i = 0; i < sv; i++)
39 for (j = 0; j < sv; j++)
40 for (k = 0; k < sv; k++)
41 RND_LOOP (rnd)
42 {
43 if (mpfr_set_str (a, val[i], 10, MPFR_RNDN) ||
44 mpfr_set_str (b, val[j], 10, MPFR_RNDN) ||
45 mpfr_set_str (c, val[k], 10, MPFR_RNDN) ||
46 mpfr_mul (r1, a, b, (mpfr_rnd_t) rnd) ||
47 mpfr_sub (r1, r1, c, (mpfr_rnd_t) rnd))
48 {
49 if (rnd == MPFR_RNDF)
50 break;
51 printf ("test_exact internal error for (%d,%d,%d,%d,%s)\n",
52 i, j, k, rnd, mpfr_print_rnd_mode ((mpfr_rnd_t) rnd));
53 exit (1);
54 }
55 if (mpfr_fms (r2, a, b, c, (mpfr_rnd_t) rnd))
56 {
57 printf ("test_exact(%d,%d,%d,%d): mpfr_fms should be exact\n",
58 i, j, k, rnd);
59 exit (1);
60 }
61 if (MPFR_IS_NAN (r1))
62 {
63 if (MPFR_IS_NAN (r2))
64 continue;
65 printf ("test_exact(%d,%d,%d,%d): mpfr_fms should be NaN\n",
66 i, j, k, rnd);
67 exit (1);
68 }
69 if (! mpfr_equal_p (r1, r2) || MPFR_SIGN (r1) != MPFR_SIGN (r2))
70 {
71 printf ("test_exact(%d,%d,%d,%d):\nexpected ", i, j, k, rnd);
72 mpfr_out_str (stdout, 10, 0, r1, MPFR_RNDN);
73 printf ("\n got ");
74 mpfr_out_str (stdout, 10, 0, r2, MPFR_RNDN);
75 printf ("\n");
76 exit (1);
77 }
78 }
79
80 mpfr_clears (a, b, c, r1, r2, (mpfr_ptr) 0);
81 }
82
83 static void
test_overflow1(void)84 test_overflow1 (void)
85 {
86 mpfr_t x, y, z, r;
87 int inex;
88
89 mpfr_inits2 (8, x, y, z, r, (mpfr_ptr) 0);
90 MPFR_SET_POS (x);
91 mpfr_setmax (x, mpfr_get_emax ()); /* x = 2^emax - ulp */
92 mpfr_set_ui (y, 2, MPFR_RNDN); /* y = 2 */
93 mpfr_set (z, x, MPFR_RNDN); /* z = x = 2^emax - ulp */
94 mpfr_clear_flags ();
95 /* The intermediate multiplication x * y overflows, but x * y - z = x
96 is representable. */
97 inex = mpfr_fms (r, x, y, z, MPFR_RNDN);
98 if (inex || ! mpfr_equal_p (r, x))
99 {
100 printf ("Error in test_overflow1\nexpected ");
101 mpfr_out_str (stdout, 2, 0, x, MPFR_RNDN);
102 printf (" with inex = 0\n got ");
103 mpfr_out_str (stdout, 2, 0, r, MPFR_RNDN);
104 printf (" with inex = %d\n", inex);
105 exit (1);
106 }
107 if (mpfr_overflow_p ())
108 {
109 printf ("Error in test_overflow1: overflow flag set\n");
110 exit (1);
111 }
112 mpfr_clears (x, y, z, r, (mpfr_ptr) 0);
113 }
114
115 static void
test_overflow2(void)116 test_overflow2 (void)
117 {
118 mpfr_t x, y, z, r;
119 int i, inex, rnd, err = 0;
120
121 mpfr_inits2 (8, x, y, z, r, (mpfr_ptr) 0);
122
123 MPFR_SET_POS (x);
124 mpfr_setmin (x, mpfr_get_emax ()); /* x = 0.1@emax */
125 mpfr_set_si (y, -2, MPFR_RNDN); /* y = -2 */
126 /* The intermediate multiplication x * y will overflow. */
127
128 for (i = -9; i <= 9; i++)
129 RND_LOOP_NO_RNDF (rnd)
130 {
131 int inf, overflow;
132
133 inf = rnd == MPFR_RNDN || rnd == MPFR_RNDD || rnd == MPFR_RNDA;
134 overflow = inf || i <= 0;
135
136 inex = mpfr_set_si_2exp (z, -i, mpfr_get_emin (), MPFR_RNDN);
137 MPFR_ASSERTN (inex == 0);
138
139 mpfr_clear_flags ();
140 /* One has: x * y = -1@emax exactly (but not representable). */
141 inex = mpfr_fms (r, x, y, z, (mpfr_rnd_t) rnd);
142 if (overflow ^ (mpfr_overflow_p () != 0))
143 {
144 printf ("Error in test_overflow2 (i = %d, %s): wrong overflow"
145 " flag (should be %d)\n", i,
146 mpfr_print_rnd_mode ((mpfr_rnd_t) rnd), overflow);
147 err = 1;
148 }
149 if (mpfr_nanflag_p ())
150 {
151 printf ("Error in test_overflow2 (i = %d, %s): NaN flag should"
152 " not be set\n", i, mpfr_print_rnd_mode ((mpfr_rnd_t) rnd));
153 err = 1;
154 }
155 if (mpfr_nan_p (r))
156 {
157 printf ("Error in test_overflow2 (i = %d, %s): got NaN\n",
158 i, mpfr_print_rnd_mode ((mpfr_rnd_t) rnd));
159 err = 1;
160 }
161 else if (MPFR_IS_POS (r))
162 {
163 printf ("Error in test_overflow2 (i = %d, %s): wrong sign "
164 "(+ instead of -)\n", i,
165 mpfr_print_rnd_mode ((mpfr_rnd_t) rnd));
166 err = 1;
167 }
168 else if (inf && ! mpfr_inf_p (r))
169 {
170 printf ("Error in test_overflow2 (i = %d, %s): expected -Inf,"
171 " got\n", i, mpfr_print_rnd_mode ((mpfr_rnd_t) rnd));
172 mpfr_dump (r);
173 err = 1;
174 }
175 else if (!inf && (mpfr_inf_p (r) ||
176 (mpfr_nextbelow (r), ! mpfr_inf_p (r))))
177 {
178 printf ("Error in test_overflow2 (i = %d, %s): expected -MAX,"
179 " got\n", i, mpfr_print_rnd_mode ((mpfr_rnd_t) rnd));
180 mpfr_dump (r);
181 err = 1;
182 }
183 if (inf ? inex >= 0 : inex <= 0)
184 {
185 printf ("Error in test_overflow2 (i = %d, %s): wrong inexact"
186 " flag (got %d)\n", i,
187 mpfr_print_rnd_mode ((mpfr_rnd_t) rnd), inex);
188 err = 1;
189 }
190
191 }
192
193 if (err)
194 exit (1);
195 mpfr_clears (x, y, z, r, (mpfr_ptr) 0);
196 }
197
198 static void
test_underflow1(void)199 test_underflow1 (void)
200 {
201 mpfr_t x, y, z, r;
202 int inex, signy, signz, rnd, err = 0;
203
204 mpfr_inits2 (8, x, y, z, r, (mpfr_ptr) 0);
205
206 MPFR_SET_POS (x);
207 mpfr_setmin (x, mpfr_get_emin ()); /* x = 0.1@emin */
208
209 for (signy = -1; signy <= 1; signy += 2)
210 {
211 mpfr_set_si_2exp (y, signy, -1, MPFR_RNDN); /* |y| = 1/2 */
212 for (signz = -3; signz <= 3; signz += 2)
213 {
214 RND_LOOP (rnd)
215 {
216 mpfr_set_si (z, signz, MPFR_RNDN);
217 if (ABS (signz) != 1)
218 mpfr_setmax (z, mpfr_get_emax ());
219 /* |z| = 1 or 2^emax - ulp */
220 mpfr_clear_flags ();
221 inex = mpfr_fms (r, x, y, z, (mpfr_rnd_t) rnd);
222 #define STRTU1 "Error in test_underflow1 (signy = %d, signz = %d, %s)\n "
223 if (mpfr_nanflag_p ())
224 {
225 printf (STRTU1 "NaN flag is set\n", signy, signz,
226 mpfr_print_rnd_mode ((mpfr_rnd_t) rnd));
227 err = 1;
228 }
229 mpfr_neg (z, z, MPFR_RNDN);
230 if (signy < 0 && MPFR_IS_LIKE_RNDD(rnd, -signz))
231 mpfr_nextbelow (z);
232 if (signy > 0 && MPFR_IS_LIKE_RNDU(rnd, -signz))
233 mpfr_nextabove (z);
234 if ((mpfr_overflow_p () != 0) ^ (mpfr_inf_p (z) != 0))
235 {
236 printf (STRTU1 "wrong overflow flag\n", signy, signz,
237 mpfr_print_rnd_mode ((mpfr_rnd_t) rnd));
238 err = 1;
239 }
240 if (mpfr_underflow_p ())
241 {
242 printf (STRTU1 "underflow flag is set\n", signy, signz,
243 mpfr_print_rnd_mode ((mpfr_rnd_t) rnd));
244 err = 1;
245 }
246 if (! mpfr_equal_p (r, z))
247 {
248 printf (STRTU1 "got ", signy, signz,
249 mpfr_print_rnd_mode ((mpfr_rnd_t) rnd));
250 mpfr_dump (r);
251 printf (" instead of ");
252 mpfr_dump (z);
253 err = 1;
254 }
255 if (inex >= 0 && (rnd == MPFR_RNDD ||
256 (rnd == MPFR_RNDZ && signz < 0) ||
257 (rnd == MPFR_RNDN && signy > 0)))
258 {
259 printf (STRTU1 "ternary value = %d instead of < 0\n",
260 signy, signz, mpfr_print_rnd_mode ((mpfr_rnd_t) rnd),
261 inex);
262 err = 1;
263 }
264 if (inex <= 0 && (rnd == MPFR_RNDU ||
265 (rnd == MPFR_RNDZ && signz > 0) ||
266 (rnd == MPFR_RNDN && signy < 0)))
267 {
268 printf (STRTU1 "ternary value = %d instead of > 0\n",
269 signy, signz, mpfr_print_rnd_mode ((mpfr_rnd_t) rnd),
270 inex);
271 err = 1;
272 }
273 }
274 }
275 }
276
277 if (err)
278 exit (1);
279 mpfr_clears (x, y, z, r, (mpfr_ptr) 0);
280 }
281
282 static void
test_underflow2(void)283 test_underflow2 (void)
284 {
285 mpfr_t x, y, z, r;
286 int b, i, inex, same, err = 0;
287
288 mpfr_inits2 (32, x, y, z, r, (mpfr_ptr) 0);
289
290 mpfr_set_si_2exp (z, -1, mpfr_get_emin (), MPFR_RNDN); /* z = -2^emin */
291 mpfr_set_si_2exp (x, 1, mpfr_get_emin (), MPFR_RNDN); /* x = 2^emin */
292
293 for (b = 0; b <= 1; b++)
294 {
295 for (i = 15; i <= 17; i++)
296 {
297 mpfr_set_si_2exp (y, i, -4 - MPFR_PREC (z), MPFR_RNDN);
298 /* z = -1.000...00b
299 * xy = 01111
300 * or 10000
301 * or 10001
302 */
303 mpfr_clear_flags ();
304 inex = mpfr_fms (r, x, y, z, MPFR_RNDN);
305 #define STRTU2 "Error in test_underflow2 (b = %d, i = %d)\n "
306 if (__gmpfr_flags != MPFR_FLAGS_INEXACT)
307 {
308 printf (STRTU2 "flags = %u instead of %u\n", b, i,
309 (unsigned int) __gmpfr_flags,
310 (unsigned int) MPFR_FLAGS_INEXACT);
311 err = 1;
312 }
313 same = i == 15 || (i == 16 && b == 0);
314 if (same ? (inex >= 0) : (inex <= 0))
315 {
316 printf (STRTU2 "incorrect ternary value (%d instead of %c 0)\n",
317 b, i, inex, same ? '<' : '>');
318 err = 1;
319 }
320 mpfr_neg (y, z, MPFR_RNDN);
321 if (!same)
322 mpfr_nextabove (y);
323 if (! mpfr_equal_p (r, y))
324 {
325 printf (STRTU2 "expected ", b, i);
326 mpfr_dump (y);
327 printf (" got ");
328 mpfr_dump (r);
329 err = 1;
330 }
331 }
332 mpfr_nextbelow (z);
333 }
334
335 if (err)
336 exit (1);
337 mpfr_clears (x, y, z, r, (mpfr_ptr) 0);
338 }
339
340 int
main(int argc,char * argv[])341 main (int argc, char *argv[])
342 {
343 mpfr_t x, y, z, s;
344 MPFR_SAVE_EXPO_DECL (expo);
345
346 tests_start_mpfr ();
347
348 mpfr_init (x);
349 mpfr_init (s);
350 mpfr_init (y);
351 mpfr_init (z);
352
353 /* check special cases */
354 mpfr_set_prec (x, 2);
355 mpfr_set_prec (y, 2);
356 mpfr_set_prec (z, 2);
357 mpfr_set_prec (s, 2);
358 mpfr_set_str (x, "-0.75", 10, MPFR_RNDN);
359 mpfr_set_str (y, "0.5", 10, MPFR_RNDN);
360 mpfr_set_str (z, "-0.375", 10, MPFR_RNDN);
361 mpfr_fms (s, x, y, z, MPFR_RNDU); /* result is 0 */
362 if (mpfr_cmp_ui (s, 0))
363 {
364 printf ("Error: -0.75 * 0.5 - -0.375 should be equal to 0 for prec=2\n");
365 printf ("got instead ");
366 mpfr_dump (s);
367 exit (1);
368 }
369
370 mpfr_set_prec (x, 27);
371 mpfr_set_prec (y, 27);
372 mpfr_set_prec (z, 27);
373 mpfr_set_prec (s, 27);
374 mpfr_set_str_binary (x, "1.11111111111111111111111111e-1");
375 mpfr_set (y, x, MPFR_RNDN);
376 mpfr_set_str_binary (z, "1.00011110100011001011001001e-1");
377 if (mpfr_fms (s, x, y, z, MPFR_RNDN) >= 0)
378 {
379 printf ("Wrong inexact flag for x=y=1-2^(-27)\n");
380 exit (1);
381 }
382
383 mpfr_set_nan (x);
384 mpfr_urandomb (y, RANDS);
385 mpfr_urandomb (z, RANDS);
386 mpfr_fms (s, x, y, z, MPFR_RNDN);
387 if (!mpfr_nan_p (s))
388 {
389 printf ("evaluation of function in x=NAN does not return NAN\n");
390 exit (1);
391 }
392
393 mpfr_set_nan (y);
394 mpfr_urandomb (x, RANDS);
395 mpfr_urandomb (z, RANDS);
396 mpfr_fms (s, x, y, z, MPFR_RNDN);
397 if (!mpfr_nan_p(s))
398 {
399 printf ("evaluation of function in y=NAN does not return NAN\n");
400 exit (1);
401 }
402
403 mpfr_set_nan (z);
404 mpfr_urandomb (y, RANDS);
405 mpfr_urandomb (x, RANDS);
406 mpfr_fms (s, x, y, z, MPFR_RNDN);
407 if (!mpfr_nan_p (s))
408 {
409 printf ("evaluation of function in z=NAN does not return NAN\n");
410 exit (1);
411 }
412
413 mpfr_set_inf (x, 1);
414 mpfr_set_inf (y, 1);
415 mpfr_set_inf (z, -1);
416 mpfr_fms (s, x, y, z, MPFR_RNDN);
417 if (!mpfr_inf_p (s) || mpfr_sgn (s) < 0)
418 {
419 printf ("Error for (+inf) * (+inf) - (-inf)\n");
420 exit (1);
421 }
422
423 mpfr_set_inf (x, -1);
424 mpfr_set_inf (y, -1);
425 mpfr_set_inf (z, -1);
426 mpfr_fms (s, x, y, z, MPFR_RNDN);
427 if (!mpfr_inf_p (s) || mpfr_sgn (s) < 0)
428 {
429 printf ("Error for (-inf) * (-inf) - (-inf)\n");
430 exit (1);
431 }
432
433 mpfr_set_inf (x, 1);
434 mpfr_set_inf (y, -1);
435 mpfr_set_inf (z, 1);
436 mpfr_fms (s, x, y, z, MPFR_RNDN);
437 if (!mpfr_inf_p (s) || mpfr_sgn (s) > 0)
438 {
439 printf ("Error for (+inf) * (-inf) - (+inf)\n");
440 exit (1);
441 }
442
443 mpfr_set_inf (x, -1);
444 mpfr_set_inf (y, 1);
445 mpfr_set_inf (z, 1);
446 mpfr_fms (s, x, y, z, MPFR_RNDN);
447 if (!mpfr_inf_p (s) || mpfr_sgn (s) > 0)
448 {
449 printf ("Error for (-inf) * (+inf) - (+inf)\n");
450 exit (1);
451 }
452
453 mpfr_set_inf (x, 1);
454 mpfr_set_ui (y, 0, MPFR_RNDN);
455 mpfr_urandomb (z, RANDS);
456 mpfr_fms (s, x, y, z, MPFR_RNDN);
457 if (!mpfr_nan_p (s))
458 {
459 printf ("evaluation of function in x=INF y=0 does not return NAN\n");
460 exit (1);
461 }
462
463 mpfr_set_inf (y, 1);
464 mpfr_set_ui (x, 0, MPFR_RNDN);
465 mpfr_urandomb (z, RANDS);
466 mpfr_fms (s, x, y, z, MPFR_RNDN);
467 if (!mpfr_nan_p (s))
468 {
469 printf ("evaluation of function in x=0 y=INF does not return NAN\n");
470 exit (1);
471 }
472
473 mpfr_set_inf (x, 1);
474 mpfr_urandomb (y, RANDS); /* always positive */
475 mpfr_set_inf (z, 1);
476 mpfr_fms (s, x, y, z, MPFR_RNDN);
477 if (!mpfr_nan_p (s))
478 {
479 printf ("evaluation of function in x=INF y>0 z=INF does not return NAN\n");
480 exit (1);
481 }
482
483 mpfr_set_inf (y, 1);
484 mpfr_urandomb (x, RANDS);
485 mpfr_set_inf (z, 1);
486 mpfr_fms (s, x, y, z, MPFR_RNDN);
487 if (!mpfr_nan_p (s))
488 {
489 printf ("evaluation of function in x>0 y=INF z=INF does not return NAN\n");
490 exit (1);
491 }
492
493 mpfr_set_inf (x, 1);
494 do mpfr_urandomb (y, RANDS); while (MPFR_IS_ZERO(y));
495 mpfr_urandomb (z, RANDS);
496 mpfr_fms (s, x, y, z, MPFR_RNDN);
497 if (!mpfr_inf_p (s) || mpfr_sgn (s) < 0)
498 {
499 printf ("evaluation of function at x=INF does not return INF\n");
500 exit (1);
501 }
502
503 mpfr_set_inf (y, 1);
504 do mpfr_urandomb (x, RANDS); while (MPFR_IS_ZERO(x));
505 mpfr_urandomb (z, RANDS);
506 mpfr_fms (s, x, y, z, MPFR_RNDN);
507 if (!mpfr_inf_p (s) || mpfr_sgn (s) < 0)
508 {
509 printf ("evaluation of function at y=INF does not return INF\n");
510 exit (1);
511 }
512
513 mpfr_set_inf (z, -1);
514 mpfr_urandomb (x, RANDS);
515 mpfr_urandomb (y, RANDS);
516 mpfr_fms (s, x, y, z, MPFR_RNDN);
517 if (!mpfr_inf_p (s) || mpfr_sgn (s) < 0)
518 {
519 printf ("evaluation of function in z=-INF does not return INF\n");
520 exit (1);
521 }
522
523 mpfr_set_ui (x, 0, MPFR_RNDN);
524 mpfr_urandomb (y, RANDS);
525 mpfr_urandomb (z, RANDS);
526 mpfr_fms (s, x, y, z, MPFR_RNDN);
527 mpfr_neg (z, z, MPFR_RNDN);
528 if (! mpfr_equal_p (s, z))
529 {
530 printf ("evaluation of function in x=0 does not return -z\n");
531 exit (1);
532 }
533
534 mpfr_set_ui (y, 0, MPFR_RNDN);
535 mpfr_urandomb (x, RANDS);
536 mpfr_urandomb (z, RANDS);
537 mpfr_fms (s, x, y, z, MPFR_RNDN);
538 mpfr_neg (z, z, MPFR_RNDN);
539 if (! mpfr_equal_p (s, z))
540 {
541 printf ("evaluation of function in y=0 does not return -z\n");
542 exit (1);
543 }
544
545 {
546 mpfr_prec_t prec;
547 mpfr_t t, slong;
548 mpfr_rnd_t rnd;
549 int inexact, compare;
550 unsigned int n;
551
552 mpfr_prec_t p0 = 2, p1 = 200;
553 unsigned int N = 200;
554
555 mpfr_init (t);
556 mpfr_init (slong);
557
558 /* generic test */
559 for (prec = p0; prec <= p1; prec++)
560 {
561 mpfr_set_prec (x, prec);
562 mpfr_set_prec (y, prec);
563 mpfr_set_prec (z, prec);
564 mpfr_set_prec (s, prec);
565 mpfr_set_prec (t, prec);
566
567 for (n = 0; n < N; n++)
568 {
569 mpfr_urandomb (x, RANDS);
570 mpfr_urandomb (y, RANDS);
571 mpfr_urandomb (z, RANDS);
572
573 if (RAND_BOOL ())
574 mpfr_neg (x, x, MPFR_RNDN);
575 if (RAND_BOOL ())
576 mpfr_neg (y, y, MPFR_RNDN);
577 if (RAND_BOOL ())
578 mpfr_neg (z, z, MPFR_RNDN);
579
580 rnd = RND_RAND_NO_RNDF ();
581 mpfr_set_prec (slong, 2 * prec);
582 if (mpfr_mul (slong, x, y, rnd))
583 {
584 printf ("x*y should be exact\n");
585 exit (1);
586 }
587 compare = mpfr_sub (t, slong, z, rnd);
588 inexact = mpfr_fms (s, x, y, z, rnd);
589 if (! mpfr_equal_p (s, t))
590 {
591 printf ("results differ for\n");
592 printf (" x=");
593 mpfr_dump (x);
594 printf (" y=");
595 mpfr_dump (y);
596 printf (" z=");
597 mpfr_dump (z);
598 printf (" with prec=%u rnd_mode=%s\n", (unsigned int) prec,
599 mpfr_print_rnd_mode (rnd));
600 printf ("got ");
601 mpfr_dump (s);
602 printf ("expected ");
603 mpfr_dump (t);
604 printf ("approx ");
605 mpfr_dump (slong);
606 exit (1);
607 }
608 if (! SAME_SIGN (inexact, compare))
609 {
610 printf ("Wrong inexact flag for rnd=%s: expected %d, got %d\n",
611 mpfr_print_rnd_mode (rnd), compare, inexact);
612 printf (" x="); mpfr_dump (x);
613 printf (" y="); mpfr_dump (y);
614 printf (" z="); mpfr_dump (z);
615 printf (" s="); mpfr_dump (s);
616 exit (1);
617 }
618 }
619 }
620 mpfr_clear (t);
621 mpfr_clear (slong);
622
623 }
624 mpfr_clear (x);
625 mpfr_clear (y);
626 mpfr_clear (z);
627 mpfr_clear (s);
628
629 test_exact ();
630
631 MPFR_SAVE_EXPO_MARK (expo);
632 test_overflow1 ();
633 test_overflow2 ();
634 test_underflow1 ();
635 test_underflow2 ();
636 MPFR_SAVE_EXPO_FREE (expo);
637
638 tests_end_mpfr ();
639 return 0;
640 }
641