Home | History | Annotate | Line # | Download | only in tests
tsprintf.c revision 1.1.1.3
      1      1.1  mrg /* tsprintf.c -- test file for mpfr_sprintf, mpfr_vsprintf, mpfr_snprintf,
      2      1.1  mrg    and mpfr_vsnprintf
      3      1.1  mrg 
      4  1.1.1.3  mrg Copyright 2007-2016 Free Software Foundation, Inc.
      5  1.1.1.3  mrg Contributed by the AriC and Caramba projects, INRIA.
      6  1.1.1.2  mrg 
      7  1.1.1.2  mrg This file is part of the GNU MPFR Library.
      8      1.1  mrg 
      9      1.1  mrg The GNU MPFR Library is free software; you can redistribute it and/or modify
     10      1.1  mrg it under the terms of the GNU Lesser General Public License as published by
     11      1.1  mrg the Free Software Foundation; either version 3 of the License, or (at your
     12      1.1  mrg option) any later version.
     13      1.1  mrg 
     14      1.1  mrg The GNU MPFR Library is distributed in the hope that it will be useful, but
     15      1.1  mrg WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
     16      1.1  mrg or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public
     17      1.1  mrg License for more details.
     18      1.1  mrg 
     19      1.1  mrg You should have received a copy of the GNU Lesser General Public License
     20      1.1  mrg along with the GNU MPFR Library; see the file COPYING.LESSER.  If not, see
     21      1.1  mrg http://www.gnu.org/licenses/ or write to the Free Software Foundation, Inc.,
     22      1.1  mrg 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. */
     23      1.1  mrg 
     24      1.1  mrg #ifdef HAVE_STDARG
     25      1.1  mrg #include <stdarg.h>
     26      1.1  mrg 
     27      1.1  mrg #include <stdlib.h>
     28      1.1  mrg #include <float.h>
     29      1.1  mrg 
     30      1.1  mrg #ifdef HAVE_LOCALE_H
     31      1.1  mrg #include <locale.h>
     32      1.1  mrg #endif
     33      1.1  mrg 
     34      1.1  mrg #include "mpfr-test.h"
     35      1.1  mrg 
     36      1.1  mrg #if MPFR_VERSION >= MPFR_VERSION_NUM(2,4,0)
     37      1.1  mrg 
     38      1.1  mrg const int prec_max_printf = 5000; /* limit for random precision in
     39      1.1  mrg                                      random_double() */
     40      1.1  mrg #define BUF_SIZE 65536
     41      1.1  mrg 
     42      1.1  mrg const char pinf_str[] = "inf";
     43      1.1  mrg const char pinf_uc_str[] = "INF";
     44      1.1  mrg const char minf_str[] = "-inf";
     45      1.1  mrg const char minf_uc_str[] = "-INF";
     46      1.1  mrg const char nan_str[] = "nan";
     47      1.1  mrg const char nan_uc_str[] = "NAN";
     48      1.1  mrg 
     49      1.1  mrg /* 1. compare expected string with the string BUFFER returned by
     50      1.1  mrg    mpfr_sprintf(buffer, fmt, x)
     51      1.1  mrg    2. then test mpfr_snprintf (buffer, p, fmt, x) with a random p. */
     52      1.1  mrg static int
     53      1.1  mrg check_sprintf (const char *expected, const char *fmt, mpfr_srcptr x)
     54      1.1  mrg {
     55      1.1  mrg   int n0, n1, p;
     56      1.1  mrg   char buffer[BUF_SIZE];
     57      1.1  mrg 
     58      1.1  mrg   /* test mpfr_sprintf */
     59      1.1  mrg   n0 = mpfr_sprintf (buffer, fmt, x);
     60      1.1  mrg   if (strcmp (buffer, expected) != 0)
     61      1.1  mrg     {
     62      1.1  mrg       printf ("Error in mpfr_sprintf (s, \"%s\", x);\n", fmt);
     63      1.1  mrg       printf ("expected: \"%s\"\ngot:      \"%s\"\n", expected, buffer);
     64      1.1  mrg 
     65      1.1  mrg       exit (1);
     66      1.1  mrg     }
     67      1.1  mrg 
     68      1.1  mrg   /* test mpfr_snprintf */
     69      1.1  mrg   p = (int) (randlimb () % n0);
     70      1.1  mrg   if (p == 0 && (randlimb () & 1) == 0)
     71      1.1  mrg     {
     72      1.1  mrg       n1 = mpfr_snprintf (NULL, 0, fmt, x);
     73      1.1  mrg     }
     74      1.1  mrg   else
     75      1.1  mrg     {
     76      1.1  mrg       buffer[p] = 17;
     77      1.1  mrg       n1 = mpfr_snprintf (buffer, p, fmt, x);
     78      1.1  mrg       if (buffer[p] != 17)
     79      1.1  mrg         {
     80      1.1  mrg           printf ("Buffer overflow in mpfr_snprintf for p = %d!\n", p);
     81      1.1  mrg           exit (1);
     82      1.1  mrg         }
     83      1.1  mrg     }
     84      1.1  mrg   if (n0 != n1)
     85      1.1  mrg     {
     86      1.1  mrg       printf ("Error in mpfr_snprintf (s, %d, \"%s\", x) return value\n",
     87      1.1  mrg               p, fmt);
     88      1.1  mrg       printf ("expected: %d\ngot:      %d\n", n0, n1);
     89      1.1  mrg       exit (1);
     90      1.1  mrg     }
     91      1.1  mrg   if ((p > 1 && strncmp (expected, buffer, p-1) != 0)
     92      1.1  mrg       || (p == 1 && buffer[0] != '\0'))
     93      1.1  mrg     {
     94      1.1  mrg       char part_expected[BUF_SIZE];
     95      1.1  mrg       strncpy (part_expected, expected, p);
     96      1.1  mrg       part_expected[p-1] = '\0';
     97      1.1  mrg       printf ("Error in mpfr_vsnprintf (s, %d, \"%s\", ...);\n", p, fmt);
     98      1.1  mrg       printf ("expected: \"%s\"\ngot:      \"%s\"\n", part_expected, buffer);
     99      1.1  mrg       exit (1);
    100      1.1  mrg     }
    101      1.1  mrg   return n0;
    102      1.1  mrg }
    103      1.1  mrg 
    104      1.1  mrg /* 1. compare expected string with the string BUFFER returned by
    105      1.1  mrg    mpfr_vsprintf(buffer, fmt, ...)
    106      1.1  mrg    2. then, test mpfr_vsnprintf. */
    107      1.1  mrg static int
    108      1.1  mrg check_vsprintf (const char *expected, const char *fmt, ...)
    109      1.1  mrg {
    110      1.1  mrg   int n0, n1, p;
    111      1.1  mrg   char buffer[BUF_SIZE];
    112      1.1  mrg   va_list ap0, ap1;
    113      1.1  mrg   va_start (ap0, fmt);
    114      1.1  mrg   va_start (ap1, fmt);
    115      1.1  mrg 
    116      1.1  mrg   n0 = mpfr_vsprintf (buffer, fmt, ap0);
    117      1.1  mrg   if (strcmp (buffer, expected) != 0)
    118      1.1  mrg     {
    119      1.1  mrg       printf ("Error in mpfr_vsprintf (s, \"%s\", ...);\n", fmt);
    120      1.1  mrg       printf ("expected: \"%s\"\ngot:      \"%s\"\n", expected, buffer);
    121      1.1  mrg 
    122      1.1  mrg       va_end (ap0);
    123      1.1  mrg       va_end (ap1);
    124      1.1  mrg       exit (1);
    125      1.1  mrg     }
    126      1.1  mrg   va_end (ap0);
    127      1.1  mrg 
    128      1.1  mrg   /* test mpfr_snprintf */
    129      1.1  mrg   p = (int) (randlimb () % n0);
    130      1.1  mrg   if (p == 0 && (randlimb () & 1) == 0)
    131      1.1  mrg     {
    132      1.1  mrg       n1 = mpfr_vsnprintf (NULL, 0, fmt, ap1);
    133      1.1  mrg     }
    134      1.1  mrg   else
    135      1.1  mrg     {
    136      1.1  mrg       buffer[p] = 17;
    137      1.1  mrg       n1 = mpfr_vsnprintf (buffer, p, fmt, ap1);
    138      1.1  mrg       if (buffer[p] != 17)
    139      1.1  mrg         {
    140      1.1  mrg           printf ("Buffer overflow in mpfr_vsnprintf for p = %d!\n", p);
    141      1.1  mrg           exit (1);
    142      1.1  mrg         }
    143      1.1  mrg     }
    144      1.1  mrg   if (n0 != n1)
    145      1.1  mrg     {
    146      1.1  mrg       printf ("Error in mpfr_vsnprintf (s, %d, \"%s\", ...) return value\n",
    147      1.1  mrg               p, fmt);
    148      1.1  mrg       printf ("expected: %d\ngot:      %d\n", n0, n1);
    149      1.1  mrg 
    150      1.1  mrg       va_end (ap1);
    151      1.1  mrg       exit (1);
    152      1.1  mrg     }
    153      1.1  mrg   if ((p > 1 && strncmp (expected, buffer, p-1) != 0)
    154      1.1  mrg       || (p == 1 && buffer[0] != '\0'))
    155      1.1  mrg     {
    156      1.1  mrg       char part_expected[BUF_SIZE];
    157      1.1  mrg       strncpy (part_expected, expected, p);
    158      1.1  mrg       part_expected[p-1] = '\0';
    159      1.1  mrg       printf ("Error in mpfr_vsnprintf (s, %d, \"%s\", ...);\n", p, fmt);
    160      1.1  mrg       printf ("expected: \"%s\"\ngot:      \"%s\"\n", part_expected, buffer);
    161      1.1  mrg 
    162      1.1  mrg       va_end (ap1);
    163      1.1  mrg       exit (1);
    164      1.1  mrg     }
    165      1.1  mrg 
    166      1.1  mrg   va_end (ap1);
    167      1.1  mrg   return n0;
    168      1.1  mrg }
    169      1.1  mrg 
    170      1.1  mrg static void
    171      1.1  mrg native_types (void)
    172      1.1  mrg {
    173      1.1  mrg   int c = 'a';
    174      1.1  mrg   int i = -1;
    175      1.1  mrg   unsigned int ui = 1;
    176      1.1  mrg   double d = -1.25;
    177      1.1  mrg   char s[] = "test";
    178      1.1  mrg 
    179      1.1  mrg   char buf[255];
    180      1.1  mrg 
    181      1.1  mrg   sprintf (buf, "%c", c);
    182      1.1  mrg   check_vsprintf (buf, "%c", c);
    183      1.1  mrg 
    184      1.1  mrg   sprintf (buf, "%d", i);
    185      1.1  mrg   check_vsprintf (buf, "%d", i);
    186      1.1  mrg 
    187      1.1  mrg   sprintf (buf, "%e", d);
    188      1.1  mrg   check_vsprintf (buf, "%e", d);
    189      1.1  mrg 
    190      1.1  mrg   sprintf (buf, "%f", d);
    191      1.1  mrg   check_vsprintf (buf, "%f", d);
    192      1.1  mrg 
    193      1.1  mrg   sprintf (buf, "%i", i);
    194      1.1  mrg   check_vsprintf (buf, "%i", i);
    195      1.1  mrg 
    196      1.1  mrg   sprintf (buf, "%g", d);
    197      1.1  mrg   check_vsprintf (buf, "%g", d);
    198      1.1  mrg 
    199      1.1  mrg   sprintf (buf, "%o", i);
    200      1.1  mrg   check_vsprintf (buf, "%o", i);
    201      1.1  mrg 
    202      1.1  mrg   sprintf (buf, "%s", s);
    203      1.1  mrg   check_vsprintf (buf, "%s", s);
    204      1.1  mrg 
    205      1.1  mrg   sprintf (buf, "--%s++", "");
    206      1.1  mrg   check_vsprintf (buf, "--%s++", "");
    207      1.1  mrg 
    208      1.1  mrg   sprintf (buf, "%u", ui);
    209      1.1  mrg   check_vsprintf (buf, "%u", ui);
    210      1.1  mrg 
    211      1.1  mrg   sprintf (buf, "%x", ui);
    212      1.1  mrg   check_vsprintf (buf, "%x", ui);
    213      1.1  mrg }
    214      1.1  mrg 
    215      1.1  mrg static int
    216      1.1  mrg decimal (void)
    217      1.1  mrg {
    218      1.1  mrg   mpfr_prec_t p = 128;
    219      1.1  mrg   mpfr_t x;
    220      1.1  mrg   mpfr_t z;
    221      1.1  mrg   mpfr_init (z);
    222      1.1  mrg   mpfr_init2 (x, p);
    223      1.1  mrg 
    224      1.1  mrg   /* specifier 'P' for precision */
    225      1.1  mrg   check_vsprintf ("128", "%Pu", p);
    226      1.1  mrg   check_vsprintf ("00128", "%.5Pu", p);
    227      1.1  mrg 
    228      1.1  mrg   /* special numbers */
    229      1.1  mrg   mpfr_set_inf (x, 1);
    230      1.1  mrg   check_sprintf (pinf_str, "%Re", x);
    231      1.1  mrg   check_sprintf (pinf_str, "%RUe", x);
    232      1.1  mrg   check_sprintf (pinf_uc_str, "%RE", x);
    233      1.1  mrg   check_sprintf (pinf_uc_str, "%RDE", x);
    234      1.1  mrg   check_sprintf (pinf_str, "%Rf", x);
    235      1.1  mrg   check_sprintf (pinf_str, "%RYf", x);
    236      1.1  mrg   check_sprintf (pinf_uc_str, "%RF", x);
    237      1.1  mrg   check_sprintf (pinf_uc_str, "%RZF", x);
    238      1.1  mrg   check_sprintf (pinf_str, "%Rg", x);
    239      1.1  mrg   check_sprintf (pinf_str, "%RNg", x);
    240      1.1  mrg   check_sprintf (pinf_uc_str, "%RG", x);
    241      1.1  mrg   check_sprintf (pinf_uc_str, "%RUG", x);
    242      1.1  mrg   check_sprintf ("       inf", "%010Re", x);
    243      1.1  mrg   check_sprintf ("       inf", "%010RDe", x);
    244      1.1  mrg 
    245      1.1  mrg   mpfr_set_inf (x, -1);
    246      1.1  mrg   check_sprintf (minf_str, "%Re", x);
    247      1.1  mrg   check_sprintf (minf_str, "%RYe", x);
    248      1.1  mrg   check_sprintf (minf_uc_str, "%RE", x);
    249      1.1  mrg   check_sprintf (minf_uc_str, "%RZE", x);
    250      1.1  mrg   check_sprintf (minf_str, "%Rf", x);
    251      1.1  mrg   check_sprintf (minf_str, "%RNf", x);
    252      1.1  mrg   check_sprintf (minf_uc_str, "%RF", x);
    253      1.1  mrg   check_sprintf (minf_uc_str, "%RUF", x);
    254      1.1  mrg   check_sprintf (minf_str, "%Rg", x);
    255      1.1  mrg   check_sprintf (minf_str, "%RDg", x);
    256      1.1  mrg   check_sprintf (minf_uc_str, "%RG", x);
    257      1.1  mrg   check_sprintf (minf_uc_str, "%RYG", x);
    258      1.1  mrg   check_sprintf ("      -inf", "%010Re", x);
    259      1.1  mrg   check_sprintf ("      -inf", "%010RZe", x);
    260      1.1  mrg 
    261      1.1  mrg   mpfr_set_nan (x);
    262      1.1  mrg   check_sprintf (nan_str, "%Re", x);
    263      1.1  mrg   check_sprintf (nan_str, "%RNe", x);
    264      1.1  mrg   check_sprintf (nan_uc_str, "%RE", x);
    265      1.1  mrg   check_sprintf (nan_uc_str, "%RUE", x);
    266      1.1  mrg   check_sprintf (nan_str, "%Rf", x);
    267      1.1  mrg   check_sprintf (nan_str, "%RDf", x);
    268      1.1  mrg   check_sprintf (nan_uc_str, "%RF", x);
    269      1.1  mrg   check_sprintf (nan_uc_str, "%RYF", x);
    270      1.1  mrg   check_sprintf (nan_str, "%Rg", x);
    271      1.1  mrg   check_sprintf (nan_str, "%RZg", x);
    272      1.1  mrg   check_sprintf (nan_uc_str, "%RG", x);
    273      1.1  mrg   check_sprintf (nan_uc_str, "%RNG", x);
    274      1.1  mrg   check_sprintf ("       nan", "%010Re", x);
    275      1.1  mrg 
    276      1.1  mrg   /* positive numbers */
    277      1.1  mrg   mpfr_set_str (x, "18993474.61279296875", 10, MPFR_RNDN);
    278      1.1  mrg   mpfr_set_ui (z, 0, MPFR_RNDD);
    279      1.1  mrg 
    280      1.1  mrg   /* simplest case right justified */
    281      1.1  mrg   check_sprintf ("      1.899347461279296875e+07", "%30Re", x);
    282      1.1  mrg   check_sprintf ("                         2e+07", "%30.0Re", x);
    283      1.1  mrg   check_sprintf ("               18993474.612793", "%30Rf", x);
    284      1.1  mrg   check_sprintf ("              18993474.6127930", "%30.7Rf", x);
    285      1.1  mrg   check_sprintf ("                   1.89935e+07", "%30Rg", x);
    286      1.1  mrg   check_sprintf ("                         2e+07", "%30.0Rg", x);
    287      1.1  mrg   check_sprintf ("          18993474.61279296875", "%30.19Rg", x);
    288      1.1  mrg   check_sprintf ("                         0e+00", "%30.0Re", z);
    289      1.1  mrg   check_sprintf ("                             0", "%30.0Rf", z);
    290      1.1  mrg   check_sprintf ("                        0.0000", "%30.4Rf", z);
    291      1.1  mrg   check_sprintf ("                             0", "%30.0Rg", z);
    292      1.1  mrg   check_sprintf ("                             0", "%30.4Rg", z);
    293      1.1  mrg   /* sign or space, pad with leading zeros */
    294      1.1  mrg   check_sprintf (" 000001.899347461279296875E+07", "% 030RE", x);
    295      1.1  mrg   check_sprintf (" 0000000000000000001.89935E+07", "% 030RG", x);
    296      1.1  mrg   check_sprintf (" 0000000000000000000000002E+07", "% 030.0RE", x);
    297      1.1  mrg   check_sprintf (" 0000000000000000000000000E+00", "% 030.0RE", z);
    298      1.1  mrg   check_sprintf (" 00000000000000000000000000000", "% 030.0RF", z);
    299      1.1  mrg   /* sign + or -, left justified */
    300      1.1  mrg   check_sprintf ("+1.899347461279296875e+07     ", "%+-30Re", x);
    301      1.1  mrg   check_sprintf ("+2e+07                        ", "%+-30.0Re", x);
    302      1.1  mrg   check_sprintf ("+0e+00                        ", "%+-30.0Re", z);
    303      1.1  mrg   check_sprintf ("+0                            ", "%+-30.0Rf", z);
    304      1.1  mrg   /* decimal point, left justified, precision and rounding parameter */
    305      1.1  mrg   check_vsprintf ("1.9E+07   ", "%#-10.*R*E", 1, MPFR_RNDN, x);
    306      1.1  mrg   check_vsprintf ("2.E+07    ", "%#*.*R*E", -10, 0, MPFR_RNDN, x);
    307      1.1  mrg   check_vsprintf ("2.E+07    ", "%#-10.*R*G", 0, MPFR_RNDN, x);
    308      1.1  mrg   check_vsprintf ("0.E+00    ", "%#-10.*R*E", 0, MPFR_RNDN, z);
    309      1.1  mrg   check_vsprintf ("0.        ", "%#-10.*R*F", 0, MPFR_RNDN, z);
    310      1.1  mrg   check_vsprintf ("0.        ", "%#-10.*R*G", 0, MPFR_RNDN, z);
    311      1.1  mrg   /* sign or space */
    312      1.1  mrg   check_sprintf (" 1.899e+07", "% .3RNe", x);
    313      1.1  mrg   check_sprintf (" 2e+07",     "% .0RNe", x);
    314      1.1  mrg   /* sign + or -, decimal point, pad with leading zeros */
    315      1.1  mrg   check_sprintf ("+0001.8E+07", "%0+#11.1RZE", x);
    316      1.1  mrg   check_sprintf ("+00001.E+07", "%0+#11.0RZE", x);
    317      1.1  mrg   check_sprintf ("+0000.0E+00", "%0+#11.1RZE", z);
    318      1.1  mrg   check_sprintf ("+00000000.0", "%0+#11.1RZF", z);
    319      1.1  mrg   /* pad with leading zero */
    320      1.1  mrg   check_sprintf ("0000001.899347461279296875e+07", "%030RDe", x);
    321      1.1  mrg   check_sprintf ("00000000000000000000000001e+07", "%030.0RDe", x);
    322      1.1  mrg   /* sign or space, decimal point, left justified */
    323      1.1  mrg   check_sprintf (" 1.8E+07   ", "%- #11.1RDE", x);
    324      1.1  mrg   check_sprintf (" 1.E+07    ", "%- #11.0RDE", x);
    325      1.1  mrg 
    326      1.1  mrg   /* negative numbers */
    327      1.1  mrg   mpfr_mul_si (x, x, -1, MPFR_RNDD);
    328      1.1  mrg   mpfr_mul_si (z, z, -1, MPFR_RNDD);
    329      1.1  mrg 
    330      1.1  mrg   /* sign + or - */
    331      1.1  mrg   check_sprintf ("  -1.8e+07", "%+10.1RUe", x);
    332      1.1  mrg   check_sprintf ("    -1e+07", "%+10.0RUe", x);
    333      1.1  mrg   check_sprintf ("    -0e+00", "%+10.0RUe", z);
    334      1.1  mrg   check_sprintf ("        -0", "%+10.0RUf", z);
    335      1.1  mrg 
    336      1.1  mrg 
    337      1.1  mrg   /* neighborhood of 1 */
    338      1.1  mrg   mpfr_set_str (x, "0.99993896484375", 10, MPFR_RNDN);
    339      1.1  mrg   check_sprintf ("9.9993896484375E-01 ", "%-20RE", x);
    340      1.1  mrg   check_sprintf ("9.9993896484375E-01 ", "%-20.RE", x);
    341      1.1  mrg   check_sprintf ("1E+00               ", "%-20.0RE", x);
    342      1.1  mrg   check_sprintf ("1.0E+00             ", "%-20.1RE", x);
    343      1.1  mrg   check_sprintf ("1.00E+00            ", "%-20.2RE", x);
    344      1.1  mrg   check_sprintf ("9.999E-01           ", "%-20.3RE", x);
    345      1.1  mrg   check_sprintf ("9.9994E-01          ", "%-20.4RE", x);
    346      1.1  mrg   check_sprintf ("0.999939            ", "%-20RF", x);
    347      1.1  mrg   check_sprintf ("0.999939            ", "%-20.RF", x);
    348      1.1  mrg   check_sprintf ("1                   ", "%-20.0RF", x);
    349      1.1  mrg   check_sprintf ("1.0                 ", "%-20.1RF", x);
    350      1.1  mrg   check_sprintf ("1.00                ", "%-20.2RF", x);
    351      1.1  mrg   check_sprintf ("1.000               ", "%-20.3RF", x);
    352      1.1  mrg   check_sprintf ("0.9999              ", "%-20.4RF", x);
    353      1.1  mrg   check_sprintf ("0.999939            ", "%-#20RF", x);
    354      1.1  mrg   check_sprintf ("0.999939            ", "%-#20.RF", x);
    355      1.1  mrg   check_sprintf ("1.                  ", "%-#20.0RF", x);
    356      1.1  mrg   check_sprintf ("1.0                 ", "%-#20.1RF", x);
    357      1.1  mrg   check_sprintf ("1.00                ", "%-#20.2RF", x);
    358      1.1  mrg   check_sprintf ("1.000               ", "%-#20.3RF", x);
    359      1.1  mrg   check_sprintf ("0.9999              ", "%-#20.4RF", x);
    360      1.1  mrg   check_sprintf ("1                   ", "%-20.0RG", x);
    361      1.1  mrg   check_sprintf ("1                   ", "%-20.1RG", x);
    362      1.1  mrg   check_sprintf ("1                   ", "%-20.2RG", x);
    363      1.1  mrg   check_sprintf ("1                   ", "%-20.3RG", x);
    364      1.1  mrg   check_sprintf ("0.9999              ", "%-20.4RG", x);
    365      1.1  mrg   check_sprintf ("0.999939            ", "%-#20RG", x);
    366      1.1  mrg   check_sprintf ("0.999939            ", "%-#20.RG", x);
    367      1.1  mrg   check_sprintf ("1.                  ", "%-#20.0RG", x);
    368      1.1  mrg   check_sprintf ("1.                  ", "%-#20.1RG", x);
    369      1.1  mrg   check_sprintf ("1.0                 ", "%-#20.2RG", x);
    370      1.1  mrg   check_sprintf ("1.00                ", "%-#20.3RG", x);
    371      1.1  mrg   check_sprintf ("0.9999              ", "%-#20.4RG", x);
    372      1.1  mrg 
    373      1.1  mrg   /* multiple of 10 */
    374      1.1  mrg   mpfr_set_str (x, "1e17", 10, MPFR_RNDN);
    375      1.1  mrg   check_sprintf ("1e+17", "%Re", x);
    376      1.1  mrg   check_sprintf ("1.000e+17", "%.3Re", x);
    377      1.1  mrg   check_sprintf ("100000000000000000", "%.0Rf", x);
    378      1.1  mrg   check_sprintf ("100000000000000000.0", "%.1Rf", x);
    379      1.1  mrg   check_sprintf ("100000000000000000.000000", "%'Rf", x);
    380      1.1  mrg   check_sprintf ("100000000000000000.0", "%'.1Rf", x);
    381      1.1  mrg 
    382      1.1  mrg   mpfr_ui_div (x, 1, x, MPFR_RNDN); /* x=1e-17 */
    383      1.1  mrg   check_sprintf ("1e-17", "%Re", x);
    384      1.1  mrg   check_sprintf ("0.000000", "%Rf", x);
    385      1.1  mrg   check_sprintf ("1e-17", "%Rg", x);
    386      1.1  mrg   check_sprintf ("0.0", "%.1RDf", x);
    387      1.1  mrg   check_sprintf ("0.0", "%.1RZf", x);
    388      1.1  mrg   check_sprintf ("0.1", "%.1RUf", x);
    389      1.1  mrg   check_sprintf ("0.1", "%.1RYf", x);
    390      1.1  mrg   check_sprintf ("0", "%.0RDf", x);
    391      1.1  mrg   check_sprintf ("0", "%.0RZf", x);
    392      1.1  mrg   check_sprintf ("1", "%.0RUf", x);
    393      1.1  mrg   check_sprintf ("1", "%.0RYf", x);
    394      1.1  mrg 
    395  1.1.1.2  mrg   /* multiple of 10 with 'g' style */
    396  1.1.1.2  mrg   mpfr_set_str (x, "10", 10, MPFR_RNDN);
    397  1.1.1.2  mrg   check_sprintf ("10", "%Rg", x);
    398  1.1.1.2  mrg   check_sprintf ("1e+01", "%.0Rg", x);
    399  1.1.1.2  mrg   check_sprintf ("1e+01", "%.1Rg", x);
    400  1.1.1.2  mrg   check_sprintf ("10", "%.2Rg", x);
    401  1.1.1.2  mrg 
    402  1.1.1.2  mrg   mpfr_ui_div (x, 1, x, MPFR_RNDN);
    403  1.1.1.2  mrg   check_sprintf ("0.1", "%Rg", x);
    404  1.1.1.2  mrg   check_sprintf ("0.1", "%.0Rg", x);
    405  1.1.1.2  mrg   check_sprintf ("0.1", "%.1Rg", x);
    406  1.1.1.2  mrg 
    407  1.1.1.2  mrg   mpfr_set_str (x, "1000", 10, MPFR_RNDN);
    408  1.1.1.2  mrg   check_sprintf ("1000", "%Rg", x);
    409  1.1.1.2  mrg   check_sprintf ("1e+03", "%.0Rg", x);
    410  1.1.1.2  mrg   check_sprintf ("1e+03", "%.3Rg", x);
    411  1.1.1.2  mrg   check_sprintf ("1000", "%.4Rg", x);
    412  1.1.1.2  mrg 
    413  1.1.1.2  mrg   mpfr_ui_div (x, 1, x, MPFR_RNDN);
    414  1.1.1.2  mrg   check_sprintf ("0.001", "%Rg", x);
    415  1.1.1.2  mrg   check_sprintf ("0.001", "%.0Rg", x);
    416  1.1.1.2  mrg   check_sprintf ("0.001", "%.1Rg", x);
    417  1.1.1.2  mrg 
    418  1.1.1.2  mrg   mpfr_set_str (x, "100000", 10, MPFR_RNDN);
    419  1.1.1.2  mrg   check_sprintf ("100000", "%Rg", x);
    420  1.1.1.2  mrg   check_sprintf ("1e+05", "%.0Rg", x);
    421  1.1.1.2  mrg   check_sprintf ("1e+05", "%.5Rg", x);
    422  1.1.1.2  mrg   check_sprintf ("100000", "%.6Rg", x);
    423  1.1.1.2  mrg 
    424  1.1.1.2  mrg   mpfr_ui_div (x, 1, x, MPFR_RNDN);
    425  1.1.1.2  mrg   check_sprintf ("1e-05", "%Rg", x);
    426  1.1.1.2  mrg   check_sprintf ("1e-05", "%.0Rg", x);
    427  1.1.1.2  mrg   check_sprintf ("1e-05", "%.1Rg", x);
    428  1.1.1.2  mrg 
    429      1.1  mrg   /* check rounding mode */
    430      1.1  mrg   mpfr_set_str (x, "0.0076", 10, MPFR_RNDN);
    431      1.1  mrg   check_sprintf ("0.007", "%.3RDF", x);
    432      1.1  mrg   check_sprintf ("0.007", "%.3RZF", x);
    433      1.1  mrg   check_sprintf ("0.008", "%.3RF", x);
    434      1.1  mrg   check_sprintf ("0.008", "%.3RUF", x);
    435      1.1  mrg   check_sprintf ("0.008", "%.3RYF", x);
    436      1.1  mrg   check_vsprintf ("0.008", "%.3R*F", MPFR_RNDA, x);
    437      1.1  mrg 
    438      1.1  mrg   /* check limit between %f-style and %g-style */
    439      1.1  mrg   mpfr_set_str (x, "0.0000999", 10, MPFR_RNDN);
    440      1.1  mrg   check_sprintf ("0.0001",   "%.0Rg", x);
    441      1.1  mrg   check_sprintf ("9e-05",    "%.0RDg", x);
    442      1.1  mrg   check_sprintf ("0.0001",   "%.1Rg", x);
    443      1.1  mrg   check_sprintf ("0.0001",   "%.2Rg", x);
    444      1.1  mrg   check_sprintf ("9.99e-05", "%.3Rg", x);
    445      1.1  mrg 
    446      1.1  mrg   /* trailing zeros */
    447      1.1  mrg   mpfr_set_si_2exp (x, -1, -15, MPFR_RNDN); /* x=-2^-15 */
    448      1.1  mrg   check_sprintf ("-3.0517578125e-05", "%.30Rg", x);
    449      1.1  mrg   check_sprintf ("-3.051757812500000000000000000000e-05", "%.30Re", x);
    450      1.1  mrg   check_sprintf ("-3.05175781250000000000000000000e-05", "%#.30Rg", x);
    451      1.1  mrg   check_sprintf ("-0.000030517578125000000000000000", "%.30Rf", x);
    452      1.1  mrg 
    453      1.1  mrg   /* bug 20081023 */
    454      1.1  mrg   check_sprintf ("-3.0517578125e-05", "%.30Rg", x);
    455      1.1  mrg   mpfr_set_str (x, "1.9999", 10, MPFR_RNDN);
    456      1.1  mrg   check_sprintf ("1.999900  ", "%-#10.7RG", x);
    457      1.1  mrg   check_sprintf ("1.9999    ", "%-10.7RG", x);
    458      1.1  mrg   mpfr_set_ui (x, 1, MPFR_RNDN);
    459  1.1.1.3  mrg   check_sprintf ("1.", "%#.1Rg", x);
    460  1.1.1.3  mrg   check_sprintf ("1.   ", "%-#5.1Rg", x);
    461  1.1.1.3  mrg   check_sprintf ("  1.0", "%#5.2Rg", x);
    462      1.1  mrg   check_sprintf ("1.00000000000000000000000000000", "%#.30Rg", x);
    463      1.1  mrg   check_sprintf ("1", "%.30Rg", x);
    464      1.1  mrg   mpfr_set_ui (x, 0, MPFR_RNDN);
    465  1.1.1.3  mrg   check_sprintf ("0.", "%#.1Rg", x);
    466  1.1.1.3  mrg   check_sprintf ("0.   ", "%-#5.1Rg", x);
    467  1.1.1.3  mrg   check_sprintf ("  0.0", "%#5.2Rg", x);
    468  1.1.1.3  mrg   check_sprintf ("0.00000000000000000000000000000", "%#.30Rg", x);
    469      1.1  mrg   check_sprintf ("0", "%.30Rg", x);
    470      1.1  mrg 
    471      1.1  mrg   /* following tests with precision 53 bits */
    472      1.1  mrg   mpfr_set_prec (x, 53);
    473      1.1  mrg 
    474      1.1  mrg   /* Exponent zero has a plus sign */
    475      1.1  mrg   mpfr_set_str (x, "-9.95645044213728791504536275169812142849e-01", 10,
    476      1.1  mrg                 MPFR_RNDN);
    477      1.1  mrg   check_sprintf ("-1.0e+00", "%- #0.1Re", x);
    478      1.1  mrg 
    479      1.1  mrg   /* Decimal point and no figure after it with '#' flag and 'G' style */
    480      1.1  mrg   mpfr_set_str (x, "-9.90597761233942053494e-01", 10, MPFR_RNDN);
    481      1.1  mrg   check_sprintf ("-1.", "%- #0.1RG", x);
    482      1.1  mrg 
    483      1.1  mrg   /* precision zero */
    484  1.1.1.2  mrg   mpfr_set_d (x, 9.5, MPFR_RNDN);
    485  1.1.1.2  mrg   check_sprintf ("9",    "%.0RDf", x);
    486  1.1.1.2  mrg   check_sprintf ("10",    "%.0RUf", x);
    487  1.1.1.2  mrg 
    488  1.1.1.2  mrg   mpfr_set_d (x, 19.5, MPFR_RNDN);
    489  1.1.1.2  mrg   check_sprintf ("19",    "%.0RDf", x);
    490  1.1.1.2  mrg   check_sprintf ("20",    "%.0RUf", x);
    491  1.1.1.2  mrg 
    492  1.1.1.2  mrg   mpfr_set_d (x, 99.5, MPFR_RNDN);
    493  1.1.1.2  mrg   check_sprintf ("99",    "%.0RDf", x);
    494  1.1.1.2  mrg   check_sprintf ("100",   "%.0RUf", x);
    495  1.1.1.2  mrg 
    496      1.1  mrg   mpfr_set_d (x, -9.5, MPFR_RNDN);
    497      1.1  mrg   check_sprintf ("-10",    "%.0RDf", x);
    498      1.1  mrg   check_sprintf ("-10",    "%.0RYf", x);
    499      1.1  mrg   check_sprintf ("-10",    "%.0Rf", x);
    500      1.1  mrg   check_sprintf ("-1e+01", "%.0Re", x);
    501      1.1  mrg   check_sprintf ("-1e+01", "%.0Rg", x);
    502      1.1  mrg   mpfr_set_ui_2exp (x, 1, -1, MPFR_RNDN);
    503      1.1  mrg   check_sprintf ("0",      "%.0Rf", x);
    504      1.1  mrg   check_sprintf ("5e-01",  "%.0Re", x);
    505      1.1  mrg   check_sprintf ("0.5",    "%.0Rg", x);
    506      1.1  mrg   mpfr_set_ui_2exp (x, 3, -1, MPFR_RNDN);
    507      1.1  mrg   check_sprintf ("2",      "%.0Rf", x);
    508      1.1  mrg   mpfr_set_ui_2exp (x, 5, -1, MPFR_RNDN);
    509      1.1  mrg   check_sprintf ("2",      "%.0Rf", x);
    510      1.1  mrg   mpfr_set_ui (x, 0x1f, MPFR_RNDN);
    511      1.1  mrg   check_sprintf ("0x1p+5", "%.0Ra", x);
    512      1.1  mrg   mpfr_set_ui (x, 3, MPFR_RNDN);
    513      1.1  mrg   check_sprintf ("1p+2",   "%.0Rb", x);
    514      1.1  mrg 
    515      1.1  mrg   /* round to next ten power with %f but not with %g */
    516      1.1  mrg   mpfr_set_str (x, "-6.64464380544039223686e-02", 10, MPFR_RNDN);
    517      1.1  mrg   check_sprintf ("-0.1",  "%.1Rf", x);
    518      1.1  mrg   check_sprintf ("-0.0",  "%.1RZf", x);
    519      1.1  mrg   check_sprintf ("-0.07", "%.1Rg", x);
    520      1.1  mrg   check_sprintf ("-0.06", "%.1RZg", x);
    521      1.1  mrg 
    522      1.1  mrg   /* round to next ten power and do not remove trailing zeros */
    523      1.1  mrg   mpfr_set_str (x, "9.98429393291486722006e-02", 10, MPFR_RNDN);
    524      1.1  mrg   check_sprintf ("0.1",   "%#.1Rg", x);
    525      1.1  mrg   check_sprintf ("0.10",  "%#.2Rg", x);
    526      1.1  mrg   check_sprintf ("0.099", "%#.2RZg", x);
    527      1.1  mrg 
    528      1.1  mrg   /* Halfway cases */
    529      1.1  mrg   mpfr_set_str (x, "1.5", 10, MPFR_RNDN);
    530      1.1  mrg   check_sprintf ("2e+00", "%.0Re", x);
    531      1.1  mrg   mpfr_set_str (x, "2.5", 10, MPFR_RNDN);
    532      1.1  mrg   check_sprintf ("2e+00", "%.0Re", x);
    533      1.1  mrg   mpfr_set_str (x, "9.5", 10, MPFR_RNDN);
    534      1.1  mrg   check_sprintf ("1e+01", "%.0Re", x);
    535      1.1  mrg   mpfr_set_str (x, "1.25", 10, MPFR_RNDN);
    536      1.1  mrg   check_sprintf ("1.2e+00", "%.1Re", x);
    537      1.1  mrg   mpfr_set_str (x, "1.75", 10, MPFR_RNDN);
    538      1.1  mrg   check_sprintf ("1.8e+00", "%.1Re", x);
    539      1.1  mrg   mpfr_set_str (x, "-0.5", 10, MPFR_RNDN);
    540      1.1  mrg   check_sprintf ("-0", "%.0Rf", x);
    541      1.1  mrg   mpfr_set_str (x, "1.25", 10, MPFR_RNDN);
    542      1.1  mrg   check_sprintf ("1.2", "%.1Rf", x);
    543      1.1  mrg   mpfr_set_str (x, "1.75", 10, MPFR_RNDN);
    544      1.1  mrg   check_sprintf ("1.8", "%.1Rf", x);
    545      1.1  mrg   mpfr_set_str (x, "1.5", 10, MPFR_RNDN);
    546      1.1  mrg   check_sprintf ("2", "%.1Rg", x);
    547      1.1  mrg   mpfr_set_str (x, "2.5", 10, MPFR_RNDN);
    548      1.1  mrg   check_sprintf ("2", "%.1Rg", x);
    549      1.1  mrg   mpfr_set_str (x, "9.25", 10, MPFR_RNDN);
    550      1.1  mrg   check_sprintf ("9.2", "%.2Rg", x);
    551      1.1  mrg   mpfr_set_str (x, "9.75", 10, MPFR_RNDN);
    552      1.1  mrg   check_sprintf ("9.8", "%.2Rg", x);
    553      1.1  mrg 
    554      1.1  mrg   /* assertion failure in r6320 */
    555      1.1  mrg   mpfr_set_str (x, "-9.996", 10, MPFR_RNDN);
    556      1.1  mrg   check_sprintf ("-10.0", "%.1Rf", x);
    557      1.1  mrg 
    558      1.1  mrg   mpfr_clears (x, z, (mpfr_ptr) 0);
    559      1.1  mrg   return 0;
    560      1.1  mrg }
    561      1.1  mrg 
    562      1.1  mrg static int
    563      1.1  mrg hexadecimal (void)
    564      1.1  mrg {
    565      1.1  mrg   mpfr_t x, z;
    566      1.1  mrg   mpfr_inits2 (64, x, z, (mpfr_ptr) 0);
    567      1.1  mrg 
    568      1.1  mrg   /* special */
    569      1.1  mrg   mpfr_set_inf (x, 1);
    570      1.1  mrg   check_sprintf (pinf_str, "%Ra", x);
    571      1.1  mrg   check_sprintf (pinf_str, "%RUa", x);
    572      1.1  mrg   check_sprintf (pinf_str, "%RDa", x);
    573      1.1  mrg   check_sprintf (pinf_uc_str, "%RA", x);
    574      1.1  mrg   check_sprintf (pinf_uc_str, "%RYA", x);
    575      1.1  mrg   check_sprintf (pinf_uc_str, "%RZA", x);
    576      1.1  mrg   check_sprintf (pinf_uc_str, "%RNA", x);
    577      1.1  mrg 
    578      1.1  mrg   mpfr_set_inf (x, -1);
    579      1.1  mrg   check_sprintf (minf_str, "%Ra", x);
    580      1.1  mrg   check_sprintf (minf_str, "%RYa", x);
    581      1.1  mrg   check_sprintf (minf_str, "%RZa", x);
    582      1.1  mrg   check_sprintf (minf_str, "%RNa", x);
    583      1.1  mrg   check_sprintf (minf_uc_str, "%RA", x);
    584      1.1  mrg   check_sprintf (minf_uc_str, "%RUA", x);
    585      1.1  mrg   check_sprintf (minf_uc_str, "%RDA", x);
    586      1.1  mrg 
    587      1.1  mrg   mpfr_set_nan (x);
    588      1.1  mrg   check_sprintf (nan_str, "%Ra", x);
    589      1.1  mrg   check_sprintf (nan_uc_str, "%RA", x);
    590      1.1  mrg 
    591      1.1  mrg   /* regular numbers */
    592      1.1  mrg   mpfr_set_str (x, "FEDCBA9.87654321", 16, MPFR_RNDN);
    593      1.1  mrg   mpfr_set_ui (z, 0, MPFR_RNDZ);
    594      1.1  mrg 
    595      1.1  mrg   /* simplest case right justified */
    596      1.1  mrg   check_sprintf ("   0xf.edcba987654321p+24", "%25Ra", x);
    597      1.1  mrg   check_sprintf ("   0xf.edcba987654321p+24", "%25RUa", x);
    598      1.1  mrg   check_sprintf ("   0xf.edcba987654321p+24", "%25RDa", x);
    599      1.1  mrg   check_sprintf ("   0xf.edcba987654321p+24", "%25RYa", x);
    600      1.1  mrg   check_sprintf ("   0xf.edcba987654321p+24", "%25RZa", x);
    601      1.1  mrg   check_sprintf ("   0xf.edcba987654321p+24", "%25RNa", x);
    602      1.1  mrg   check_sprintf ("                  0x1p+28", "%25.0Ra", x);
    603      1.1  mrg   check_sprintf ("                   0x0p+0", "%25.0Ra", z);
    604      1.1  mrg   /* sign or space, pad with leading zeros */
    605      1.1  mrg   check_sprintf (" 0X00F.EDCBA987654321P+24", "% 025RA", x);
    606      1.1  mrg   check_sprintf (" 0X000000000000000001P+28", "% 025.0RA", x);
    607      1.1  mrg   check_sprintf (" 0X0000000000000000000P+0", "% 025.0RA", z);
    608      1.1  mrg   /* sign + or -, left justified */
    609      1.1  mrg   check_sprintf ("+0xf.edcba987654321p+24  ", "%+-25Ra", x);
    610      1.1  mrg   check_sprintf ("+0x1p+28                 ", "%+-25.0Ra", x);
    611      1.1  mrg   check_sprintf ("+0x0p+0                  ", "%+-25.0Ra", z);
    612      1.1  mrg   /* decimal point, left justified, precision and rounding parameter */
    613      1.1  mrg   check_vsprintf ("0XF.FP+24 ", "%#-10.*R*A", 1, MPFR_RNDN, x);
    614      1.1  mrg   check_vsprintf ("0X1.P+28  ", "%#-10.*R*A", 0, MPFR_RNDN, x);
    615      1.1  mrg   check_vsprintf ("0X0.P+0   ", "%#-10.*R*A", 0, MPFR_RNDN, z);
    616      1.1  mrg   /* sign or space */
    617      1.1  mrg   check_sprintf (" 0xf.eddp+24", "% .3RNa", x);
    618      1.1  mrg   check_sprintf (" 0x1p+28",     "% .0RNa", x);
    619      1.1  mrg   /* sign + or -, decimal point, pad with leading zeros */
    620      1.1  mrg   check_sprintf ("+0X0F.EP+24", "%0+#11.1RZA", x);
    621      1.1  mrg   check_sprintf ("+0X00F.P+24", "%0+#11.0RZA", x);
    622      1.1  mrg   check_sprintf ("+0X000.0P+0", "%0+#11.1RZA", z);
    623      1.1  mrg   /* pad with leading zero */
    624      1.1  mrg   check_sprintf ("0x0000f.edcba987654321p+24", "%026RDa", x);
    625      1.1  mrg   check_sprintf ("0x0000000000000000000fp+24", "%026.0RDa", x);
    626      1.1  mrg   /* sign or space, decimal point, left justified */
    627      1.1  mrg   check_sprintf (" 0XF.EP+24 " , "%- #11.1RDA", x);
    628      1.1  mrg   check_sprintf (" 0XF.P+24  " , "%- #11.0RDA", x);
    629      1.1  mrg 
    630      1.1  mrg   mpfr_mul_si (x, x, -1, MPFR_RNDD);
    631      1.1  mrg   mpfr_mul_si (z, z, -1, MPFR_RNDD);
    632      1.1  mrg 
    633      1.1  mrg   /* sign + or - */
    634      1.1  mrg   check_sprintf ("-0xf.ep+24", "%+10.1RUa", x);
    635      1.1  mrg   check_sprintf ("  -0xfp+24", "%+10.0RUa", x);
    636      1.1  mrg   check_sprintf ("   -0x0p+0", "%+10.0RUa", z);
    637      1.1  mrg 
    638      1.1  mrg   /* rounding bit is zero */
    639      1.1  mrg   mpfr_set_str (x, "0xF.7", 16, MPFR_RNDN);
    640      1.1  mrg   check_sprintf ("0XFP+0", "%.0RNA", x);
    641      1.1  mrg   /* tie case in round to nearest mode */
    642      1.1  mrg   mpfr_set_str (x, "0x0.8800000000000000p+3", 16, MPFR_RNDN);
    643      1.1  mrg   check_sprintf ("0x9.p-1", "%#.0RNa", x);
    644      1.1  mrg   mpfr_set_str (x, "-0x0.9800000000000000p+3", 16, MPFR_RNDN);
    645      1.1  mrg   check_sprintf ("-0xap-1", "%.0RNa", x);
    646      1.1  mrg   /* trailing zeros in fractional part */
    647      1.1  mrg   check_sprintf ("-0X4.C0000000000000000000P+0", "%.20RNA", x);
    648      1.1  mrg   /* rounding bit is one and the first non zero bit is far away */
    649      1.1  mrg   mpfr_set_prec (x, 1024);
    650      1.1  mrg   mpfr_set_ui_2exp (x, 29, -1, MPFR_RNDN);
    651      1.1  mrg   mpfr_nextabove (x);
    652      1.1  mrg   check_sprintf ("0XFP+0", "%.0RNA", x);
    653      1.1  mrg 
    654      1.1  mrg   /* with more than one limb */
    655      1.1  mrg   mpfr_set_prec (x, 300);
    656      1.1  mrg   mpfr_set_str (x, "0xf.ffffffffffffffffffffffffffffffffffffffffffffffffffff"
    657      1.1  mrg                 "fffffffffffffffff", 16, MPFR_RNDN);
    658      1.1  mrg   check_sprintf ("0x1p+4 [300]", "%.0RNa [300]", x);
    659      1.1  mrg   check_sprintf ("0xfp+0 [300]", "%.0RZa [300]", x);
    660      1.1  mrg   check_sprintf ("0x1p+4 [300]", "%.0RYa [300]", x);
    661      1.1  mrg   check_sprintf ("0xfp+0 [300]", "%.0RDa [300]", x);
    662      1.1  mrg   check_sprintf ("0x1p+4 [300]", "%.0RUa [300]", x);
    663      1.1  mrg   check_sprintf ("0x1.0000000000000000000000000000000000000000p+4",
    664      1.1  mrg                  "%.40RNa", x);
    665      1.1  mrg   check_sprintf ("0xf.ffffffffffffffffffffffffffffffffffffffffp+0",
    666      1.1  mrg                  "%.40RZa", x);
    667      1.1  mrg   check_sprintf ("0x1.0000000000000000000000000000000000000000p+4",
    668      1.1  mrg                  "%.40RYa", x);
    669      1.1  mrg   check_sprintf ("0xf.ffffffffffffffffffffffffffffffffffffffffp+0",
    670      1.1  mrg                  "%.40RDa", x);
    671      1.1  mrg   check_sprintf ("0x1.0000000000000000000000000000000000000000p+4",
    672      1.1  mrg                  "%.40RUa", x);
    673      1.1  mrg 
    674      1.1  mrg   mpfr_set_str (x, "0xf.7fffffffffffffffffffffffffffffffffffffffffffffffffff"
    675      1.1  mrg                 "ffffffffffffffffff", 16, MPFR_RNDN);
    676      1.1  mrg   check_sprintf ("0XFP+0", "%.0RNA", x);
    677      1.1  mrg   check_sprintf ("0XFP+0", "%.0RZA", x);
    678      1.1  mrg   check_sprintf ("0X1P+4", "%.0RYA", x);
    679      1.1  mrg   check_sprintf ("0XFP+0", "%.0RDA", x);
    680      1.1  mrg   check_sprintf ("0X1P+4", "%.0RUA", x);
    681      1.1  mrg   check_sprintf ("0XF.8P+0", "%.1RNA", x);
    682      1.1  mrg   check_sprintf ("0XF.7P+0", "%.1RZA", x);
    683      1.1  mrg   check_sprintf ("0XF.8P+0", "%.1RYA", x);
    684      1.1  mrg   check_sprintf ("0XF.7P+0", "%.1RDA", x);
    685      1.1  mrg   check_sprintf ("0XF.8P+0", "%.1RUA", x);
    686      1.1  mrg 
    687      1.1  mrg   /* do not round up to the next power of the base */
    688      1.1  mrg   mpfr_set_str (x, "0xf.fffffffffffffffffffffffffffffffffffffeffffffffffffff"
    689      1.1  mrg                 "ffffffffffffffffff", 16, MPFR_RNDN);
    690      1.1  mrg   check_sprintf ("0xf.ffffffffffffffffffffffffffffffffffffff00p+0",
    691      1.1  mrg                  "%.40RNa", x);
    692      1.1  mrg   check_sprintf ("0xf.fffffffffffffffffffffffffffffffffffffeffp+0",
    693      1.1  mrg                  "%.40RZa", x);
    694      1.1  mrg   check_sprintf ("0xf.ffffffffffffffffffffffffffffffffffffff00p+0",
    695      1.1  mrg                  "%.40RYa", x);
    696      1.1  mrg   check_sprintf ("0xf.fffffffffffffffffffffffffffffffffffffeffp+0",
    697      1.1  mrg                  "%.40RDa", x);
    698      1.1  mrg   check_sprintf ("0xf.ffffffffffffffffffffffffffffffffffffff00p+0",
    699      1.1  mrg                  "%.40RUa", x);
    700      1.1  mrg 
    701      1.1  mrg   mpfr_clears (x, z, (mpfr_ptr) 0);
    702      1.1  mrg   return 0;
    703      1.1  mrg }
    704      1.1  mrg 
    705      1.1  mrg static int
    706      1.1  mrg binary (void)
    707      1.1  mrg {
    708      1.1  mrg   mpfr_t x;
    709      1.1  mrg   mpfr_t z;
    710      1.1  mrg   mpfr_inits2 (64, x, z, (mpfr_ptr) 0);
    711      1.1  mrg 
    712      1.1  mrg   /* special */
    713      1.1  mrg   mpfr_set_inf (x, 1);
    714      1.1  mrg   check_sprintf (pinf_str, "%Rb", x);
    715      1.1  mrg 
    716      1.1  mrg   mpfr_set_inf (x, -1);
    717      1.1  mrg   check_sprintf (minf_str, "%Rb", x);
    718      1.1  mrg 
    719      1.1  mrg   mpfr_set_nan (x);
    720      1.1  mrg   check_sprintf (nan_str, "%Rb", x);
    721      1.1  mrg 
    722      1.1  mrg   /* regular numbers */
    723      1.1  mrg   mpfr_set_str (x, "1110010101.1001101", 2, MPFR_RNDN);
    724      1.1  mrg   mpfr_set_ui (z, 0, MPFR_RNDN);
    725      1.1  mrg 
    726      1.1  mrg   /* simplest case: right justified */
    727      1.1  mrg   check_sprintf ("    1.1100101011001101p+9", "%25Rb", x);
    728      1.1  mrg   check_sprintf ("                     0p+0", "%25Rb", z);
    729      1.1  mrg   /* sign or space, pad with leading zeros */
    730      1.1  mrg   check_sprintf (" 0001.1100101011001101p+9", "% 025Rb", x);
    731      1.1  mrg   check_sprintf (" 000000000000000000000p+0", "% 025Rb", z);
    732      1.1  mrg   /* sign + or -, left justified */
    733      1.1  mrg   check_sprintf ("+1.1100101011001101p+9   ", "%+-25Rb", x);
    734      1.1  mrg   check_sprintf ("+0p+0                    ", "%+-25Rb", z);
    735      1.1  mrg   /* sign or space */
    736      1.1  mrg   check_sprintf (" 1.110p+9",  "% .3RNb", x);
    737      1.1  mrg   check_sprintf (" 1.1101p+9", "% .4RNb", x);
    738      1.1  mrg   check_sprintf (" 0.0000p+0", "% .4RNb", z);
    739      1.1  mrg   /* sign + or -, decimal point, pad with leading zeros */
    740      1.1  mrg   check_sprintf ("+00001.1p+9", "%0+#11.1RZb", x);
    741      1.1  mrg   check_sprintf ("+0001.0p+10", "%0+#11.1RNb", x);
    742      1.1  mrg   check_sprintf ("+000000.p+0", "%0+#11.0RNb", z);
    743      1.1  mrg   /* pad with leading zero */
    744      1.1  mrg   check_sprintf ("00001.1100101011001101p+9", "%025RDb", x);
    745      1.1  mrg   /* sign or space, decimal point (unused), left justified */
    746      1.1  mrg   check_sprintf (" 1.1p+9    ", "%- #11.1RDb", x);
    747      1.1  mrg   check_sprintf (" 1.p+9     ", "%- #11.0RDb", x);
    748      1.1  mrg   check_sprintf (" 1.p+10    ", "%- #11.0RUb", x);
    749      1.1  mrg   check_sprintf (" 1.p+9     ", "%- #11.0RZb", x);
    750      1.1  mrg   check_sprintf (" 1.p+10    ", "%- #11.0RYb", x);
    751      1.1  mrg   check_sprintf (" 1.p+10    ", "%- #11.0RNb", x);
    752      1.1  mrg 
    753      1.1  mrg   mpfr_mul_si (x, x, -1, MPFR_RNDD);
    754      1.1  mrg   mpfr_mul_si (z, z, -1, MPFR_RNDD);
    755      1.1  mrg 
    756      1.1  mrg   /* sign + or - */
    757      1.1  mrg   check_sprintf ("   -1.1p+9", "%+10.1RUb", x);
    758      1.1  mrg   check_sprintf ("   -0.0p+0", "%+10.1RUb", z);
    759      1.1  mrg 
    760      1.1  mrg   /* precision 0 */
    761      1.1  mrg   check_sprintf ("-1p+10", "%.0RNb", x);
    762      1.1  mrg   check_sprintf ("-1p+10", "%.0RDb", x);
    763      1.1  mrg   check_sprintf ("-1p+9",  "%.0RUb", x);
    764      1.1  mrg   check_sprintf ("-1p+9",  "%.0RZb", x);
    765      1.1  mrg   check_sprintf ("-1p+10", "%.0RYb", x);
    766      1.1  mrg   /* round to next base power */
    767      1.1  mrg   check_sprintf ("-1.0p+10", "%.1RNb", x);
    768      1.1  mrg   check_sprintf ("-1.0p+10", "%.1RDb", x);
    769      1.1  mrg   check_sprintf ("-1.0p+10", "%.1RYb", x);
    770      1.1  mrg   /* do not round to next base power */
    771      1.1  mrg   check_sprintf ("-1.1p+9", "%.1RUb", x);
    772      1.1  mrg   check_sprintf ("-1.1p+9", "%.1RZb", x);
    773      1.1  mrg   /* rounding bit is zero */
    774      1.1  mrg   check_sprintf ("-1.11p+9", "%.2RNb", x);
    775      1.1  mrg   /* tie case in round to nearest mode */
    776      1.1  mrg   check_sprintf ("-1.1100101011001101p+9", "%.16RNb", x);
    777      1.1  mrg   /* trailing zeros in fractional part */
    778      1.1  mrg   check_sprintf ("-1.110010101100110100000000000000p+9", "%.30RNb", x);
    779      1.1  mrg 
    780      1.1  mrg   mpfr_clears (x, z, (mpfr_ptr) 0);
    781      1.1  mrg   return 0;
    782      1.1  mrg }
    783      1.1  mrg 
    784      1.1  mrg static int
    785      1.1  mrg mixed (void)
    786      1.1  mrg {
    787      1.1  mrg   int n1;
    788      1.1  mrg   int n2;
    789      1.1  mrg   int i = 121;
    790  1.1.1.2  mrg #ifndef NPRINTF_L
    791      1.1  mrg   long double d = 1. / 31.;
    792  1.1.1.2  mrg #endif
    793      1.1  mrg   mpf_t mpf;
    794      1.1  mrg   mpq_t mpq;
    795      1.1  mrg   mpz_t mpz;
    796      1.1  mrg   mpfr_t x;
    797      1.1  mrg   mpfr_rnd_t rnd;
    798      1.1  mrg 
    799      1.1  mrg   mpf_init (mpf);
    800      1.1  mrg   mpf_set_ui (mpf, 40);
    801      1.1  mrg   mpf_div_ui (mpf, mpf, 31); /* mpf = 40.0 / 31.0 */
    802      1.1  mrg   mpq_init (mpq);
    803      1.1  mrg   mpq_set_ui (mpq, 123456, 4567890);
    804      1.1  mrg   mpz_init (mpz);
    805      1.1  mrg   mpz_fib_ui (mpz, 64);
    806      1.1  mrg   mpfr_init (x);
    807      1.1  mrg   mpfr_set_str (x, "-12345678.875", 10, MPFR_RNDN);
    808      1.1  mrg   rnd = MPFR_RNDD;
    809      1.1  mrg 
    810      1.1  mrg   check_vsprintf ("121%", "%i%%", i);
    811      1.1  mrg   check_vsprintf ("121% -1.2345678875E+07", "%i%% %RNE", i, x);
    812      1.1  mrg   check_vsprintf ("121, -12345679", "%i, %.0Rf", i, x);
    813      1.1  mrg   check_vsprintf ("10610209857723, -1.2345678875e+07", "%Zi, %R*e", mpz, rnd,
    814      1.1  mrg                   x);
    815      1.1  mrg   check_vsprintf ("-12345678.9, 121", "%.1Rf, %i", x, i);
    816      1.1  mrg   check_vsprintf ("-12345678, 1e240/45b352", "%.0R*f, %Qx", MPFR_RNDZ, x, mpq);
    817      1.1  mrg   n1 = check_vsprintf ("121, -12345678.875000000000, 1.290323", "%i, %.*Rf, %Ff%n",
    818      1.1  mrg                        i, 12, x, mpf, &n2);
    819      1.1  mrg   if (n1 != n2)
    820      1.1  mrg     {
    821      1.1  mrg       printf ("error in number of characters written by mpfr_vsprintf\n");
    822      1.1  mrg       printf ("expected: %d\n", n2);
    823      1.1  mrg       printf ("     got: %d\n", n1);
    824      1.1  mrg       exit (1);
    825      1.1  mrg     }
    826      1.1  mrg 
    827      1.1  mrg #ifndef NPRINTF_L
    828      1.1  mrg   check_vsprintf ("00000010610209857723, -1.2345678875e+07, 0.032258",
    829      1.1  mrg                   "%.*Zi, %R*e, %Lf", 20, mpz, rnd, x, d);
    830      1.1  mrg #endif
    831      1.1  mrg 
    832      1.1  mrg   mpf_clear (mpf);
    833      1.1  mrg   mpq_clear (mpq);
    834      1.1  mrg   mpz_clear (mpz);
    835      1.1  mrg   mpfr_clear (x);
    836      1.1  mrg   return 0;
    837      1.1  mrg }
    838      1.1  mrg 
    839  1.1.1.3  mrg #if MPFR_LCONV_DPTS
    840  1.1.1.3  mrg 
    841      1.1  mrg /* Check with locale "da_DK". On most platforms, decimal point is ','
    842      1.1  mrg    and thousands separator is '.'; the test is not performed if this
    843      1.1  mrg    is not the case or if the locale doesn't exist. */
    844      1.1  mrg static int
    845      1.1  mrg locale_da_DK (void)
    846      1.1  mrg {
    847      1.1  mrg   mpfr_prec_t p = 128;
    848      1.1  mrg   mpfr_t x;
    849      1.1  mrg 
    850      1.1  mrg   if (setlocale (LC_ALL, "da_DK") == 0 ||
    851      1.1  mrg       localeconv()->decimal_point[0] != ',' ||
    852      1.1  mrg       localeconv()->thousands_sep[0] != '.')
    853      1.1  mrg     return 0;
    854      1.1  mrg 
    855      1.1  mrg   mpfr_init2 (x, p);
    856      1.1  mrg 
    857      1.1  mrg   /* positive numbers */
    858      1.1  mrg   mpfr_set_str (x, "18993474.61279296875", 10, MPFR_RNDN);
    859      1.1  mrg 
    860      1.1  mrg   /* simplest case right justified with thousands separator */
    861      1.1  mrg   check_sprintf ("      1,899347461279296875e+07", "%'30Re", x);
    862      1.1  mrg   check_sprintf ("                   1,89935e+07", "%'30Rg", x);
    863      1.1  mrg   check_sprintf ("        18.993.474,61279296875", "%'30.19Rg", x);
    864      1.1  mrg   check_sprintf ("             18.993.474,612793", "%'30Rf", x);
    865      1.1  mrg 
    866      1.1  mrg   /* sign or space, pad, thousands separator with leading zeros */
    867      1.1  mrg   check_sprintf (" 000001,899347461279296875E+07", "%' 030RE", x);
    868      1.1  mrg   check_sprintf (" 0000000000000000001,89935E+07", "%' 030RG", x);
    869      1.1  mrg   check_sprintf (" 000000018.993.474,61279296875", "%' 030.19RG", x);
    870      1.1  mrg   check_sprintf (" 00000000000018.993.474,612793", "%' 030RF", x);
    871      1.1  mrg 
    872      1.1  mrg   mpfr_set_ui (x, 50, MPFR_RNDN);
    873      1.1  mrg   mpfr_exp10 (x, x, MPFR_RNDN);
    874      1.1  mrg   check_sprintf ("100000000000000000000000000000000000000000000000000", "%.0Rf",
    875      1.1  mrg                  x);
    876      1.1  mrg   check_sprintf
    877      1.1  mrg     ("100.000.000.000.000.000.000.000.000.000.000.000.000.000.000.000.000,",
    878      1.1  mrg      "%'#.0Rf", x);
    879      1.1  mrg   check_sprintf
    880      1.1  mrg     ("100.000.000.000.000.000.000.000.000.000.000.000.000.000.000.000.000,0000",
    881      1.1  mrg      "%'.4Rf", x);
    882      1.1  mrg 
    883      1.1  mrg   mpfr_clear (x);
    884      1.1  mrg   return 0;
    885      1.1  mrg }
    886      1.1  mrg 
    887  1.1.1.3  mrg #endif  /* MPFR_LCONV_DPTS */
    888  1.1.1.3  mrg 
    889      1.1  mrg /* check concordance between mpfr_asprintf result with a regular mpfr float
    890      1.1  mrg    and with a regular double float */
    891      1.1  mrg static int
    892      1.1  mrg random_double (void)
    893      1.1  mrg {
    894      1.1  mrg   mpfr_t x; /* random regular mpfr float */
    895      1.1  mrg   double y; /* regular double float (equal to x) */
    896      1.1  mrg 
    897      1.1  mrg   char flag[] =
    898      1.1  mrg     {
    899      1.1  mrg       '-',
    900      1.1  mrg       '+',
    901      1.1  mrg       ' ',
    902      1.1  mrg       '#',
    903      1.1  mrg       '0', /* no ambiguity: first zeros are flag zero*/
    904      1.1  mrg       '\''
    905      1.1  mrg     };
    906      1.1  mrg   /* no 'a': mpfr and glibc do not have the same semantic */
    907      1.1  mrg   char specifier[] =
    908      1.1  mrg     {
    909      1.1  mrg       'e',
    910      1.1  mrg       'f',
    911      1.1  mrg       'g',
    912      1.1  mrg       'E',
    913      1.1  mrg       'f', /* SUSv2 doesn't accept %F, but %F and %f are the same for
    914      1.1  mrg               regular numbers */
    915      1.1  mrg       'G',
    916      1.1  mrg     };
    917      1.1  mrg   int spec; /* random index in specifier[] */
    918      1.1  mrg   int prec; /* random value for precision field */
    919      1.1  mrg 
    920      1.1  mrg   /* in the format string for mpfr_t variable, the maximum length is
    921      1.1  mrg      reached by something like "%-+ #0'.*Rf", that is 12 characters. */
    922      1.1  mrg #define FMT_MPFR_SIZE 12
    923      1.1  mrg   char fmt_mpfr[FMT_MPFR_SIZE];
    924      1.1  mrg   char *ptr_mpfr;
    925      1.1  mrg 
    926      1.1  mrg   /* in the format string for double variable, the maximum length is
    927      1.1  mrg      reached by something like "%-+ #0'.*f", that is 11 characters. */
    928      1.1  mrg #define FMT_SIZE 11
    929      1.1  mrg   char fmt[FMT_SIZE];
    930      1.1  mrg   char *ptr;
    931      1.1  mrg 
    932      1.1  mrg   int xi;
    933      1.1  mrg   char *xs;
    934      1.1  mrg   int yi;
    935      1.1  mrg   char *ys;
    936      1.1  mrg 
    937      1.1  mrg   int i, j, jmax;
    938      1.1  mrg 
    939      1.1  mrg   mpfr_init2 (x, MPFR_LDBL_MANT_DIG);
    940      1.1  mrg 
    941      1.1  mrg   for (i = 0; i < 1000; ++i)
    942      1.1  mrg     {
    943      1.1  mrg       /* 1. random double */
    944      1.1  mrg       do
    945      1.1  mrg         {
    946      1.1  mrg           y = DBL_RAND ();
    947      1.1  mrg         }
    948      1.1  mrg #ifdef HAVE_DENORMS
    949      1.1  mrg       while (0);
    950      1.1  mrg #else
    951      1.1  mrg       while (ABS(y) < DBL_MIN);
    952      1.1  mrg #endif
    953      1.1  mrg 
    954      1.1  mrg       if (randlimb () % 2 == 0)
    955      1.1  mrg         y = -y;
    956      1.1  mrg 
    957      1.1  mrg       mpfr_set_d (x, y, MPFR_RNDN);
    958      1.1  mrg       if (y != mpfr_get_d (x, MPFR_RNDN))
    959      1.1  mrg         /* conversion error: skip this one */
    960      1.1  mrg         continue;
    961      1.1  mrg 
    962      1.1  mrg       /* 2. build random format strings fmt_mpfr and fmt */
    963      1.1  mrg       ptr_mpfr = fmt_mpfr;
    964      1.1  mrg       ptr = fmt;
    965      1.1  mrg       *ptr_mpfr++ = *ptr++ = '%';
    966      1.1  mrg       /* random specifier 'e', 'f', 'g', 'E', 'F', or 'G' */
    967      1.1  mrg       spec = (int) (randlimb() % 6);
    968      1.1  mrg       /* random flags, but no ' flag with %e */
    969      1.1  mrg       jmax = (spec == 0 || spec == 3) ? 5 : 6;
    970      1.1  mrg       for (j = 0; j < jmax; j++)
    971      1.1  mrg         {
    972      1.1  mrg           if (randlimb() % 3 == 0)
    973      1.1  mrg             *ptr_mpfr++ = *ptr++ = flag[j];
    974      1.1  mrg         }
    975      1.1  mrg       *ptr_mpfr++ = *ptr++ = '.';
    976      1.1  mrg       *ptr_mpfr++ = *ptr++ = '*';
    977      1.1  mrg       *ptr_mpfr++ = 'R';
    978      1.1  mrg       *ptr_mpfr++ = *ptr++ = specifier[spec];
    979      1.1  mrg       *ptr_mpfr = *ptr = '\0';
    980      1.1  mrg       MPFR_ASSERTN (ptr - fmt < FMT_SIZE);
    981      1.1  mrg       MPFR_ASSERTN (ptr_mpfr - fmt_mpfr < FMT_MPFR_SIZE);
    982      1.1  mrg 
    983      1.1  mrg       /* advantage small precision */
    984      1.1  mrg       if (randlimb() % 2 == 0)
    985      1.1  mrg         prec = (int) (randlimb() % 10);
    986      1.1  mrg       else
    987      1.1  mrg         prec = (int) (randlimb() % prec_max_printf);
    988      1.1  mrg 
    989      1.1  mrg       /* 3. calls and checks */
    990      1.1  mrg       /* the double float case is handled by the libc asprintf through
    991      1.1  mrg          gmp_asprintf */
    992      1.1  mrg       xi = mpfr_asprintf (&xs, fmt_mpfr, prec, x);
    993      1.1  mrg       yi = mpfr_asprintf (&ys, fmt, prec, y);
    994      1.1  mrg 
    995      1.1  mrg       /* test if XS and YS differ, beware that ISO C99 doesn't specify
    996      1.1  mrg          the sign of a zero exponent (the C99 rationale says: "The sign
    997      1.1  mrg          of a zero exponent in %e format is unspecified.  The committee
    998      1.1  mrg          knows of different implementations and choose not to require
    999      1.1  mrg          implementations to document their behaviour in this case
   1000      1.1  mrg          (by making this be implementation defined behaviour).  Most
   1001      1.1  mrg          implementations use a "+" sign, e.g., 1.2e+00; but there is at
   1002      1.1  mrg          least one implementation that uses the sign of the unlimited
   1003      1.1  mrg          precision result, e.g., the 0.987 would be 9.87e-01, so could
   1004      1.1  mrg          end up as 1e-00 after rounding to one digit of precision."),
   1005      1.1  mrg          while mpfr always uses '+' */
   1006      1.1  mrg       if (xi != yi
   1007      1.1  mrg           || ((strcmp (xs, ys) != 0)
   1008      1.1  mrg               && (spec == 1 || spec == 4
   1009      1.1  mrg                   || ((strstr (xs, "e+00") == NULL
   1010      1.1  mrg                        || strstr (ys, "e-00") == NULL)
   1011      1.1  mrg                       && (strstr (xs, "E+00") == NULL
   1012      1.1  mrg                           || strstr (ys, "E-00") == NULL)))))
   1013      1.1  mrg         {
   1014      1.1  mrg           mpfr_printf ("Error in mpfr_asprintf(\"%s\", %d, %Re)\n",
   1015      1.1  mrg                        fmt_mpfr, prec, x);
   1016      1.1  mrg           printf ("expected: %s\n", ys);
   1017      1.1  mrg           printf ("     got: %s\n", xs);
   1018      1.1  mrg           printf ("xi=%d yi=%d spec=%d\n", xi, yi, spec);
   1019      1.1  mrg 
   1020      1.1  mrg           exit (1);
   1021      1.1  mrg         }
   1022      1.1  mrg 
   1023      1.1  mrg       mpfr_free_str (xs);
   1024      1.1  mrg       mpfr_free_str (ys);
   1025      1.1  mrg     }
   1026      1.1  mrg 
   1027      1.1  mrg   mpfr_clear (x);
   1028      1.1  mrg   return 0;
   1029      1.1  mrg }
   1030      1.1  mrg 
   1031      1.1  mrg static void
   1032      1.1  mrg bug20080610 (void)
   1033      1.1  mrg {
   1034      1.1  mrg   /* bug on icc found on June 10, 2008 */
   1035      1.1  mrg   /* this is not a bug but a different implementation choice: ISO C99 doesn't
   1036      1.1  mrg      specify the sign of a zero exponent (see note in random_double above). */
   1037      1.1  mrg   mpfr_t x;
   1038      1.1  mrg   double y;
   1039      1.1  mrg   int xi;
   1040      1.1  mrg   char *xs;
   1041      1.1  mrg   int yi;
   1042      1.1  mrg   char *ys;
   1043      1.1  mrg 
   1044      1.1  mrg   mpfr_init2 (x, MPFR_LDBL_MANT_DIG);
   1045      1.1  mrg 
   1046      1.1  mrg   y = -9.95645044213728791504536275169812142849e-01;
   1047      1.1  mrg   mpfr_set_d (x, y, MPFR_RNDN);
   1048      1.1  mrg 
   1049      1.1  mrg   xi = mpfr_asprintf (&xs, "%- #0.*Re", 1, x);
   1050      1.1  mrg   yi = mpfr_asprintf (&ys, "%- #0.*e", 1, y);
   1051      1.1  mrg 
   1052      1.1  mrg   if (xi != yi || strcmp (xs, ys) != 0)
   1053      1.1  mrg     {
   1054      1.1  mrg       printf ("Error in bug20080610\n");
   1055      1.1  mrg       printf ("expected: %s\n", ys);
   1056      1.1  mrg       printf ("     got: %s\n", xs);
   1057      1.1  mrg       printf ("xi=%d yi=%d\n", xi, yi);
   1058      1.1  mrg 
   1059      1.1  mrg       exit (1);
   1060      1.1  mrg     }
   1061      1.1  mrg 
   1062      1.1  mrg   mpfr_free_str (xs);
   1063      1.1  mrg   mpfr_free_str (ys);
   1064      1.1  mrg   mpfr_clear (x);
   1065      1.1  mrg }
   1066      1.1  mrg 
   1067      1.1  mrg static void
   1068      1.1  mrg bug20081214 (void)
   1069      1.1  mrg {
   1070      1.1  mrg  /* problem with glibc 2.3.6, December 14, 2008:
   1071      1.1  mrg     the system asprintf outputs "-1.0" instead of "-1.". */
   1072      1.1  mrg   mpfr_t x;
   1073      1.1  mrg   double y;
   1074      1.1  mrg   int xi;
   1075      1.1  mrg   char *xs;
   1076      1.1  mrg   int yi;
   1077      1.1  mrg   char *ys;
   1078      1.1  mrg 
   1079      1.1  mrg   mpfr_init2 (x, MPFR_LDBL_MANT_DIG);
   1080      1.1  mrg 
   1081      1.1  mrg   y = -9.90597761233942053494e-01;
   1082      1.1  mrg   mpfr_set_d (x, y, MPFR_RNDN);
   1083      1.1  mrg 
   1084      1.1  mrg   xi = mpfr_asprintf (&xs, "%- #0.*RG", 1, x);
   1085      1.1  mrg   yi = mpfr_asprintf (&ys, "%- #0.*G", 1, y);
   1086      1.1  mrg 
   1087      1.1  mrg   if (xi != yi || strcmp (xs, ys) != 0)
   1088      1.1  mrg     {
   1089      1.1  mrg       mpfr_printf ("Error in bug20081214\n"
   1090      1.1  mrg                    "mpfr_asprintf(\"%- #0.*Re\", 1, %Re)\n", x);
   1091      1.1  mrg       printf ("expected: %s\n", ys);
   1092      1.1  mrg       printf ("     got: %s\n", xs);
   1093      1.1  mrg       printf ("xi=%d yi=%d\n", xi, yi);
   1094      1.1  mrg 
   1095      1.1  mrg       exit (1);
   1096      1.1  mrg     }
   1097      1.1  mrg 
   1098      1.1  mrg   mpfr_free_str (xs);
   1099      1.1  mrg   mpfr_free_str (ys);
   1100      1.1  mrg   mpfr_clear (x);
   1101      1.1  mrg }
   1102      1.1  mrg 
   1103  1.1.1.2  mrg static void
   1104  1.1.1.2  mrg bug20111102 (void)
   1105  1.1.1.2  mrg {
   1106  1.1.1.2  mrg   mpfr_t t;
   1107  1.1.1.2  mrg   char s[100];
   1108  1.1.1.2  mrg 
   1109  1.1.1.2  mrg   mpfr_init2 (t, 84);
   1110  1.1.1.2  mrg   mpfr_set_str (t, "999.99999999999999999999", 10, MPFR_RNDN);
   1111  1.1.1.2  mrg   mpfr_sprintf (s, "%.20RNg", t);
   1112  1.1.1.2  mrg   if (strcmp (s, "1000") != 0)
   1113  1.1.1.2  mrg     {
   1114  1.1.1.2  mrg       printf ("Error in bug20111102, expected 1000, got %s\n", s);
   1115  1.1.1.2  mrg       exit (1);
   1116  1.1.1.2  mrg     }
   1117  1.1.1.2  mrg   mpfr_clear (t);
   1118  1.1.1.2  mrg }
   1119  1.1.1.2  mrg 
   1120      1.1  mrg /* In particular, the following test makes sure that the rounding
   1121      1.1  mrg  * for %Ra and %Rb is not done on the MPFR number itself (as it
   1122      1.1  mrg  * would overflow). Note: it has been reported on comp.std.c that
   1123      1.1  mrg  * some C libraries behave differently on %a, but this is a bug.
   1124      1.1  mrg  */
   1125      1.1  mrg static void
   1126      1.1  mrg check_emax_aux (mpfr_exp_t e)
   1127      1.1  mrg {
   1128      1.1  mrg   mpfr_t x;
   1129      1.1  mrg   char *s1, s2[256];
   1130      1.1  mrg   int i;
   1131      1.1  mrg   mpfr_exp_t emax;
   1132      1.1  mrg 
   1133      1.1  mrg   MPFR_ASSERTN (e <= LONG_MAX);
   1134      1.1  mrg   emax = mpfr_get_emax ();
   1135      1.1  mrg   set_emax (e);
   1136      1.1  mrg 
   1137      1.1  mrg   mpfr_init2 (x, 16);
   1138      1.1  mrg 
   1139      1.1  mrg   mpfr_set_inf (x, 1);
   1140      1.1  mrg   mpfr_nextbelow (x);
   1141      1.1  mrg 
   1142      1.1  mrg   i = mpfr_asprintf (&s1, "%Ra %.2Ra", x, x);
   1143      1.1  mrg   MPFR_ASSERTN (i > 0);
   1144      1.1  mrg 
   1145      1.1  mrg   mpfr_snprintf (s2, 256, "0x7.fff8p+%ld 0x8.00p+%ld", e-3, e-3);
   1146      1.1  mrg 
   1147      1.1  mrg   if (strcmp (s1, s2) != 0)
   1148      1.1  mrg     {
   1149  1.1.1.2  mrg       printf ("Error in check_emax_aux for emax = ");
   1150  1.1.1.2  mrg       if (e > LONG_MAX)
   1151  1.1.1.2  mrg         printf ("(>LONG_MAX)\n");
   1152  1.1.1.2  mrg       else
   1153  1.1.1.2  mrg         printf ("%ld\n", (long) e);
   1154      1.1  mrg       printf ("Expected %s\n", s2);
   1155      1.1  mrg       printf ("Got      %s\n", s1);
   1156      1.1  mrg       exit (1);
   1157      1.1  mrg     }
   1158      1.1  mrg 
   1159      1.1  mrg   mpfr_free_str (s1);
   1160      1.1  mrg 
   1161      1.1  mrg   i = mpfr_asprintf (&s1, "%Rb %.2Rb", x, x);
   1162      1.1  mrg   MPFR_ASSERTN (i > 0);
   1163      1.1  mrg 
   1164      1.1  mrg   mpfr_snprintf (s2, 256, "1.111111111111111p+%ld 1.00p+%ld", e-1, e);
   1165      1.1  mrg 
   1166      1.1  mrg   if (strcmp (s1, s2) != 0)
   1167      1.1  mrg     {
   1168  1.1.1.2  mrg       printf ("Error in check_emax_aux for emax = ");
   1169  1.1.1.2  mrg       if (e > LONG_MAX)
   1170  1.1.1.2  mrg         printf ("(>LONG_MAX)\n");
   1171  1.1.1.2  mrg       else
   1172  1.1.1.2  mrg         printf ("%ld\n", (long) e);
   1173      1.1  mrg       printf ("Expected %s\n", s2);
   1174      1.1  mrg       printf ("Got      %s\n", s1);
   1175      1.1  mrg       exit (1);
   1176      1.1  mrg     }
   1177      1.1  mrg 
   1178      1.1  mrg   mpfr_free_str (s1);
   1179      1.1  mrg 
   1180      1.1  mrg   mpfr_clear (x);
   1181      1.1  mrg   set_emax (emax);
   1182      1.1  mrg }
   1183      1.1  mrg 
   1184      1.1  mrg static void
   1185      1.1  mrg check_emax (void)
   1186      1.1  mrg {
   1187      1.1  mrg   check_emax_aux (15);
   1188      1.1  mrg   check_emax_aux (MPFR_EMAX_MAX);
   1189      1.1  mrg }
   1190      1.1  mrg 
   1191  1.1.1.3  mrg static void
   1192  1.1.1.3  mrg check_emin_aux (mpfr_exp_t e)
   1193  1.1.1.3  mrg {
   1194  1.1.1.3  mrg   mpfr_t x;
   1195  1.1.1.3  mrg   char *s1, s2[256];
   1196  1.1.1.3  mrg   int i;
   1197  1.1.1.3  mrg   mpfr_exp_t emin;
   1198  1.1.1.3  mrg   mpz_t ee;
   1199  1.1.1.3  mrg 
   1200  1.1.1.3  mrg   MPFR_ASSERTN (e >= LONG_MIN);
   1201  1.1.1.3  mrg   emin = mpfr_get_emin ();
   1202  1.1.1.3  mrg   set_emin (e);
   1203  1.1.1.3  mrg 
   1204  1.1.1.3  mrg   mpfr_init2 (x, 16);
   1205  1.1.1.3  mrg   mpz_init (ee);
   1206  1.1.1.3  mrg 
   1207  1.1.1.3  mrg   mpfr_setmin (x, e);
   1208  1.1.1.3  mrg   mpz_set_si (ee, e);
   1209  1.1.1.3  mrg   mpz_sub_ui (ee, ee, 1);
   1210  1.1.1.3  mrg 
   1211  1.1.1.3  mrg   i = mpfr_asprintf (&s1, "%Ra", x);
   1212  1.1.1.3  mrg   MPFR_ASSERTN (i > 0);
   1213  1.1.1.3  mrg 
   1214  1.1.1.3  mrg   gmp_snprintf (s2, 256, "0x1p%Zd", ee);
   1215  1.1.1.3  mrg 
   1216  1.1.1.3  mrg   if (strcmp (s1, s2) != 0)
   1217  1.1.1.3  mrg     {
   1218  1.1.1.3  mrg       printf ("Error in check_emin_aux for emin = %ld\n", (long) e);
   1219  1.1.1.3  mrg       printf ("Expected %s\n", s2);
   1220  1.1.1.3  mrg       printf ("Got      %s\n", s1);
   1221  1.1.1.3  mrg       exit (1);
   1222  1.1.1.3  mrg     }
   1223  1.1.1.3  mrg 
   1224  1.1.1.3  mrg   mpfr_free_str (s1);
   1225  1.1.1.3  mrg 
   1226  1.1.1.3  mrg   i = mpfr_asprintf (&s1, "%Rb", x);
   1227  1.1.1.3  mrg   MPFR_ASSERTN (i > 0);
   1228  1.1.1.3  mrg 
   1229  1.1.1.3  mrg   gmp_snprintf (s2, 256, "1p%Zd", ee);
   1230  1.1.1.3  mrg 
   1231  1.1.1.3  mrg   if (strcmp (s1, s2) != 0)
   1232  1.1.1.3  mrg     {
   1233  1.1.1.3  mrg       printf ("Error in check_emin_aux for emin = %ld\n", (long) e);
   1234  1.1.1.3  mrg       printf ("Expected %s\n", s2);
   1235  1.1.1.3  mrg       printf ("Got      %s\n", s1);
   1236  1.1.1.3  mrg       exit (1);
   1237  1.1.1.3  mrg     }
   1238  1.1.1.3  mrg 
   1239  1.1.1.3  mrg   mpfr_free_str (s1);
   1240  1.1.1.3  mrg 
   1241  1.1.1.3  mrg   mpfr_clear (x);
   1242  1.1.1.3  mrg   mpz_clear (ee);
   1243  1.1.1.3  mrg   set_emin (emin);
   1244  1.1.1.3  mrg }
   1245  1.1.1.3  mrg 
   1246  1.1.1.3  mrg static void
   1247  1.1.1.3  mrg check_emin (void)
   1248  1.1.1.3  mrg {
   1249  1.1.1.3  mrg   check_emin_aux (-15);
   1250  1.1.1.3  mrg   check_emin_aux (mpfr_get_emin ());
   1251  1.1.1.3  mrg   check_emin_aux (MPFR_EMIN_MIN);
   1252  1.1.1.3  mrg }
   1253  1.1.1.3  mrg 
   1254      1.1  mrg int
   1255      1.1  mrg main (int argc, char **argv)
   1256      1.1  mrg {
   1257      1.1  mrg   char *locale;
   1258      1.1  mrg 
   1259      1.1  mrg   tests_start_mpfr ();
   1260      1.1  mrg 
   1261      1.1  mrg #if defined(HAVE_LOCALE_H) && defined(HAVE_SETLOCALE)
   1262      1.1  mrg   /* currently, we just check with 'C' locale */
   1263      1.1  mrg   locale = setlocale (LC_ALL, "C");
   1264      1.1  mrg #endif
   1265      1.1  mrg 
   1266  1.1.1.2  mrg   bug20111102 ();
   1267      1.1  mrg   native_types ();
   1268      1.1  mrg   hexadecimal ();
   1269      1.1  mrg   binary ();
   1270      1.1  mrg   decimal ();
   1271      1.1  mrg   mixed ();
   1272      1.1  mrg   check_emax ();
   1273  1.1.1.3  mrg   check_emin ();
   1274      1.1  mrg 
   1275      1.1  mrg #if defined(HAVE_LOCALE_H) && defined(HAVE_SETLOCALE)
   1276  1.1.1.3  mrg #if MPFR_LCONV_DPTS
   1277      1.1  mrg   locale_da_DK ();
   1278  1.1.1.3  mrg   /* Avoid a warning by doing the setlocale outside of this #if */
   1279  1.1.1.3  mrg #endif
   1280      1.1  mrg   setlocale (LC_ALL, locale);
   1281      1.1  mrg #endif
   1282      1.1  mrg 
   1283      1.1  mrg   if (getenv ("MPFR_CHECK_LIBC_PRINTF"))
   1284      1.1  mrg     {
   1285      1.1  mrg       /* check against libc */
   1286      1.1  mrg       random_double ();
   1287      1.1  mrg       bug20081214 ();
   1288      1.1  mrg       bug20080610 ();
   1289      1.1  mrg     }
   1290      1.1  mrg 
   1291      1.1  mrg   tests_end_mpfr ();
   1292      1.1  mrg   return 0;
   1293      1.1  mrg }
   1294      1.1  mrg 
   1295      1.1  mrg #else  /* MPFR_VERSION */
   1296      1.1  mrg 
   1297      1.1  mrg int
   1298      1.1  mrg main (void)
   1299      1.1  mrg {
   1300      1.1  mrg   printf ("Warning! Test disabled for this MPFR version.\n");
   1301      1.1  mrg   return 0;
   1302      1.1  mrg }
   1303      1.1  mrg 
   1304      1.1  mrg #endif  /* MPFR_VERSION */
   1305      1.1  mrg 
   1306      1.1  mrg #else  /* HAVE_STDARG */
   1307      1.1  mrg 
   1308      1.1  mrg int
   1309      1.1  mrg main (void)
   1310      1.1  mrg {
   1311      1.1  mrg   /* We have nothing to test. */
   1312  1.1.1.2  mrg   return 77;
   1313      1.1  mrg }
   1314      1.1  mrg 
   1315      1.1  mrg #endif  /* HAVE_STDARG */
   1316