1/* Test file for mpfr_get_flt and mpfr_set_flt
2
3Copyright 2009, 2010, 2011, 2012, 2013 Free Software Foundation, Inc.
4Contributed by the AriC and Caramel projects, INRIA.
5
6This file is part of the GNU MPFR Library.
7
8The GNU MPFR Library is free software; you can redistribute it and/or modify
9it under the terms of the GNU Lesser General Public License as published by
10the Free Software Foundation; either version 3 of the License, or (at your
11option) any later version.
12
13The GNU MPFR Library is distributed in the hope that it will be useful, but
14WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
15or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public
16License for more details.
17
18You should have received a copy of the GNU Lesser General Public License
19along with the GNU MPFR Library; see the file COPYING.LESSER.  If not, see
20http://www.gnu.org/licenses/ or write to the Free Software Foundation, Inc.,
2151 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. */
22
23#include <stdlib.h>
24#include <float.h>     /* for FLT_MIN */
25#include "mpfr-test.h"
26
27int
28main (void)
29{
30  mpfr_t x, y;
31  float f, g, infp;
32  int i;
33
34  infp = (float) DBL_POS_INF;
35  if (infp * 0.5 != infp)
36    {
37      fprintf (stderr, "Error, FLT_MAX + FLT_MAX does not yield INFP\n");
38      fprintf (stderr, "(this is probably a compiler bug, please report)\n");
39      exit (1);
40    }
41
42  tests_start_mpfr ();
43
44  mpfr_init2 (x, 24);
45  mpfr_init2 (y, 24);
46
47#if !defined(MPFR_ERRDIVZERO)
48  mpfr_set_nan (x);
49  f = mpfr_get_flt (x, MPFR_RNDN);
50  if (f == f)
51    {
52      printf ("Error for mpfr_get_flt(NaN)\n");
53      exit (1);
54    }
55  mpfr_set_flt (x, f, MPFR_RNDN);
56  if (mpfr_nan_p (x) == 0)
57    {
58      printf ("Error for mpfr_set_flt(NaN)\n");
59      exit (1);
60    }
61
62  mpfr_set_inf (x, 1);
63  f = mpfr_get_flt (x, MPFR_RNDN);
64  mpfr_set_flt (x, f, MPFR_RNDN);
65  if (mpfr_inf_p (x) == 0 || mpfr_sgn (x) < 0)
66    {
67      printf ("Error for mpfr_set_flt(mpfr_get_flt(+Inf)):\n");
68      printf ("f=%f, expected -Inf\n", f);
69      printf ("got "); mpfr_dump (x);
70      exit (1);
71    }
72
73  mpfr_set_inf (x, -1);
74  f = mpfr_get_flt (x, MPFR_RNDN);
75  mpfr_set_flt (x, f, MPFR_RNDN);
76  if (mpfr_inf_p (x) == 0 || mpfr_sgn (x) > 0)
77    {
78      printf ("Error for mpfr_set_flt(mpfr_get_flt(-Inf)):\n");
79      printf ("f=%f, expected -Inf\n", f);
80      printf ("got "); mpfr_dump (x);
81      exit (1);
82    }
83#endif
84
85  mpfr_set_ui (x, 0, MPFR_RNDN);
86  f = mpfr_get_flt (x, MPFR_RNDN);
87  mpfr_set_flt (x, f, MPFR_RNDN);
88  if (mpfr_zero_p (x) == 0 || MPFR_SIGN (x) < 0)
89    {
90      printf ("Error for mpfr_set_flt(mpfr_get_flt(+0))\n");
91      exit (1);
92    }
93
94  mpfr_set_ui (x, 0, MPFR_RNDN);
95  mpfr_neg (x, x, MPFR_RNDN);
96  f = mpfr_get_flt (x, MPFR_RNDN);
97  mpfr_set_flt (x, f, MPFR_RNDN);
98  if (mpfr_zero_p (x) == 0 || MPFR_SIGN (x) > 0)
99    {
100      printf ("Error for mpfr_set_flt(mpfr_get_flt(-0))\n");
101      exit (1);
102    }
103
104  mpfr_set_ui (x, 17, MPFR_RNDN);
105  f = mpfr_get_flt (x, MPFR_RNDN);
106  mpfr_set_flt (x, f, MPFR_RNDN);
107  if (mpfr_cmp_ui (x, 17) != 0)
108    {
109      printf ("Error for mpfr_set_flt(mpfr_get_flt(17))\n");
110      printf ("expected 17\n");
111      printf ("got      ");
112      mpfr_dump (x);
113      exit (1);
114    }
115
116  mpfr_set_si (x, -42, MPFR_RNDN);
117  f = mpfr_get_flt (x, MPFR_RNDN);
118  mpfr_set_flt (x, f, MPFR_RNDN);
119  if (mpfr_cmp_si (x, -42) != 0)
120    {
121      printf ("Error for mpfr_set_flt(mpfr_get_flt(-42))\n");
122      printf ("expected -42\n");
123      printf ("got      ");
124      mpfr_dump (x);
125      exit (1);
126    }
127
128  mpfr_set_si_2exp (x, 1, -126, MPFR_RNDN);
129  for (i = -126; i < 128; i++)
130    {
131      f = mpfr_get_flt (x, MPFR_RNDN);
132      mpfr_set_flt (y, f, MPFR_RNDN);
133      if (mpfr_cmp (x, y) != 0)
134        {
135          printf ("Error for mpfr_set_flt(mpfr_get_flt(x))\n");
136          printf ("expected "); mpfr_dump (x);
137          printf ("got      "); mpfr_dump (y);
138          exit (1);
139        }
140      mpfr_mul_2exp (x, x, 1, MPFR_RNDN);
141    }
142
143  mpfr_set_prec (x, 53);
144  mpfr_set_si_2exp (x, 1, -126, MPFR_RNDN);
145  for (i = -126; i < 128; i++)
146    {
147      mpfr_nextbelow (x);
148      f = mpfr_get_flt (x, MPFR_RNDN);
149      mpfr_nextabove (x);
150      mpfr_set_flt (y, f, MPFR_RNDN);
151      if (mpfr_cmp (x, y) != 0)
152        {
153          printf ("Error for mpfr_set_flt(mpfr_get_flt(x))\n");
154          printf ("expected "); mpfr_dump (x);
155          printf ("got      "); mpfr_dump (y);
156          exit (1);
157        }
158      mpfr_mul_2exp (x, x, 1, MPFR_RNDN);
159    }
160
161  mpfr_set_prec (x, 53);
162  mpfr_set_si_2exp (x, 1, -126, MPFR_RNDN);
163  for (i = -126; i < 128; i++)
164    {
165      mpfr_nextabove (x);
166      f = mpfr_get_flt (x, MPFR_RNDN);
167      mpfr_nextbelow (x);
168      mpfr_set_flt (y, f, MPFR_RNDN);
169      if (mpfr_cmp (x, y) != 0)
170        {
171          printf ("Error for mpfr_set_flt(mpfr_get_flt(x))\n");
172          printf ("expected "); mpfr_dump (x);
173          printf ("got      "); mpfr_dump (y);
174          exit (1);
175        }
176      mpfr_mul_2exp (x, x, 1, MPFR_RNDN);
177    }
178
179  mpfr_set_si_2exp (x, 1, -150, MPFR_RNDN);
180  g = 0.0;
181  f = mpfr_get_flt (x, MPFR_RNDN);
182  if (f != g)
183    {
184      printf ("Error for mpfr_get_flt(2^(-150),RNDN)\n");
185      printf ("expected %.8e, got %.8e\n", g, f);
186      exit (1);
187    }
188  f = mpfr_get_flt (x, MPFR_RNDZ);
189  if (f != g)
190    {
191      printf ("Error for mpfr_get_flt(2^(-150),RNDZ)\n");
192      printf ("expected %.8e, got %.8e\n", g, f);
193      exit (1);
194    }
195  f = mpfr_get_flt (x, MPFR_RNDD);
196  if (f != g)
197    {
198      printf ("Error for mpfr_get_flt(2^(-150),RNDD)\n");
199      printf ("expected %.8e, got %.8e\n", g, f);
200      exit (1);
201    }
202  g = FLT_MIN * FLT_EPSILON;
203  f = mpfr_get_flt (x, MPFR_RNDU);
204  if (f != g)
205    {
206      printf ("Error for mpfr_get_flt(2^(-150),RNDU)\n");
207      printf ("expected %.8e, got %.8e\n", g, f);
208      exit (1);
209    }
210  f = mpfr_get_flt (x, MPFR_RNDA);
211  if (f != g)
212    {
213      printf ("Error for mpfr_get_flt(2^(-150),RNDA)\n");
214      printf ("expected %.8e, got %.8e\n", g, f);
215      exit (1);
216    }
217
218  mpfr_set_si_2exp (x, 1, -151, MPFR_RNDN);
219  g = 0.0;
220  f = mpfr_get_flt (x, MPFR_RNDN);
221  if (f != g)
222    {
223      printf ("Error for mpfr_get_flt(2^(-151),RNDN)\n");
224      printf ("expected %.8e, got %.8e\n", g, f);
225      exit (1);
226    }
227  f = mpfr_get_flt (x, MPFR_RNDZ);
228  if (f != g)
229    {
230      printf ("Error for mpfr_get_flt(2^(-151),RNDZ)\n");
231      printf ("expected %.8e, got %.8e\n", g, f);
232      exit (1);
233    }
234  f = mpfr_get_flt (x, MPFR_RNDD);
235  if (f != g)
236    {
237      printf ("Error for mpfr_get_flt(2^(-151),RNDD)\n");
238      printf ("expected %.8e, got %.8e\n", g, f);
239      exit (1);
240    }
241  g = FLT_MIN * FLT_EPSILON;
242  f = mpfr_get_flt (x, MPFR_RNDU);
243  if (f != g)
244    {
245      printf ("Error for mpfr_get_flt(2^(-151),RNDU)\n");
246      printf ("expected %.8e, got %.8e\n", g, f);
247      exit (1);
248    }
249  f = mpfr_get_flt (x, MPFR_RNDA);
250  if (f != g)
251    {
252      printf ("Error for mpfr_get_flt(2^(-151),RNDA)\n");
253      printf ("expected %.8e, got %.8e\n", g, f);
254      exit (1);
255    }
256
257  mpfr_set_si_2exp (x, 1, -149, MPFR_RNDN);
258  g = FLT_MIN * FLT_EPSILON;
259  f = mpfr_get_flt (x, MPFR_RNDN);
260  if (f != g)
261    {
262      printf ("Error for mpfr_get_flt(2^(-149),RNDN)\n");
263      printf ("expected %.8e, got %.8e\n", g, f);
264      exit (1);
265    }
266  f = mpfr_get_flt (x, MPFR_RNDZ);
267  if (f != g)
268    {
269      printf ("Error for mpfr_get_flt(2^(-149),RNDZ)\n");
270      printf ("expected %.8e, got %.8e\n", g, f);
271      exit (1);
272    }
273  f = mpfr_get_flt (x, MPFR_RNDD);
274  if (f != g)
275    {
276      printf ("Error for mpfr_get_flt(2^(-149),RNDD)\n");
277      printf ("expected %.8e, got %.8e\n", g, f);
278      exit (1);
279    }
280  f = mpfr_get_flt (x, MPFR_RNDU);
281  if (f != g)
282    {
283      printf ("Error for mpfr_get_flt(2^(-149),RNDU)\n");
284      printf ("expected %.8e, got %.8e\n", g, f);
285      exit (1);
286    }
287  f = mpfr_get_flt (x, MPFR_RNDA);
288  if (f != g)
289    {
290      printf ("Error for mpfr_get_flt(2^(-149),RNDA)\n");
291      printf ("expected %.8e, got %.8e\n", g, f);
292      exit (1);
293    }
294
295  mpfr_set_si_2exp (x, 1, 128, MPFR_RNDN);
296  g = FLT_MAX;
297  f = mpfr_get_flt (x, MPFR_RNDZ);
298  if (f != g)
299    {
300      printf ("Error for mpfr_get_flt(2^128,RNDZ)\n");
301      printf ("expected %.8e, got %.8e\n", g, f);
302      exit (1);
303    }
304  f = mpfr_get_flt (x, MPFR_RNDD);
305  if (f != g)
306    {
307      printf ("Error for mpfr_get_flt(2^128,RNDD)\n");
308      printf ("expected %.8e, got %.8e\n", g, f);
309      exit (1);
310    }
311#if !defined(MPFR_ERRDIVZERO)
312  f = mpfr_get_flt (x, MPFR_RNDN); /* 2^128 rounds to itself with extended
313                                      exponent range, we should get +Inf */
314  g = infp;
315  if (f != g)
316    {
317      printf ("Error for mpfr_get_flt(2^128,RNDN)\n");
318      printf ("expected %.8e, got %.8e\n", g, f);
319      exit (1);
320    }
321  f = mpfr_get_flt (x, MPFR_RNDU);
322  if (f != g)
323    {
324      printf ("Error for mpfr_get_flt(2^128,RNDU)\n");
325      printf ("expected %.8e, got %.8e\n", g, f);
326      exit (1);
327    }
328  f = mpfr_get_flt (x, MPFR_RNDA);
329  if (f != g)
330    {
331      printf ("Error for mpfr_get_flt(2^128,RNDA)\n");
332      printf ("expected %.8e, got %.8e\n", g, f);
333      exit (1);
334    }
335#endif
336
337  /* corner case: take x with 25 bits just below 2^128 */
338  mpfr_set_prec (x, 25);
339  mpfr_set_si_2exp (x, 1, 128, MPFR_RNDN);
340  mpfr_nextbelow (x);
341  g = FLT_MAX;
342  f = mpfr_get_flt (x, MPFR_RNDZ);
343  if (f != g)
344    {
345      printf ("Error for mpfr_get_flt(2^128*(1-2^(-25)),RNDZ)\n");
346      printf ("expected %.8e, got %.8e\n", g, f);
347      exit (1);
348    }
349  f = mpfr_get_flt (x, MPFR_RNDD);
350  if (f != g)
351    {
352      printf ("Error for mpfr_get_flt(2^128*(1-2^(-25)),RNDD)\n");
353      printf ("expected %.8e, got %.8e\n", g, f);
354      exit (1);
355    }
356  f = mpfr_get_flt (x, MPFR_RNDN); /* first round to 2^128 (even rule),
357                                      thus we should get +Inf */
358  g = infp;
359  if (f != g)
360    {
361      printf ("Error for mpfr_get_flt(2^128*(1-2^(-25)),RNDN)\n");
362      printf ("expected %.8e, got %.8e\n", g, f);
363      exit (1);
364    }
365  f = mpfr_get_flt (x, MPFR_RNDU);
366  if (f != g)
367    {
368      printf ("Error for mpfr_get_flt(2^128*(1-2^(-25)),RNDU)\n");
369      printf ("expected %.8e, got %.8e\n", g, f);
370      exit (1);
371    }
372  f = mpfr_get_flt (x, MPFR_RNDA);
373  if (f != g)
374    {
375      printf ("Error for mpfr_get_flt(2^128*(1-2^(-25)),RNDA)\n");
376      printf ("expected %.8e, got %.8e\n", g, f);
377      exit (1);
378    }
379
380  mpfr_clear (x);
381  mpfr_clear (y);
382
383  tests_end_mpfr ();
384  return 0;
385}
386