xref: /netbsd-src/external/lgpl3/mpfr/dist/tests/tget_set_d64.c (revision ba125506a622fe649968631a56eba5d42ff57863)
1 /* Test file for mpfr_get_decimal64 and mpfr_set_decimal64.
2 
3 Copyright 2006-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 /* Needed due to the test on MPFR_WANT_DECIMAL_FLOATS */
24 #ifdef HAVE_CONFIG_H
25 # include "config.h"
26 #endif
27 
28 #ifdef MPFR_WANT_DECIMAL_FLOATS
29 
30 #include "mpfr-test.h"
31 
32 #ifndef DEC64_MAX
33 # define DEC64_MAX 9.999999999999999E384dd
34 #endif
35 
36 #if _MPFR_IEEE_FLOATS
37 static void
print_decimal64(_Decimal64 d)38 print_decimal64 (_Decimal64 d)
39 {
40   union mpfr_ieee_double_extract x;
41   union ieee_double_decimal64 y;
42   unsigned int Gh, i;
43 
44   y.d64 = d;
45   x.d = y.d;
46   Gh = x.s.exp >> 6;
47   printf ("|%d%d%d%d%d%d", x.s.sig, Gh >> 4, (Gh >> 3) & 1,
48           (Gh >> 2) & 1, (Gh >> 1) & 1, Gh & 1);
49   printf ("%d%d%d%d%d%d", (x.s.exp >> 5) & 1, (x.s.exp >> 4) & 1,
50           (x.s.exp >> 3) & 1, (x.s.exp >> 2) & 1, (x.s.exp >> 1) & 1,
51           x.s.exp & 1);
52   for (i = 20; i > 0; i--)
53     printf ("%d", (x.s.manh >> (i - 1)) & 1);
54   for (i = 32; i > 0; i--)
55     printf ("%d", (x.s.manl >> (i - 1)) & 1);
56   printf ("|\n");
57 }
58 #else
59 /* Portable version, assuming long double has at least 55 bits.
60    Note: __STDC_WANT_IEC_60559_DFP_EXT__ or __STDC_WANT_DEC_FP__
61    might allow to use printf("%.15De\n", d) */
62 static void
print_decimal64(_Decimal64 d)63 print_decimal64 (_Decimal64 d)
64 {
65   printf ("%.15Le\n", (long double) d);
66 }
67 #endif /* _MPFR_IEEE_FLOATS */
68 
69 #define PRINT_ERR_MISC(V)                                   \
70   do                                                        \
71     {                                                       \
72       printf ("Error in check_misc for %s.\n", V);          \
73       printf ("  mpfr_get_decimal64() returned: ");         \
74       print_decimal64 (d);                                  \
75       printf ("  mpfr_set_decimal64() set x to: ");         \
76       mpfr_out_str (stdout, 10, 0, x, MPFR_RNDN);           \
77       printf (" approx.\n    = ");                          \
78       mpfr_dump (x);                                        \
79       exit (1);                                             \
80     }                                                       \
81  while (0)
82 
83 static void
check_misc(void)84 check_misc (void)
85 {
86   mpfr_t  x, y;
87   _Decimal64 d;
88 
89   mpfr_init2 (x, 123);
90   mpfr_init2 (y, 123);
91 
92 #if !defined(MPFR_ERRDIVZERO)
93   mpfr_set_nan (x);
94   d = mpfr_get_decimal64 (x, MPFR_RNDZ);
95   mpfr_set_ui (x, 1, MPFR_RNDZ);
96   mpfr_set_decimal64 (x, d, MPFR_RNDZ);
97   MPFR_ASSERTN (mpfr_nan_p (x));
98 
99   mpfr_set_inf (x, 1);
100   d = mpfr_get_decimal64 (x, MPFR_RNDZ);
101   mpfr_set_ui (x, 1, MPFR_RNDZ);
102   mpfr_set_decimal64 (x, d, MPFR_RNDZ);
103   if (! mpfr_inf_p (x) || MPFR_IS_NEG (x))
104     PRINT_ERR_MISC ("+Inf");
105 
106   mpfr_set_inf (x, -1);
107   d = mpfr_get_decimal64 (x, MPFR_RNDZ);
108   mpfr_set_ui (x, 1, MPFR_RNDZ);
109   mpfr_set_decimal64 (x, d, MPFR_RNDZ);
110   if (! mpfr_inf_p (x) || MPFR_IS_POS (x))
111     PRINT_ERR_MISC ("-Inf");
112 #endif
113 
114   mpfr_set_ui (x, 0, MPFR_RNDZ);
115   d = mpfr_get_decimal64 (x, MPFR_RNDZ);
116   mpfr_set_ui (x, 1, MPFR_RNDZ);
117   mpfr_set_decimal64 (x, d, MPFR_RNDZ);
118   if (MPFR_NOTZERO (x) || MPFR_IS_NEG (x))
119     PRINT_ERR_MISC ("+0");
120 
121   mpfr_set_ui (x, 0, MPFR_RNDZ);
122   mpfr_neg (x, x, MPFR_RNDZ);
123   d = mpfr_get_decimal64 (x, MPFR_RNDZ);
124   mpfr_set_ui (x, 1, MPFR_RNDZ);
125   mpfr_set_decimal64 (x, d, MPFR_RNDZ);
126   if (MPFR_NOTZERO (x) || MPFR_IS_POS (x))
127     PRINT_ERR_MISC ("-0");
128 
129   mpfr_set_ui (x, 1, MPFR_RNDZ);
130   d = mpfr_get_decimal64 (x, MPFR_RNDZ);
131   mpfr_set_ui (x, 0, MPFR_RNDZ);
132   mpfr_set_decimal64 (x, d, MPFR_RNDZ);
133   if (mpfr_cmp_ui (x, 1) != 0)
134     PRINT_ERR_MISC ("+1");
135 
136   mpfr_set_si (x, -1, MPFR_RNDZ);
137   d = mpfr_get_decimal64 (x, MPFR_RNDZ);
138   mpfr_set_ui (x, 0, MPFR_RNDZ);
139   mpfr_set_decimal64 (x, d, MPFR_RNDZ);
140   if (mpfr_cmp_si (x, -1) != 0)
141     PRINT_ERR_MISC ("-1");
142 
143   mpfr_set_ui (x, 2, MPFR_RNDZ);
144   d = mpfr_get_decimal64 (x, MPFR_RNDZ);
145   mpfr_set_ui (x, 0, MPFR_RNDZ);
146   mpfr_set_decimal64 (x, d, MPFR_RNDZ);
147   if (mpfr_cmp_ui (x, 2) != 0)
148     PRINT_ERR_MISC ("2");
149 
150   mpfr_set_ui (x, 99, MPFR_RNDZ);
151   d = mpfr_get_decimal64 (x, MPFR_RNDZ);
152   mpfr_set_ui (x, 0, MPFR_RNDZ);
153   mpfr_set_decimal64 (x, d, MPFR_RNDZ);
154   if (mpfr_cmp_ui (x, 99) != 0)
155     PRINT_ERR_MISC ("99");
156 
157   mpfr_set_str (x, "9999999999999999", 10, MPFR_RNDZ);
158   mpfr_set (y, x, MPFR_RNDZ);
159   d = mpfr_get_decimal64 (x, MPFR_RNDZ);
160   mpfr_set_ui (x, 0, MPFR_RNDZ);
161   mpfr_set_decimal64 (x, d, MPFR_RNDZ);
162   if (! mpfr_equal_p (x, y))
163     PRINT_ERR_MISC ("9999999999999999");
164 
165   /* smallest normal number */
166   mpfr_set_str (x, "1E-383", 10, MPFR_RNDU);
167   mpfr_set (y, x, MPFR_RNDZ);
168   d = mpfr_get_decimal64 (x, MPFR_RNDZ);
169   mpfr_set_ui (x, 0, MPFR_RNDZ);
170   mpfr_set_decimal64 (x, d, MPFR_RNDU);
171   if (! mpfr_equal_p (x, y))
172     PRINT_ERR_MISC ("1E-383");
173 
174   /* smallest subnormal number */
175   mpfr_set_str (x, "1E-398", 10, MPFR_RNDU);
176   mpfr_set (y, x, MPFR_RNDZ);
177   d = mpfr_get_decimal64 (x, MPFR_RNDZ);
178   mpfr_set_ui (x, 0, MPFR_RNDZ);
179   mpfr_set_decimal64 (x, d, MPFR_RNDU);
180   if (! mpfr_equal_p (x, y))
181     PRINT_ERR_MISC ("1E-398");
182 
183   /* exercise case e < -1323, i.e., x < 0.5*2^(-1323) */
184   mpfr_set_ui_2exp (x, 1, -1324, MPFR_RNDN);
185   mpfr_nextbelow (x);
186   d = mpfr_get_decimal64 (x, MPFR_RNDZ);
187   /* d should equal +0 */
188   mpfr_set_decimal64 (x, d, MPFR_RNDN);
189   MPFR_ASSERTN(mpfr_zero_p (x) && mpfr_signbit (x) == 0);
190   /* check RNDA */
191   mpfr_set_ui_2exp (x, 1, -1324, MPFR_RNDN);
192   mpfr_nextbelow (x);
193   d = mpfr_get_decimal64 (x, MPFR_RNDA);
194   /* d should equal 1E-398 */
195   mpfr_set_decimal64 (x, d, MPFR_RNDN);
196   mpfr_set_str (y, "1E-398", 10, MPFR_RNDN);
197   MPFR_ASSERTN(mpfr_equal_p (x, y));
198   /* check negative number */
199   mpfr_set_ui_2exp (x, 1, -1324, MPFR_RNDN);
200   mpfr_nextbelow (x);
201   mpfr_neg (x, x, MPFR_RNDN);
202   d = mpfr_get_decimal64 (x, MPFR_RNDZ);
203   /* d should equal -0 */
204   mpfr_set_decimal64 (x, d, MPFR_RNDN);
205   MPFR_ASSERTN(mpfr_zero_p (x) && mpfr_signbit (x) == 1);
206 
207   /* exercise case e10 < -397 */
208   mpfr_set_ui_2exp (x, 1, -1323, MPFR_RNDN);
209   d = mpfr_get_decimal64 (x, MPFR_RNDZ);
210   mpfr_set_decimal64 (x, d, MPFR_RNDN);
211   MPFR_ASSERTN(mpfr_zero_p (x) && mpfr_signbit (x) == 0);
212   mpfr_set_ui_2exp (x, 1, -1323, MPFR_RNDN);
213   d = mpfr_get_decimal64 (x, MPFR_RNDU);
214   mpfr_set_str (y, "1E-398", 10, MPFR_RNDN);
215   mpfr_set_decimal64 (x, d, MPFR_RNDN);
216   MPFR_ASSERTN(mpfr_equal_p (x, y));
217   mpfr_set_ui_2exp (x, 1, -1323, MPFR_RNDN);
218   /* 2^(-1323) = 5.46154776930125e-399 thus should be rounded to 1E-398 */
219   d = mpfr_get_decimal64 (x, MPFR_RNDN);
220   mpfr_set_str (y, "1E-398", 10, MPFR_RNDN);
221   mpfr_set_decimal64 (x, d, MPFR_RNDN);
222   MPFR_ASSERTN(mpfr_equal_p (x, y));
223 
224   /* subnormal number with exponent change when we round back
225      from 16 digits to 1 digit */
226   mpfr_set_str (x, "9.9E-398", 10, MPFR_RNDN);
227   d = mpfr_get_decimal64 (x, MPFR_RNDU); /* should be 1E-397 */
228   mpfr_set_ui (x, 0, MPFR_RNDZ);
229   mpfr_set_decimal64 (x, d, MPFR_RNDD);
230   mpfr_set_str (y, "1E-397", 10, MPFR_RNDN);
231   if (! mpfr_equal_p (x, y))
232     PRINT_ERR_MISC ("9.9E-398");
233 
234   /* largest number */
235   mpfr_set_str (x, "9.999999999999999E384", 10, MPFR_RNDZ);
236   mpfr_set (y, x, MPFR_RNDZ);
237   d = mpfr_get_decimal64 (x, MPFR_RNDU);
238   if (d == DEC64_MAX)
239     {
240       mpfr_set_ui (x, 0, MPFR_RNDZ);
241       mpfr_set_decimal64 (x, d, MPFR_RNDZ);
242       if (! mpfr_equal_p (x, y))
243         PRINT_ERR_MISC ("DEC64_MAX");
244     }
245   else
246     {
247       printf ("Error in check_misc for DEC64_MAX.\n");
248       printf ("  mpfr_get_decimal64() returned: ");
249       print_decimal64 (d);
250       exit (1);
251     }
252 
253   mpfr_set_str (x, "-9.999999999999999E384", 10, MPFR_RNDZ);
254   mpfr_set (y, x, MPFR_RNDZ);
255   d = mpfr_get_decimal64 (x, MPFR_RNDA);
256   if (d == -DEC64_MAX)
257     {
258       mpfr_set_ui (x, 0, MPFR_RNDZ);
259       mpfr_set_decimal64 (x, d, MPFR_RNDZ);
260       if (! mpfr_equal_p (x, y))
261         PRINT_ERR_MISC ("-DEC64_MAX");
262     }
263   else
264     {
265       printf ("Error in check_misc for -DEC64_MAX.\n");
266       printf ("  mpfr_get_decimal64() returned: ");
267       print_decimal64 (d);
268       exit (1);
269     }
270 
271   mpfr_set_prec (x, 53);
272   mpfr_set_prec (y, 53);
273 
274   /* largest number */
275   mpfr_set_str (x, "9.999999999999999E384", 10, MPFR_RNDZ);
276   d = mpfr_get_decimal64 (x, MPFR_RNDZ);
277   mpfr_set_decimal64 (y, d, MPFR_RNDU);
278   if (! mpfr_equal_p (x, y))
279     PRINT_ERR_MISC ("DEC64_MAX (2)");
280 
281   mpfr_clear (x);
282   mpfr_clear (y);
283 }
284 
285 static void
check_random(void)286 check_random (void)
287 {
288   mpfr_t  x, y;
289   _Decimal64 d;
290   int i;
291 
292   mpfr_init2 (x, 49);
293   mpfr_init2 (y, 49);
294 
295   for (i = 0; i < 100000; i++)
296     {
297       mpfr_urandomb (x, RANDS); /* 0 <= x < 1 */
298       /* the normal decimal64 range contains [2^(-1272), 2^1278] */
299       mpfr_mul_2si (x, x, (i % 2550) - 1272, MPFR_RNDN);
300       if (mpfr_get_exp (x) <= -1272)
301         mpfr_mul_2ui (x, x, -1271 - mpfr_get_exp (x), MPFR_RNDN);
302       d = mpfr_get_decimal64 (x, MPFR_RNDN);
303       mpfr_set_decimal64 (y, d, MPFR_RNDN);
304       if (! mpfr_equal_p (x, y))
305         {
306           printf ("Error:\n");
307           printf ("x="); mpfr_dump (x);
308           printf ("d="); print_decimal64 (d);
309           printf ("y="); mpfr_dump (y);
310           exit (1);
311         }
312     }
313 
314   mpfr_clear (x);
315   mpfr_clear (y);
316 }
317 
318 /* check with native decimal formats */
319 static void
check_native(void)320 check_native (void)
321 {
322   mpfr_t x;
323   _Decimal64 d;
324 
325   mpfr_init2 (x, 53);
326 
327   /* check important constants are correctly converted */
328   mpfr_set_ui (x, 17, MPFR_RNDN);
329   d = mpfr_get_decimal64 (x, MPFR_RNDN);
330   MPFR_ASSERTN(d == 17.dd);
331 
332   mpfr_set_ui (x, 42, MPFR_RNDN);
333   d = mpfr_get_decimal64 (x, MPFR_RNDN);
334   MPFR_ASSERTN(d == 42.dd);
335 
336   mpfr_set_decimal64 (x, 17.dd, MPFR_RNDN);
337   MPFR_ASSERTN(mpfr_cmp_ui (x, 17) == 0);
338 
339   mpfr_set_decimal64 (x, 17.0dd, MPFR_RNDN);
340   MPFR_ASSERTN(mpfr_cmp_ui (x, 17) == 0);
341 
342   mpfr_set_decimal64 (x, 42.dd, MPFR_RNDN);
343   MPFR_ASSERTN(mpfr_cmp_ui (x, 42) == 0);
344 
345   mpfr_set_decimal64 (x, 42.0dd, MPFR_RNDN);
346   MPFR_ASSERTN(mpfr_cmp_ui (x, 42) == 0);
347 
348   mpfr_clear (x);
349 }
350 
351 static void
check_overflow(void)352 check_overflow (void)
353 {
354   mpfr_t x;
355   int err = 0, neg, rnd;
356 
357   mpfr_init2 (x, 96);
358   for (neg = 0; neg < 2; neg++)
359     RND_LOOP (rnd)
360       {
361         _Decimal64 d, e;
362         mpfr_rnd_t r = (mpfr_rnd_t) rnd;
363         int sign = neg ? -1 : 1;
364 
365         e = sign * (MPFR_IS_LIKE_RNDZ (r, neg) ? 1 : 2) * DEC64_MAX;
366         /* This tests the binary exponent e > 1279 case of get_d64.c */
367         mpfr_set_si_2exp (x, sign, 9999, MPFR_RNDN);
368         d = mpfr_get_decimal64 (x, r);
369         if (d != e)
370           {
371             printf ("Error 1 in check_overflow for %s, %s\n",
372                     neg ? "negative" : "positive",
373                     mpfr_print_rnd_mode (r));
374             err = 1;
375           }
376         /* This tests the decimal exponent e > 385 case of get_d64.c */
377         mpfr_set_si_2exp (x, sign * 31, 1274, MPFR_RNDN);
378         d = mpfr_get_decimal64 (x, r);
379         if (d != e)
380           {
381             printf ("Error 2 in check_overflow for %s, %s\n",
382                     neg ? "negative" : "positive",
383                     mpfr_print_rnd_mode (r));
384             err = 1;
385           }
386         /* This tests the last else (-382 <= e <= 385) of get_d64.c */
387         mpfr_set_decimal64 (x, e, MPFR_RNDA);
388         d = mpfr_get_decimal64 (x, r);
389         if (d != e)
390           {
391             printf ("Error 3 in check_overflow for %s, %s\n",
392                     neg ? "negative" : "positive",
393                     mpfr_print_rnd_mode (r));
394             err = 1;
395           }
396       }
397   mpfr_clear (x);
398   if (err)
399     exit (1);
400 }
401 
402 static void
check_tiny(void)403 check_tiny (void)
404 {
405   mpfr_t x;
406   _Decimal64 d;
407 
408   /* If 0.5E-398 < |x| < 1E-398 (smallest subnormal), x should round
409      to +/- 1E-398 in MPFR_RNDN. Note: the midpoint 0.5E-398 between
410      0 and 1E-398 is not a representable binary number, so that there
411      are no tests for it. */
412   mpfr_init2 (x, 128);
413   mpfr_set_str (x, "1E-398", 10, MPFR_RNDZ);
414   d = mpfr_get_decimal64 (x, MPFR_RNDN);
415   MPFR_ASSERTN (d == 1.0E-398dd);
416   mpfr_neg (x, x, MPFR_RNDN);
417   d = mpfr_get_decimal64 (x, MPFR_RNDN);
418   MPFR_ASSERTN (d == -1.0E-398dd);
419   mpfr_set_str (x, "0.5E-398", 10, MPFR_RNDU);
420   d = mpfr_get_decimal64 (x, MPFR_RNDN);
421   MPFR_ASSERTN (d == 1.0E-398dd);
422   mpfr_neg (x, x, MPFR_RNDN);
423   d = mpfr_get_decimal64 (x, MPFR_RNDN);
424   MPFR_ASSERTN (d == -1.0E-398dd);
425   mpfr_clear (x);
426 }
427 
428 static void
powers_of_10(void)429 powers_of_10 (void)
430 {
431   mpfr_t x1, x2;
432   _Decimal64 d[2];
433   int i, rnd;
434   unsigned int neg;
435 
436   mpfr_inits2 (200, x1, x2, (mpfr_ptr) 0);
437   for (i = 0, d[0] = 1, d[1] = 1; i < 150; i++, d[0] *= 10, d[1] /= 10)
438     for (neg = 0; neg <= 3; neg++)
439       RND_LOOP_NO_RNDF (rnd)
440         {
441           int inex1, inex2;
442           mpfr_flags_t flags1, flags2;
443           mpfr_rnd_t rx1;
444           _Decimal64 dd;
445 
446           inex1 = mpfr_set_si (x1, (neg >> 1) ? -i : i, MPFR_RNDN);
447           MPFR_ASSERTN (inex1 == 0);
448 
449           rx1 = (neg & 1) ?
450             MPFR_INVERT_RND ((mpfr_rnd_t) rnd) : (mpfr_rnd_t) rnd;
451           mpfr_clear_flags ();
452           inex1 = mpfr_exp10 (x1, x1, rx1);
453           flags1 = __gmpfr_flags;
454 
455           dd = d[neg >> 1];
456 
457           if (neg & 1)
458             {
459               MPFR_SET_NEG (x1);
460               inex1 = -inex1;
461               dd = -dd;
462             }
463 
464           mpfr_clear_flags ();
465           inex2 = mpfr_set_decimal64 (x2, dd, (mpfr_rnd_t) rnd);
466           flags2 = __gmpfr_flags;
467 
468           if (!(mpfr_equal_p (x1, x2) &&
469                 SAME_SIGN (inex1, inex2) &&
470                 flags1 == flags2))
471             {
472               printf ("Error in powers_of_10 for i=%d, neg=%d, %s\n",
473                       i, neg, mpfr_print_rnd_mode ((mpfr_rnd_t) rnd));
474               printf ("Expected ");
475               mpfr_dump (x1);
476               printf ("with inex = %d and flags =", inex1);
477               flags_out (flags1);
478               printf ("Got      ");
479               mpfr_dump (x2);
480               printf ("with inex = %d and flags =", inex2);
481               flags_out (flags2);
482               exit (1);
483             }
484         }
485   mpfr_clears (x1, x2, (mpfr_ptr) 0);
486 }
487 
488 static void
noncanonical(void)489 noncanonical (void)
490 {
491   /* The code below assumes BID. It also needs _MPFR_IEEE_FLOATS
492      due to the use of union mpfr_ieee_double_extract. */
493 #if _MPFR_IEEE_FLOATS && defined(DECIMAL_BID_FORMAT)
494   /* The volatile below avoids _Decimal64 constant propagation, which is
495      buggy for non-canonical encoding in various GCC versions on the x86 and
496      x86_64 targets: failure with gcc (Debian 20190719-1) 10.0.0 20190718
497      (experimental) [trunk revision 273586]; the MPFR test was not failing
498      with previous GCC versions, but GCC versions 5 to 9 are also affected
499      on the simple testcase at:
500      https://gcc.gnu.org/bugzilla/show_bug.cgi?id=91226
501   */
502   volatile _Decimal64 d = 9999999999999999.dd;
503   union mpfr_ieee_double_extract x;
504   union ieee_double_decimal64 y;
505 
506   MPFR_ASSERTN (sizeof (x) == 8);
507   MPFR_ASSERTN (sizeof (y) == 8);
508   /* test for non-canonical encoding */
509   y.d64 = d;
510   memcpy (&x, &y, 8);
511   /* if BID, we have sig=0, exp=1735, manh=231154, manl=1874919423 */
512   if (x.s.sig == 0 && x.s.exp == 1735 && x.s.manh == 231154 &&
513       x.s.manl == 1874919423)
514     {
515       mpfr_t z;
516       mpfr_init2 (z, 54); /* 54 bits ensure z is exact, since 10^16 < 2^54 */
517       x.s.manl += 1; /* then the significand equals 10^16 */
518       memcpy (&y, &x, 8);
519       mpfr_set_decimal64 (z, y.d64, MPFR_RNDN);
520       if (MPFR_NOTZERO (z) || MPFR_IS_NEG (z))
521         {
522           int i;
523           printf ("Error in noncanonical on");
524           for (i = 0; i < 8; i++)
525             printf (" %02X", ((unsigned char *)&y)[i]);
526           printf ("\nExpected +0, got:\n");
527           mpfr_dump (z);
528           exit (1);
529         }
530       mpfr_clear (z);
531     }
532   else
533     printf ("Warning! Unexpected value of x in noncanonical.\n");
534 #endif
535 }
536 
537 /* generate random sequences of 8 bytes and interpret them as _Decimal64 */
538 static void
check_random_bytes(void)539 check_random_bytes (void)
540 {
541   union {
542     _Decimal64 d;
543     unsigned char c[8];
544   } x;
545   int i;
546   mpfr_t y;
547   _Decimal64 e;
548 
549   mpfr_init2 (y, 55); /* 55 = 1 + ceil(16*log(10)/log(2)), thus ensures
550                          that if a decimal64 number is converted to a 55-bit
551                          value and back, we should get the same value */
552   for (i = 0; i < 100000; i++)
553     {
554       int j;
555       for (j = 0; j < 8; j++)
556         x.c[j] = randlimb () & 255;
557       mpfr_set_decimal64 (y, x.d, MPFR_RNDN);
558       e = mpfr_get_decimal64 (y, MPFR_RNDN);
559       if (!mpfr_nan_p (y))
560         if (x.d != e)
561           {
562             printf ("check_random_bytes failed\n");
563             printf ("x.d="); print_decimal64 (x.d);
564             printf ("y="); mpfr_dump (y);
565             printf ("e  ="); print_decimal64 (e);
566             exit (1);
567           }
568     }
569   mpfr_clear (y);
570 }
571 
572 int
main(int argc,char * argv[])573 main (int argc, char *argv[])
574 {
575   int verbose = argc > 1;
576 
577   tests_start_mpfr ();
578   mpfr_test_init ();
579 
580   if (verbose)
581     {
582 #ifdef DECIMAL_DPD_FORMAT
583       printf ("Using DPD encoding\n");
584 #endif
585 #ifdef DECIMAL_BID_FORMAT
586       printf ("Using BID encoding\n");
587 #endif
588     }
589 
590 #if !defined(MPFR_ERRDIVZERO)
591   check_random_bytes ();
592 #endif
593   noncanonical ();
594   check_misc ();
595   check_random ();
596   check_native ();
597 #if !defined(MPFR_ERRDIVZERO)
598   check_overflow ();
599 #endif
600   check_tiny ();
601   powers_of_10 ();
602 
603   tests_end_mpfr ();
604   return 0;
605 }
606 
607 #else /* MPFR_WANT_DECIMAL_FLOATS */
608 
609 int
main(void)610 main (void)
611 {
612   return 77;
613 }
614 
615 #endif /* MPFR_WANT_DECIMAL_FLOATS */
616