xref: /netbsd-src/external/lgpl3/mpfr/dist/tests/tget_set_d128.c (revision ba125506a622fe649968631a56eba5d42ff57863)
1 /* Test file for mpfr_set_decimal128 and mpfr_get_decimal128.
2 
3 Copyright 2018-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 DEC128_MAX
33 # define DEC128_MAX 9.999999999999999999999999999999999E6144dl
34 #endif
35 
36 static void
print_decimal128(_Decimal128 d)37 print_decimal128 (_Decimal128 d)
38 {
39   if (DOUBLE_ISNAN (d))
40     printf ("NaN");
41   else if (d > DEC128_MAX)
42     printf ("Inf");
43   else if (d < -DEC128_MAX)
44     printf ("-Inf");
45   else if (d == 0)
46     {
47       printf ("%.1f", (double) d);
48     }
49   else /* regular number */
50     {
51       long e = 0;
52       while (d < 1.dl)
53         {
54           d *= 10.dl;
55           e --;
56         }
57       /* now d >= 1 */
58       while (d > 10.dl)
59         {
60           d /= 10.dl;
61           e ++;
62         }
63       /* now 1 <= d < 10 */
64       printf ("%.33LfE%ld", (long double) d, e);
65     }
66   printf ("\n");
67 }
68 
69 #define PRINT_ERR_MISC(V)                                   \
70   do                                                        \
71     {                                                       \
72       printf ("Error in check_misc for %s.\n", V);          \
73       printf ("  mpfr_get_decimal128() returned: ");        \
74       print_decimal128 (d);                                 \
75       printf ("  mpfr_set_decimal128() 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
test_set(void)84 test_set (void)
85 {
86   long v[] = { 1, -1, 2147483647, -2147483647 };
87   mpfr_t x;
88   mpfr_flags_t flags;
89   int i, inex;
90 
91   mpfr_init2 (x, 53);
92   for (i = 0; i < numberof (v); i++)
93     {
94       mpfr_clear_flags ();
95       inex = mpfr_set_decimal128 (x, (_Decimal128) v[i], MPFR_RNDN);
96       flags = __gmpfr_flags;
97       if (mpfr_cmp_si (x, v[i]) != 0 || inex != 0 || flags != 0)
98         {
99           printf ("Error in test_set for i=%d\n", i);
100           printf ("Expected %ld\n    with inex = 0 and flags =", v[i]);
101           flags_out (0);
102           printf ("Got      ");
103           mpfr_dump (x);
104           printf ("    with inex = %d and flags =", inex);
105           flags_out (flags);
106           exit (1);
107         }
108     }
109   mpfr_clear (x);
110 }
111 
112 static void
powers_of_10(void)113 powers_of_10 (void)
114 {
115   mpfr_t x1, x2;
116   _Decimal128 d[2];
117   int i, rnd;
118   unsigned int neg;
119 
120   mpfr_inits2 (200, x1, x2, (mpfr_ptr) 0);
121   for (i = 0, d[0] = 1, d[1] = 1; i < 150; i++, d[0] *= 10, d[1] /= 10)
122     for (neg = 0; neg <= 3; neg++)
123       RND_LOOP_NO_RNDF (rnd)
124         {
125           int inex1, inex2;
126           mpfr_flags_t flags1, flags2;
127           mpfr_rnd_t rx1;
128           _Decimal128 dd;
129 
130           inex1 = mpfr_set_si (x1, (neg >> 1) ? -i : i, MPFR_RNDN);
131           MPFR_ASSERTN (inex1 == 0);
132 
133           rx1 = (neg & 1) ?
134             MPFR_INVERT_RND ((mpfr_rnd_t) rnd) : (mpfr_rnd_t) rnd;
135           mpfr_clear_flags ();
136           inex1 = mpfr_exp10 (x1, x1, rx1);
137           flags1 = __gmpfr_flags;
138 
139           dd = d[neg >> 1];
140 
141           if (neg & 1)
142             {
143               MPFR_SET_NEG (x1);
144               inex1 = -inex1;
145               dd = -dd;
146             }
147 
148           mpfr_clear_flags ();
149           inex2 = mpfr_set_decimal128 (x2, dd, (mpfr_rnd_t) rnd);
150           flags2 = __gmpfr_flags;
151 
152           if (!(mpfr_equal_p (x1, x2) &&
153                 SAME_SIGN (inex1, inex2) &&
154                 flags1 == flags2))
155             {
156               printf ("Error in powers_of_10 for i=%d, neg=%d, %s\n",
157                       i, neg, mpfr_print_rnd_mode ((mpfr_rnd_t) rnd));
158               printf ("Expected ");
159               mpfr_dump (x1);
160               printf ("with inex = %d and flags =", inex1);
161               flags_out (flags1);
162               printf ("Got      ");
163               mpfr_dump (x2);
164               printf ("with inex = %d and flags =", inex2);
165               flags_out (flags2);
166               exit (1);
167             }
168         }
169   mpfr_clears (x1, x2, (mpfr_ptr) 0);
170 }
171 
172 static void
check_misc(void)173 check_misc (void)
174 {
175   mpfr_t  x, y;
176   _Decimal128 d;
177 
178   mpfr_init2 (x, 123);
179   mpfr_init2 (y, 123);
180 
181 #if !defined(MPFR_ERRDIVZERO)
182   mpfr_set_nan (x);
183   d = mpfr_get_decimal128 (x, MPFR_RNDZ);
184   mpfr_set_ui (x, 1, MPFR_RNDZ);
185   mpfr_set_decimal128 (x, d, MPFR_RNDZ);
186   MPFR_ASSERTN (mpfr_nan_p (x));
187 
188   mpfr_set_inf (x, 1);
189   d = mpfr_get_decimal128 (x, MPFR_RNDZ);
190   mpfr_set_ui (x, 1, MPFR_RNDZ);
191   mpfr_set_decimal128 (x, d, MPFR_RNDZ);
192   if (! mpfr_inf_p (x) || MPFR_IS_NEG (x))
193     PRINT_ERR_MISC ("+Inf");
194 
195   mpfr_set_inf (x, -1);
196   d = mpfr_get_decimal128 (x, MPFR_RNDZ);
197   mpfr_set_ui (x, 1, MPFR_RNDZ);
198   mpfr_set_decimal128 (x, d, MPFR_RNDZ);
199   if (! mpfr_inf_p (x) || MPFR_IS_POS (x))
200     PRINT_ERR_MISC ("-Inf");
201 #endif
202 
203   mpfr_set_ui (x, 0, MPFR_RNDZ);
204   d = mpfr_get_decimal128 (x, MPFR_RNDZ);
205   mpfr_set_ui (x, 1, MPFR_RNDZ);
206   mpfr_set_decimal128 (x, d, MPFR_RNDZ);
207   if (MPFR_NOTZERO (x) || MPFR_IS_NEG (x))
208     PRINT_ERR_MISC ("+0");
209 
210   mpfr_set_ui (x, 0, MPFR_RNDZ);
211   mpfr_neg (x, x, MPFR_RNDZ);
212   d = mpfr_get_decimal128 (x, MPFR_RNDZ);
213   mpfr_set_ui (x, 1, MPFR_RNDZ);
214   mpfr_set_decimal128 (x, d, MPFR_RNDZ);
215   if (MPFR_NOTZERO (x) || MPFR_IS_POS (x))
216     PRINT_ERR_MISC ("-0");
217 
218   mpfr_set_ui (x, 1, MPFR_RNDZ);
219   d = mpfr_get_decimal128 (x, MPFR_RNDZ);
220   mpfr_set_ui (x, 0, MPFR_RNDZ);
221   mpfr_set_decimal128 (x, d, MPFR_RNDZ);
222   if (mpfr_cmp_ui (x, 1) != 0)
223     PRINT_ERR_MISC ("+1");
224 
225   mpfr_set_si (x, -1, MPFR_RNDZ);
226   d = mpfr_get_decimal128 (x, MPFR_RNDZ);
227   mpfr_set_ui (x, 0, MPFR_RNDZ);
228   mpfr_set_decimal128 (x, d, MPFR_RNDZ);
229   if (mpfr_cmp_si (x, -1) != 0)
230     PRINT_ERR_MISC ("-1");
231 
232   mpfr_set_ui (x, 2, MPFR_RNDZ);
233   d = mpfr_get_decimal128 (x, MPFR_RNDZ);
234   mpfr_set_ui (x, 0, MPFR_RNDZ);
235   mpfr_set_decimal128 (x, d, MPFR_RNDZ);
236   if (mpfr_cmp_ui (x, 2) != 0)
237     PRINT_ERR_MISC ("2");
238 
239   mpfr_set_ui (x, 99, MPFR_RNDZ);
240   d = mpfr_get_decimal128 (x, MPFR_RNDZ);
241   mpfr_set_ui (x, 0, MPFR_RNDZ);
242   mpfr_set_decimal128 (x, d, MPFR_RNDZ);
243   if (mpfr_cmp_ui (x, 99) != 0)
244     PRINT_ERR_MISC ("99");
245 
246   mpfr_set_str (x, "9999999999999999999999999999999999", 10, MPFR_RNDZ);
247   mpfr_set (y, x, MPFR_RNDZ);
248   d = mpfr_get_decimal128 (x, MPFR_RNDZ);
249   mpfr_set_ui (x, 0, MPFR_RNDZ);
250   mpfr_set_decimal128 (x, d, MPFR_RNDZ);
251   if (! mpfr_equal_p (x, y))
252     PRINT_ERR_MISC ("9999999999999999999999999999999999");
253 
254   /* smallest normal number */
255   mpfr_set_str (x, "1E-6143", 10, MPFR_RNDU);
256   mpfr_set (y, x, MPFR_RNDZ);
257   d = mpfr_get_decimal128 (x, MPFR_RNDZ);
258   mpfr_set_ui (x, 0, MPFR_RNDZ);
259   mpfr_set_decimal128 (x, d, MPFR_RNDU);
260   if (! mpfr_equal_p (x, y))
261     PRINT_ERR_MISC ("1E-6143");
262 
263   /* smallest subnormal number */
264   mpfr_set_str (x, "1E-6176", 10, MPFR_RNDU);
265   mpfr_set (y, x, MPFR_RNDZ);
266   d = mpfr_get_decimal128 (x, MPFR_RNDZ);
267   mpfr_set_ui (x, 0, MPFR_RNDZ);
268   mpfr_set_decimal128 (x, d, MPFR_RNDU);
269   if (! mpfr_equal_p (x, y))
270     PRINT_ERR_MISC ("1E-6176");
271 
272   /* exercise case e < -20517, i.e., x < 0.5*2^(-20517) */
273   mpfr_set_ui_2exp (x, 1, -20518, MPFR_RNDN);
274   mpfr_nextbelow (x);
275   d = mpfr_get_decimal128 (x, MPFR_RNDZ);
276   /* d should equal +0 */
277   mpfr_set_decimal128 (x, d, MPFR_RNDN);
278   MPFR_ASSERTN(mpfr_zero_p (x) && mpfr_signbit (x) == 0);
279   /* check RNDA */
280   mpfr_set_ui_2exp (x, 1, -20518, MPFR_RNDN);
281   mpfr_nextbelow (x);
282   d = mpfr_get_decimal128 (x, MPFR_RNDA);
283   /* d should equal 1E-6176 */
284   mpfr_set_decimal128 (x, d, MPFR_RNDN);
285   mpfr_set_str (y, "1E-6176", 10, MPFR_RNDN);
286   MPFR_ASSERTN(mpfr_equal_p (x, y));
287   /* check negative number */
288   mpfr_set_ui_2exp (x, 1, -20518, MPFR_RNDN);
289   mpfr_nextbelow (x);
290   mpfr_neg (x, x, MPFR_RNDN);
291   d = mpfr_get_decimal128 (x, MPFR_RNDZ);
292   /* d should equal -0 */
293   mpfr_set_decimal128 (x, d, MPFR_RNDN);
294   MPFR_ASSERTN(mpfr_zero_p (x) && mpfr_signbit (x) == 1);
295 
296   /* exercise case e10 < -6175 */
297   mpfr_set_ui_2exp (x, 1, -20517, MPFR_RNDN);
298   d = mpfr_get_decimal128 (x, MPFR_RNDZ);
299   mpfr_set_decimal128 (x, d, MPFR_RNDN);
300   MPFR_ASSERTN(mpfr_zero_p (x) && mpfr_signbit (x) == 0);
301   mpfr_set_ui_2exp (x, 1, -20517, MPFR_RNDN);
302   d = mpfr_get_decimal128 (x, MPFR_RNDU);
303   mpfr_set_str (y, "1E-6176", 10, MPFR_RNDN);
304   mpfr_set_decimal128 (x, d, MPFR_RNDN);
305   MPFR_ASSERTN(mpfr_equal_p (x, y));
306   mpfr_set_ui_2exp (x, 1, -20517, MPFR_RNDN);
307   /* 2^(-20517) = 5.85570193228610e-6177 thus should be rounded to 1E-6176 */
308   d = mpfr_get_decimal128 (x, MPFR_RNDN);
309   mpfr_set_str (y, "1E-6176", 10, MPFR_RNDN);
310   mpfr_set_decimal128 (x, d, MPFR_RNDN);
311   MPFR_ASSERTN(mpfr_equal_p (x, y));
312 
313   /* subnormal number with exponent change when we round back
314      from 34 digits to 1 digit */
315   mpfr_set_str (x, "9.9E-6176", 10, MPFR_RNDN);
316   d = mpfr_get_decimal128 (x, MPFR_RNDU); /* should be 1E-6175 */
317   mpfr_set_ui (x, 0, MPFR_RNDZ);
318   mpfr_set_decimal128 (x, d, MPFR_RNDU);
319   mpfr_set_str (y, "1E-6175", 10, MPFR_RNDN);
320   if (! mpfr_equal_p (x, y))
321     PRINT_ERR_MISC ("9.9E-6176");
322 
323   /* largest number */
324   mpfr_set_str (x, "9.999999999999999999999999999999999E6144", 10, MPFR_RNDZ);
325   mpfr_set (y, x, MPFR_RNDZ);
326   d = mpfr_get_decimal128 (x, MPFR_RNDU);
327   if (d == DEC128_MAX)
328     {
329       mpfr_set_ui (x, 0, MPFR_RNDZ);
330       mpfr_set_decimal128 (x, d, MPFR_RNDZ);
331       if (! mpfr_equal_p (x, y))
332         PRINT_ERR_MISC ("DEC128_MAX");
333     }
334   else
335     {
336       printf ("Error in check_misc for DEC128_MAX.\n");
337       printf ("  mpfr_get_decimal128() returned: ");
338       print_decimal128 (d);
339       exit (1);
340     }
341 
342   mpfr_set_str (x, "-9.999999999999999999999999999999999E6144", 10, MPFR_RNDZ);
343   mpfr_set (y, x, MPFR_RNDZ);
344   d = mpfr_get_decimal128 (x, MPFR_RNDA);
345   if (d == -DEC128_MAX)
346     {
347       mpfr_set_ui (x, 0, MPFR_RNDZ);
348       mpfr_set_decimal128 (x, d, MPFR_RNDZ);
349       if (! mpfr_equal_p (x, y))
350         PRINT_ERR_MISC ("-DEC128_MAX");
351     }
352   else
353     {
354       printf ("Error in check_misc for -DEC128_MAX.\n");
355       printf ("  mpfr_get_decimal128() returned: ");
356       print_decimal128 (d);
357       exit (1);
358     }
359 
360   /* exercise |x| > DEC128_MAX */
361   mpfr_set_str (x, "10E6144", 10, MPFR_RNDU);
362   d = mpfr_get_decimal128 (x, MPFR_RNDZ);
363   MPFR_ASSERTN(d == DEC128_MAX);
364   mpfr_set_str (x, "-10E6144", 10, MPFR_RNDU);
365   d = mpfr_get_decimal128 (x, MPFR_RNDZ);
366   MPFR_ASSERTN(d == -DEC128_MAX);
367 
368   mpfr_set_prec (x, 53);
369   mpfr_set_prec (y, 53);
370 
371   /* largest number */
372   mpfr_set_str (x, "9.999999999999999999999999999999999E6144", 10, MPFR_RNDZ);
373   d = mpfr_get_decimal128 (x, MPFR_RNDZ);
374   mpfr_set_decimal128 (y, d, MPFR_RNDU);
375   if (! mpfr_equal_p (x, y))
376     PRINT_ERR_MISC ("DEC128_MAX (2)");
377 
378   /* since 1+ceil(109*log(2)/log(10)) = 34, the 109-bit value x, when
379      converted to a 34-digit decimal d, gives back x when converted back to
380      binary */
381   mpfr_set_prec (x, 109);
382   mpfr_set_prec (y, 109);
383   mpfr_set_str (x, "1E1793", 10, MPFR_RNDN);
384   d = mpfr_get_decimal128 (x, MPFR_RNDN);
385   mpfr_set_ui (x, 0, MPFR_RNDZ);
386   mpfr_set_decimal128 (x, d, MPFR_RNDN);
387   mpfr_set_str (y, "1E1793", 10, MPFR_RNDN);
388   if (! mpfr_equal_p (x, y))
389     PRINT_ERR_MISC ("1E1793");
390 
391   mpfr_set_str (x, "2E4095", 10, MPFR_RNDN);
392   d = mpfr_get_decimal128 (x, MPFR_RNDN);
393   mpfr_set_ui (x, 0, MPFR_RNDZ);
394   mpfr_set_decimal128 (x, d, MPFR_RNDN);
395   mpfr_set_str (y, "2E4095", 10, MPFR_RNDN);
396   if (! mpfr_equal_p (x, y))
397     PRINT_ERR_MISC ("2E4095");
398 
399   mpfr_set_str (x, "2E-4096", 10, MPFR_RNDN);
400   d = mpfr_get_decimal128 (x, MPFR_RNDN);
401   mpfr_set_ui (x, 0, MPFR_RNDZ);
402   mpfr_set_decimal128 (x, d, MPFR_RNDN);
403   mpfr_set_str (y, "2E-4096", 10, MPFR_RNDN);
404   if (! mpfr_equal_p (x, y))
405     PRINT_ERR_MISC ("2E-4096");
406 
407   mpfr_set_str (x, "2E-6110", 10, MPFR_RNDN);
408   d = mpfr_get_decimal128 (x, MPFR_RNDN);
409   mpfr_set_ui (x, 0, MPFR_RNDZ);
410   mpfr_set_decimal128 (x, d, MPFR_RNDN);
411   mpfr_set_str (y, "2E-6110", 10, MPFR_RNDN);
412   if (! mpfr_equal_p (x, y))
413     PRINT_ERR_MISC ("2E-6110");
414 
415   /* case where EXP(x) > 20414, thus outside the decimal128 range */
416   mpfr_set_ui_2exp (x, 1, 20414, MPFR_RNDN);
417   d = mpfr_get_decimal128 (x, MPFR_RNDZ);
418   MPFR_ASSERTN(d == DEC128_MAX);
419   d = mpfr_get_decimal128 (x, MPFR_RNDA);
420   MPFR_ASSERTN(d > DEC128_MAX); /* implies d = +Inf */
421   mpfr_set_si_2exp (x, -1, 20414, MPFR_RNDN);
422   d = mpfr_get_decimal128 (x, MPFR_RNDZ);
423   MPFR_ASSERTN(d == -DEC128_MAX);
424   d = mpfr_get_decimal128 (x, MPFR_RNDA);
425   MPFR_ASSERTN(d < -DEC128_MAX); /* implies d = -Inf */
426 
427   /* case where EXP(x) = 20414, at the limit of the decimal128 range */
428   mpfr_set_ui_2exp (x, 3, 20412, MPFR_RNDN); /* 3*2^20412 > 9.999...E6144 */
429   d = mpfr_get_decimal128 (x, MPFR_RNDN);
430   MPFR_ASSERTN(d > DEC128_MAX); /* implies d = +Inf */
431   mpfr_set_si_2exp (x, -3, 20412, MPFR_RNDN);
432   d = mpfr_get_decimal128 (x, MPFR_RNDN);
433   MPFR_ASSERTN(d < -DEC128_MAX); /* implies d = -Inf */
434 
435   {
436     unsigned long i;
437     for (i = 1; i < 1000; i++)
438       {
439         mpfr_set_ui_2exp (x, i, 20403, MPFR_RNDN);
440         d = mpfr_get_decimal128 (x, MPFR_RNDN);
441         mpfr_set_decimal128 (x, d, MPFR_RNDN);
442         MPFR_ASSERTN(mpfr_cmp_ui_2exp (x, i, 20403) == 0);
443       }
444   }
445 
446   mpfr_clear (x);
447   mpfr_clear (y);
448 }
449 
450 static void
noncanonical(void)451 noncanonical (void)
452 {
453   /* The code below assumes BID. */
454 #if HAVE_DECIMAL128_IEEE && defined(DECIMAL_BID_FORMAT)
455   union ieee_decimal128 x;
456 
457   MPFR_ASSERTN (sizeof (x) == 16);
458   /* produce a non-canonical decimal128 with Gh >= 24 */
459   x.d128 = 1;
460   /* if BID, we have sig=0, comb=49408, t0=t1=t2=0, t3=1 */
461   if (x.s.sig == 0 && x.s.comb == 49408 && x.s.t0 == 0 && x.s.t1 == 0 &&
462       x.s.t2 == 0 && x.s.t3 == 1)
463     {
464       /* The volatile below avoids _Decimal128 constant propagation, which is
465          buggy for non-canonical encoding in various GCC versions on the x86
466          and x86_64 targets: failure in the second test below ("Error 2")
467          with gcc (Debian 20190820-1) 10.0.0 20190820 (experimental)
468          [trunk revision 274744]. The MPFR test was not failing with previous
469          GCC versions, not even with gcc (Debian 20190719-1) 10.0.0 20190718
470          (experimental) [trunk revision 273586] (contrary to the similar test
471          in tget_set_d64.c). More information at:
472          https://gcc.gnu.org/bugzilla/show_bug.cgi?id=91226
473       */
474       volatile _Decimal128 d = 9999999999999999999999999999999999.dl;
475       mpfr_t y;
476 
477       x.s.comb = 98560; /* force Gh >= 24 thus a non-canonical number
478                            (significand >= 2^113 > 20^34-1) */
479       mpfr_init2 (y, 113);
480       mpfr_set_decimal128 (y, x.d128, MPFR_RNDN);
481       if (MPFR_NOTZERO (y) || MPFR_IS_NEG (y))
482         {
483           int i;
484           printf ("Error 1 in noncanonical on");
485           for (i = 0; i < 16; i++)
486             printf (" %02X", ((unsigned char *)&x)[i]);
487           printf ("\nExpected +0, got:\n");
488           mpfr_dump (y);
489           exit (1);
490         }
491 
492       /* now construct a case Gh < 24, but where the significand exceeds
493          10^34-1 */
494       x.d128 = d;
495       /* should give sig=0, comb=49415, t0=11529, t1=3199043520,
496          t2=932023907, t3=4294967295 */
497       x.s.t3 ++; /* should give 0 */
498       x.s.t2 += (x.s.t3 == 0);
499       /* now the significand is 10^34 */
500       mpfr_set_decimal128 (y, x.d128, MPFR_RNDN);
501       if (MPFR_NOTZERO (y) || MPFR_IS_NEG (y))
502         {
503           int i;
504           printf ("Error 2 in noncanonical on");
505           for (i = 0; i < 16; i++)
506             printf (" %02X", ((unsigned char *)&x)[i]);
507           printf ("\nExpected +0, got:\n");
508           mpfr_dump (y);
509           exit (1);
510         }
511 
512       mpfr_clear (y);
513     }
514   else
515     printf ("Warning! Unexpected value of x in noncanonical.\n");
516 #endif
517 }
518 
519 /* generate random sequences of 16 bytes and interpret them as _Decimal128 */
520 static void
check_random_bytes(void)521 check_random_bytes (void)
522 {
523   union {
524     _Decimal128 d;
525     unsigned char c[16];
526   } x;
527   int i;
528   mpfr_t y;
529   _Decimal128 e;
530 
531   mpfr_init2 (y, 114); /* 114 = 1 + ceil(34*log(10)/log(2)), thus ensures
532                          that if a decimal128 number is converted to a 114-bit
533                          value and back, we should get the same value */
534   for (i = 0; i < 100000; i++)
535     {
536       int j;
537       for (j = 0; j < 16; j++)
538         x.c[j] = randlimb () & 255;
539       mpfr_set_decimal128 (y, x.d, MPFR_RNDN);
540       e = mpfr_get_decimal128 (y, MPFR_RNDN);
541       if (!mpfr_nan_p (y))
542         if (x.d != e)
543           {
544             printf ("check_random_bytes failed\n");
545             printf ("x.d="); print_decimal128 (x.d);
546             printf ("y="); mpfr_dump (y);
547             printf ("e="); print_decimal128 (e);
548             exit (1);
549           }
550     }
551   mpfr_clear (y);
552 }
553 
554 int
main(int argc,char * argv[])555 main (int argc, char *argv[])
556 {
557   int verbose = argc > 1;
558 
559   tests_start_mpfr ();
560   mpfr_test_init ();
561 
562   if (verbose)
563     {
564 #ifdef DECIMAL_DPD_FORMAT
565       printf ("Using DPD encoding\n");
566 #endif
567 #ifdef DECIMAL_BID_FORMAT
568       printf ("Using BID encoding\n");
569 #endif
570     }
571 
572 #if !defined(MPFR_ERRDIVZERO)
573   check_random_bytes ();
574 #endif
575   test_set ();
576   powers_of_10 ();
577 #if !defined(MPFR_ERRDIVZERO)
578   check_misc ();
579 #endif
580   noncanonical ();
581 
582   tests_end_mpfr ();
583   return 0;
584 }
585 
586 #else /* MPFR_WANT_DECIMAL_FLOATS */
587 
588 int
main(void)589 main (void)
590 {
591   return 77;
592 }
593 
594 #endif /* MPFR_WANT_DECIMAL_FLOATS */
595