Home | History | Annotate | Line # | Download | only in tests
tsprintf.c revision 1.1.1.2
      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.2  mrg Copyright 2007, 2008, 2009, 2010, 2011, 2012, 2013 Free Software Foundation, Inc.
      5  1.1.1.2  mrg Contributed by the AriC and Caramel 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  mrg   check_sprintf ("1.00000000000000000000000000000", "%#.30Rg", x);
    460      1.1  mrg   check_sprintf ("1", "%.30Rg", x);
    461      1.1  mrg   mpfr_set_ui (x, 0, MPFR_RNDN);
    462      1.1  mrg   check_sprintf ("0.000000000000000000000000000000", "%#.30Rg", x);
    463      1.1  mrg   check_sprintf ("0", "%.30Rg", x);
    464      1.1  mrg 
    465      1.1  mrg   /* following tests with precision 53 bits */
    466      1.1  mrg   mpfr_set_prec (x, 53);
    467      1.1  mrg 
    468      1.1  mrg   /* Exponent zero has a plus sign */
    469      1.1  mrg   mpfr_set_str (x, "-9.95645044213728791504536275169812142849e-01", 10,
    470      1.1  mrg                 MPFR_RNDN);
    471      1.1  mrg   check_sprintf ("-1.0e+00", "%- #0.1Re", x);
    472      1.1  mrg 
    473      1.1  mrg   /* Decimal point and no figure after it with '#' flag and 'G' style */
    474      1.1  mrg   mpfr_set_str (x, "-9.90597761233942053494e-01", 10, MPFR_RNDN);
    475      1.1  mrg   check_sprintf ("-1.", "%- #0.1RG", x);
    476      1.1  mrg 
    477      1.1  mrg   /* precision zero */
    478  1.1.1.2  mrg   mpfr_set_d (x, 9.5, MPFR_RNDN);
    479  1.1.1.2  mrg   check_sprintf ("9",    "%.0RDf", x);
    480  1.1.1.2  mrg   check_sprintf ("10",    "%.0RUf", x);
    481  1.1.1.2  mrg 
    482  1.1.1.2  mrg   mpfr_set_d (x, 19.5, MPFR_RNDN);
    483  1.1.1.2  mrg   check_sprintf ("19",    "%.0RDf", x);
    484  1.1.1.2  mrg   check_sprintf ("20",    "%.0RUf", x);
    485  1.1.1.2  mrg 
    486  1.1.1.2  mrg   mpfr_set_d (x, 99.5, MPFR_RNDN);
    487  1.1.1.2  mrg   check_sprintf ("99",    "%.0RDf", x);
    488  1.1.1.2  mrg   check_sprintf ("100",   "%.0RUf", x);
    489  1.1.1.2  mrg 
    490      1.1  mrg   mpfr_set_d (x, -9.5, MPFR_RNDN);
    491      1.1  mrg   check_sprintf ("-10",    "%.0RDf", x);
    492      1.1  mrg   check_sprintf ("-10",    "%.0RYf", x);
    493      1.1  mrg   check_sprintf ("-10",    "%.0Rf", x);
    494      1.1  mrg   check_sprintf ("-1e+01", "%.0Re", x);
    495      1.1  mrg   check_sprintf ("-1e+01", "%.0Rg", x);
    496      1.1  mrg   mpfr_set_ui_2exp (x, 1, -1, MPFR_RNDN);
    497      1.1  mrg   check_sprintf ("0",      "%.0Rf", x);
    498      1.1  mrg   check_sprintf ("5e-01",  "%.0Re", x);
    499      1.1  mrg   check_sprintf ("0.5",    "%.0Rg", x);
    500      1.1  mrg   mpfr_set_ui_2exp (x, 3, -1, MPFR_RNDN);
    501      1.1  mrg   check_sprintf ("2",      "%.0Rf", x);
    502      1.1  mrg   mpfr_set_ui_2exp (x, 5, -1, MPFR_RNDN);
    503      1.1  mrg   check_sprintf ("2",      "%.0Rf", x);
    504      1.1  mrg   mpfr_set_ui (x, 0x1f, MPFR_RNDN);
    505      1.1  mrg   check_sprintf ("0x1p+5", "%.0Ra", x);
    506      1.1  mrg   mpfr_set_ui (x, 3, MPFR_RNDN);
    507      1.1  mrg   check_sprintf ("1p+2",   "%.0Rb", x);
    508      1.1  mrg 
    509      1.1  mrg   /* round to next ten power with %f but not with %g */
    510      1.1  mrg   mpfr_set_str (x, "-6.64464380544039223686e-02", 10, MPFR_RNDN);
    511      1.1  mrg   check_sprintf ("-0.1",  "%.1Rf", x);
    512      1.1  mrg   check_sprintf ("-0.0",  "%.1RZf", x);
    513      1.1  mrg   check_sprintf ("-0.07", "%.1Rg", x);
    514      1.1  mrg   check_sprintf ("-0.06", "%.1RZg", x);
    515      1.1  mrg 
    516      1.1  mrg   /* round to next ten power and do not remove trailing zeros */
    517      1.1  mrg   mpfr_set_str (x, "9.98429393291486722006e-02", 10, MPFR_RNDN);
    518      1.1  mrg   check_sprintf ("0.1",   "%#.1Rg", x);
    519      1.1  mrg   check_sprintf ("0.10",  "%#.2Rg", x);
    520      1.1  mrg   check_sprintf ("0.099", "%#.2RZg", x);
    521      1.1  mrg 
    522      1.1  mrg   /* Halfway cases */
    523      1.1  mrg   mpfr_set_str (x, "1.5", 10, MPFR_RNDN);
    524      1.1  mrg   check_sprintf ("2e+00", "%.0Re", x);
    525      1.1  mrg   mpfr_set_str (x, "2.5", 10, MPFR_RNDN);
    526      1.1  mrg   check_sprintf ("2e+00", "%.0Re", x);
    527      1.1  mrg   mpfr_set_str (x, "9.5", 10, MPFR_RNDN);
    528      1.1  mrg   check_sprintf ("1e+01", "%.0Re", x);
    529      1.1  mrg   mpfr_set_str (x, "1.25", 10, MPFR_RNDN);
    530      1.1  mrg   check_sprintf ("1.2e+00", "%.1Re", x);
    531      1.1  mrg   mpfr_set_str (x, "1.75", 10, MPFR_RNDN);
    532      1.1  mrg   check_sprintf ("1.8e+00", "%.1Re", x);
    533      1.1  mrg   mpfr_set_str (x, "-0.5", 10, MPFR_RNDN);
    534      1.1  mrg   check_sprintf ("-0", "%.0Rf", x);
    535      1.1  mrg   mpfr_set_str (x, "1.25", 10, MPFR_RNDN);
    536      1.1  mrg   check_sprintf ("1.2", "%.1Rf", x);
    537      1.1  mrg   mpfr_set_str (x, "1.75", 10, MPFR_RNDN);
    538      1.1  mrg   check_sprintf ("1.8", "%.1Rf", x);
    539      1.1  mrg   mpfr_set_str (x, "1.5", 10, MPFR_RNDN);
    540      1.1  mrg   check_sprintf ("2", "%.1Rg", x);
    541      1.1  mrg   mpfr_set_str (x, "2.5", 10, MPFR_RNDN);
    542      1.1  mrg   check_sprintf ("2", "%.1Rg", x);
    543      1.1  mrg   mpfr_set_str (x, "9.25", 10, MPFR_RNDN);
    544      1.1  mrg   check_sprintf ("9.2", "%.2Rg", x);
    545      1.1  mrg   mpfr_set_str (x, "9.75", 10, MPFR_RNDN);
    546      1.1  mrg   check_sprintf ("9.8", "%.2Rg", x);
    547      1.1  mrg 
    548      1.1  mrg   /* assertion failure in r6320 */
    549      1.1  mrg   mpfr_set_str (x, "-9.996", 10, MPFR_RNDN);
    550      1.1  mrg   check_sprintf ("-10.0", "%.1Rf", x);
    551      1.1  mrg 
    552      1.1  mrg   mpfr_clears (x, z, (mpfr_ptr) 0);
    553      1.1  mrg   return 0;
    554      1.1  mrg }
    555      1.1  mrg 
    556      1.1  mrg static int
    557      1.1  mrg hexadecimal (void)
    558      1.1  mrg {
    559      1.1  mrg   mpfr_t x, z;
    560      1.1  mrg   mpfr_inits2 (64, x, z, (mpfr_ptr) 0);
    561      1.1  mrg 
    562      1.1  mrg   /* special */
    563      1.1  mrg   mpfr_set_inf (x, 1);
    564      1.1  mrg   check_sprintf (pinf_str, "%Ra", x);
    565      1.1  mrg   check_sprintf (pinf_str, "%RUa", x);
    566      1.1  mrg   check_sprintf (pinf_str, "%RDa", x);
    567      1.1  mrg   check_sprintf (pinf_uc_str, "%RA", x);
    568      1.1  mrg   check_sprintf (pinf_uc_str, "%RYA", x);
    569      1.1  mrg   check_sprintf (pinf_uc_str, "%RZA", x);
    570      1.1  mrg   check_sprintf (pinf_uc_str, "%RNA", x);
    571      1.1  mrg 
    572      1.1  mrg   mpfr_set_inf (x, -1);
    573      1.1  mrg   check_sprintf (minf_str, "%Ra", x);
    574      1.1  mrg   check_sprintf (minf_str, "%RYa", x);
    575      1.1  mrg   check_sprintf (minf_str, "%RZa", x);
    576      1.1  mrg   check_sprintf (minf_str, "%RNa", x);
    577      1.1  mrg   check_sprintf (minf_uc_str, "%RA", x);
    578      1.1  mrg   check_sprintf (minf_uc_str, "%RUA", x);
    579      1.1  mrg   check_sprintf (minf_uc_str, "%RDA", x);
    580      1.1  mrg 
    581      1.1  mrg   mpfr_set_nan (x);
    582      1.1  mrg   check_sprintf (nan_str, "%Ra", x);
    583      1.1  mrg   check_sprintf (nan_uc_str, "%RA", x);
    584      1.1  mrg 
    585      1.1  mrg   /* regular numbers */
    586      1.1  mrg   mpfr_set_str (x, "FEDCBA9.87654321", 16, MPFR_RNDN);
    587      1.1  mrg   mpfr_set_ui (z, 0, MPFR_RNDZ);
    588      1.1  mrg 
    589      1.1  mrg   /* simplest case right justified */
    590      1.1  mrg   check_sprintf ("   0xf.edcba987654321p+24", "%25Ra", x);
    591      1.1  mrg   check_sprintf ("   0xf.edcba987654321p+24", "%25RUa", x);
    592      1.1  mrg   check_sprintf ("   0xf.edcba987654321p+24", "%25RDa", x);
    593      1.1  mrg   check_sprintf ("   0xf.edcba987654321p+24", "%25RYa", x);
    594      1.1  mrg   check_sprintf ("   0xf.edcba987654321p+24", "%25RZa", x);
    595      1.1  mrg   check_sprintf ("   0xf.edcba987654321p+24", "%25RNa", x);
    596      1.1  mrg   check_sprintf ("                  0x1p+28", "%25.0Ra", x);
    597      1.1  mrg   check_sprintf ("                   0x0p+0", "%25.0Ra", z);
    598      1.1  mrg   /* sign or space, pad with leading zeros */
    599      1.1  mrg   check_sprintf (" 0X00F.EDCBA987654321P+24", "% 025RA", x);
    600      1.1  mrg   check_sprintf (" 0X000000000000000001P+28", "% 025.0RA", x);
    601      1.1  mrg   check_sprintf (" 0X0000000000000000000P+0", "% 025.0RA", z);
    602      1.1  mrg   /* sign + or -, left justified */
    603      1.1  mrg   check_sprintf ("+0xf.edcba987654321p+24  ", "%+-25Ra", x);
    604      1.1  mrg   check_sprintf ("+0x1p+28                 ", "%+-25.0Ra", x);
    605      1.1  mrg   check_sprintf ("+0x0p+0                  ", "%+-25.0Ra", z);
    606      1.1  mrg   /* decimal point, left justified, precision and rounding parameter */
    607      1.1  mrg   check_vsprintf ("0XF.FP+24 ", "%#-10.*R*A", 1, MPFR_RNDN, x);
    608      1.1  mrg   check_vsprintf ("0X1.P+28  ", "%#-10.*R*A", 0, MPFR_RNDN, x);
    609      1.1  mrg   check_vsprintf ("0X0.P+0   ", "%#-10.*R*A", 0, MPFR_RNDN, z);
    610      1.1  mrg   /* sign or space */
    611      1.1  mrg   check_sprintf (" 0xf.eddp+24", "% .3RNa", x);
    612      1.1  mrg   check_sprintf (" 0x1p+28",     "% .0RNa", x);
    613      1.1  mrg   /* sign + or -, decimal point, pad with leading zeros */
    614      1.1  mrg   check_sprintf ("+0X0F.EP+24", "%0+#11.1RZA", x);
    615      1.1  mrg   check_sprintf ("+0X00F.P+24", "%0+#11.0RZA", x);
    616      1.1  mrg   check_sprintf ("+0X000.0P+0", "%0+#11.1RZA", z);
    617      1.1  mrg   /* pad with leading zero */
    618      1.1  mrg   check_sprintf ("0x0000f.edcba987654321p+24", "%026RDa", x);
    619      1.1  mrg   check_sprintf ("0x0000000000000000000fp+24", "%026.0RDa", x);
    620      1.1  mrg   /* sign or space, decimal point, left justified */
    621      1.1  mrg   check_sprintf (" 0XF.EP+24 " , "%- #11.1RDA", x);
    622      1.1  mrg   check_sprintf (" 0XF.P+24  " , "%- #11.0RDA", x);
    623      1.1  mrg 
    624      1.1  mrg   mpfr_mul_si (x, x, -1, MPFR_RNDD);
    625      1.1  mrg   mpfr_mul_si (z, z, -1, MPFR_RNDD);
    626      1.1  mrg 
    627      1.1  mrg   /* sign + or - */
    628      1.1  mrg   check_sprintf ("-0xf.ep+24", "%+10.1RUa", x);
    629      1.1  mrg   check_sprintf ("  -0xfp+24", "%+10.0RUa", x);
    630      1.1  mrg   check_sprintf ("   -0x0p+0", "%+10.0RUa", z);
    631      1.1  mrg 
    632      1.1  mrg   /* rounding bit is zero */
    633      1.1  mrg   mpfr_set_str (x, "0xF.7", 16, MPFR_RNDN);
    634      1.1  mrg   check_sprintf ("0XFP+0", "%.0RNA", x);
    635      1.1  mrg   /* tie case in round to nearest mode */
    636      1.1  mrg   mpfr_set_str (x, "0x0.8800000000000000p+3", 16, MPFR_RNDN);
    637      1.1  mrg   check_sprintf ("0x9.p-1", "%#.0RNa", x);
    638      1.1  mrg   mpfr_set_str (x, "-0x0.9800000000000000p+3", 16, MPFR_RNDN);
    639      1.1  mrg   check_sprintf ("-0xap-1", "%.0RNa", x);
    640      1.1  mrg   /* trailing zeros in fractional part */
    641      1.1  mrg   check_sprintf ("-0X4.C0000000000000000000P+0", "%.20RNA", x);
    642      1.1  mrg   /* rounding bit is one and the first non zero bit is far away */
    643      1.1  mrg   mpfr_set_prec (x, 1024);
    644      1.1  mrg   mpfr_set_ui_2exp (x, 29, -1, MPFR_RNDN);
    645      1.1  mrg   mpfr_nextabove (x);
    646      1.1  mrg   check_sprintf ("0XFP+0", "%.0RNA", x);
    647      1.1  mrg 
    648      1.1  mrg   /* with more than one limb */
    649      1.1  mrg   mpfr_set_prec (x, 300);
    650      1.1  mrg   mpfr_set_str (x, "0xf.ffffffffffffffffffffffffffffffffffffffffffffffffffff"
    651      1.1  mrg                 "fffffffffffffffff", 16, MPFR_RNDN);
    652      1.1  mrg   check_sprintf ("0x1p+4 [300]", "%.0RNa [300]", x);
    653      1.1  mrg   check_sprintf ("0xfp+0 [300]", "%.0RZa [300]", x);
    654      1.1  mrg   check_sprintf ("0x1p+4 [300]", "%.0RYa [300]", x);
    655      1.1  mrg   check_sprintf ("0xfp+0 [300]", "%.0RDa [300]", x);
    656      1.1  mrg   check_sprintf ("0x1p+4 [300]", "%.0RUa [300]", x);
    657      1.1  mrg   check_sprintf ("0x1.0000000000000000000000000000000000000000p+4",
    658      1.1  mrg                  "%.40RNa", x);
    659      1.1  mrg   check_sprintf ("0xf.ffffffffffffffffffffffffffffffffffffffffp+0",
    660      1.1  mrg                  "%.40RZa", x);
    661      1.1  mrg   check_sprintf ("0x1.0000000000000000000000000000000000000000p+4",
    662      1.1  mrg                  "%.40RYa", x);
    663      1.1  mrg   check_sprintf ("0xf.ffffffffffffffffffffffffffffffffffffffffp+0",
    664      1.1  mrg                  "%.40RDa", x);
    665      1.1  mrg   check_sprintf ("0x1.0000000000000000000000000000000000000000p+4",
    666      1.1  mrg                  "%.40RUa", x);
    667      1.1  mrg 
    668      1.1  mrg   mpfr_set_str (x, "0xf.7fffffffffffffffffffffffffffffffffffffffffffffffffff"
    669      1.1  mrg                 "ffffffffffffffffff", 16, MPFR_RNDN);
    670      1.1  mrg   check_sprintf ("0XFP+0", "%.0RNA", x);
    671      1.1  mrg   check_sprintf ("0XFP+0", "%.0RZA", x);
    672      1.1  mrg   check_sprintf ("0X1P+4", "%.0RYA", x);
    673      1.1  mrg   check_sprintf ("0XFP+0", "%.0RDA", x);
    674      1.1  mrg   check_sprintf ("0X1P+4", "%.0RUA", x);
    675      1.1  mrg   check_sprintf ("0XF.8P+0", "%.1RNA", x);
    676      1.1  mrg   check_sprintf ("0XF.7P+0", "%.1RZA", x);
    677      1.1  mrg   check_sprintf ("0XF.8P+0", "%.1RYA", x);
    678      1.1  mrg   check_sprintf ("0XF.7P+0", "%.1RDA", x);
    679      1.1  mrg   check_sprintf ("0XF.8P+0", "%.1RUA", x);
    680      1.1  mrg 
    681      1.1  mrg   /* do not round up to the next power of the base */
    682      1.1  mrg   mpfr_set_str (x, "0xf.fffffffffffffffffffffffffffffffffffffeffffffffffffff"
    683      1.1  mrg                 "ffffffffffffffffff", 16, MPFR_RNDN);
    684      1.1  mrg   check_sprintf ("0xf.ffffffffffffffffffffffffffffffffffffff00p+0",
    685      1.1  mrg                  "%.40RNa", x);
    686      1.1  mrg   check_sprintf ("0xf.fffffffffffffffffffffffffffffffffffffeffp+0",
    687      1.1  mrg                  "%.40RZa", x);
    688      1.1  mrg   check_sprintf ("0xf.ffffffffffffffffffffffffffffffffffffff00p+0",
    689      1.1  mrg                  "%.40RYa", x);
    690      1.1  mrg   check_sprintf ("0xf.fffffffffffffffffffffffffffffffffffffeffp+0",
    691      1.1  mrg                  "%.40RDa", x);
    692      1.1  mrg   check_sprintf ("0xf.ffffffffffffffffffffffffffffffffffffff00p+0",
    693      1.1  mrg                  "%.40RUa", x);
    694      1.1  mrg 
    695      1.1  mrg   mpfr_clears (x, z, (mpfr_ptr) 0);
    696      1.1  mrg   return 0;
    697      1.1  mrg }
    698      1.1  mrg 
    699      1.1  mrg static int
    700      1.1  mrg binary (void)
    701      1.1  mrg {
    702      1.1  mrg   mpfr_t x;
    703      1.1  mrg   mpfr_t z;
    704      1.1  mrg   mpfr_inits2 (64, x, z, (mpfr_ptr) 0);
    705      1.1  mrg 
    706      1.1  mrg   /* special */
    707      1.1  mrg   mpfr_set_inf (x, 1);
    708      1.1  mrg   check_sprintf (pinf_str, "%Rb", x);
    709      1.1  mrg 
    710      1.1  mrg   mpfr_set_inf (x, -1);
    711      1.1  mrg   check_sprintf (minf_str, "%Rb", x);
    712      1.1  mrg 
    713      1.1  mrg   mpfr_set_nan (x);
    714      1.1  mrg   check_sprintf (nan_str, "%Rb", x);
    715      1.1  mrg 
    716      1.1  mrg   /* regular numbers */
    717      1.1  mrg   mpfr_set_str (x, "1110010101.1001101", 2, MPFR_RNDN);
    718      1.1  mrg   mpfr_set_ui (z, 0, MPFR_RNDN);
    719      1.1  mrg 
    720      1.1  mrg   /* simplest case: right justified */
    721      1.1  mrg   check_sprintf ("    1.1100101011001101p+9", "%25Rb", x);
    722      1.1  mrg   check_sprintf ("                     0p+0", "%25Rb", z);
    723      1.1  mrg   /* sign or space, pad with leading zeros */
    724      1.1  mrg   check_sprintf (" 0001.1100101011001101p+9", "% 025Rb", x);
    725      1.1  mrg   check_sprintf (" 000000000000000000000p+0", "% 025Rb", z);
    726      1.1  mrg   /* sign + or -, left 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 */
    730      1.1  mrg   check_sprintf (" 1.110p+9",  "% .3RNb", x);
    731      1.1  mrg   check_sprintf (" 1.1101p+9", "% .4RNb", x);
    732      1.1  mrg   check_sprintf (" 0.0000p+0", "% .4RNb", z);
    733      1.1  mrg   /* sign + or -, decimal point, pad with leading zeros */
    734      1.1  mrg   check_sprintf ("+00001.1p+9", "%0+#11.1RZb", x);
    735      1.1  mrg   check_sprintf ("+0001.0p+10", "%0+#11.1RNb", x);
    736      1.1  mrg   check_sprintf ("+000000.p+0", "%0+#11.0RNb", z);
    737      1.1  mrg   /* pad with leading zero */
    738      1.1  mrg   check_sprintf ("00001.1100101011001101p+9", "%025RDb", x);
    739      1.1  mrg   /* sign or space, decimal point (unused), left justified */
    740      1.1  mrg   check_sprintf (" 1.1p+9    ", "%- #11.1RDb", x);
    741      1.1  mrg   check_sprintf (" 1.p+9     ", "%- #11.0RDb", x);
    742      1.1  mrg   check_sprintf (" 1.p+10    ", "%- #11.0RUb", x);
    743      1.1  mrg   check_sprintf (" 1.p+9     ", "%- #11.0RZb", x);
    744      1.1  mrg   check_sprintf (" 1.p+10    ", "%- #11.0RYb", x);
    745      1.1  mrg   check_sprintf (" 1.p+10    ", "%- #11.0RNb", x);
    746      1.1  mrg 
    747      1.1  mrg   mpfr_mul_si (x, x, -1, MPFR_RNDD);
    748      1.1  mrg   mpfr_mul_si (z, z, -1, MPFR_RNDD);
    749      1.1  mrg 
    750      1.1  mrg   /* sign + or - */
    751      1.1  mrg   check_sprintf ("   -1.1p+9", "%+10.1RUb", x);
    752      1.1  mrg   check_sprintf ("   -0.0p+0", "%+10.1RUb", z);
    753      1.1  mrg 
    754      1.1  mrg   /* precision 0 */
    755      1.1  mrg   check_sprintf ("-1p+10", "%.0RNb", x);
    756      1.1  mrg   check_sprintf ("-1p+10", "%.0RDb", x);
    757      1.1  mrg   check_sprintf ("-1p+9",  "%.0RUb", x);
    758      1.1  mrg   check_sprintf ("-1p+9",  "%.0RZb", x);
    759      1.1  mrg   check_sprintf ("-1p+10", "%.0RYb", x);
    760      1.1  mrg   /* round to next base power */
    761      1.1  mrg   check_sprintf ("-1.0p+10", "%.1RNb", x);
    762      1.1  mrg   check_sprintf ("-1.0p+10", "%.1RDb", x);
    763      1.1  mrg   check_sprintf ("-1.0p+10", "%.1RYb", x);
    764      1.1  mrg   /* do not round to next base power */
    765      1.1  mrg   check_sprintf ("-1.1p+9", "%.1RUb", x);
    766      1.1  mrg   check_sprintf ("-1.1p+9", "%.1RZb", x);
    767      1.1  mrg   /* rounding bit is zero */
    768      1.1  mrg   check_sprintf ("-1.11p+9", "%.2RNb", x);
    769      1.1  mrg   /* tie case in round to nearest mode */
    770      1.1  mrg   check_sprintf ("-1.1100101011001101p+9", "%.16RNb", x);
    771      1.1  mrg   /* trailing zeros in fractional part */
    772      1.1  mrg   check_sprintf ("-1.110010101100110100000000000000p+9", "%.30RNb", x);
    773      1.1  mrg 
    774      1.1  mrg   mpfr_clears (x, z, (mpfr_ptr) 0);
    775      1.1  mrg   return 0;
    776      1.1  mrg }
    777      1.1  mrg 
    778      1.1  mrg static int
    779      1.1  mrg mixed (void)
    780      1.1  mrg {
    781      1.1  mrg   int n1;
    782      1.1  mrg   int n2;
    783      1.1  mrg   int i = 121;
    784  1.1.1.2  mrg #ifndef NPRINTF_L
    785      1.1  mrg   long double d = 1. / 31.;
    786  1.1.1.2  mrg #endif
    787      1.1  mrg   mpf_t mpf;
    788      1.1  mrg   mpq_t mpq;
    789      1.1  mrg   mpz_t mpz;
    790      1.1  mrg   mpfr_t x;
    791      1.1  mrg   mpfr_rnd_t rnd;
    792      1.1  mrg 
    793      1.1  mrg   mpf_init (mpf);
    794      1.1  mrg   mpf_set_ui (mpf, 40);
    795      1.1  mrg   mpf_div_ui (mpf, mpf, 31); /* mpf = 40.0 / 31.0 */
    796      1.1  mrg   mpq_init (mpq);
    797      1.1  mrg   mpq_set_ui (mpq, 123456, 4567890);
    798      1.1  mrg   mpz_init (mpz);
    799      1.1  mrg   mpz_fib_ui (mpz, 64);
    800      1.1  mrg   mpfr_init (x);
    801      1.1  mrg   mpfr_set_str (x, "-12345678.875", 10, MPFR_RNDN);
    802      1.1  mrg   rnd = MPFR_RNDD;
    803      1.1  mrg 
    804      1.1  mrg   check_vsprintf ("121%", "%i%%", i);
    805      1.1  mrg   check_vsprintf ("121% -1.2345678875E+07", "%i%% %RNE", i, x);
    806      1.1  mrg   check_vsprintf ("121, -12345679", "%i, %.0Rf", i, x);
    807      1.1  mrg   check_vsprintf ("10610209857723, -1.2345678875e+07", "%Zi, %R*e", mpz, rnd,
    808      1.1  mrg                   x);
    809      1.1  mrg   check_vsprintf ("-12345678.9, 121", "%.1Rf, %i", x, i);
    810      1.1  mrg   check_vsprintf ("-12345678, 1e240/45b352", "%.0R*f, %Qx", MPFR_RNDZ, x, mpq);
    811      1.1  mrg   n1 = check_vsprintf ("121, -12345678.875000000000, 1.290323", "%i, %.*Rf, %Ff%n",
    812      1.1  mrg                        i, 12, x, mpf, &n2);
    813      1.1  mrg   if (n1 != n2)
    814      1.1  mrg     {
    815      1.1  mrg       printf ("error in number of characters written by mpfr_vsprintf\n");
    816      1.1  mrg       printf ("expected: %d\n", n2);
    817      1.1  mrg       printf ("     got: %d\n", n1);
    818      1.1  mrg       exit (1);
    819      1.1  mrg     }
    820      1.1  mrg 
    821      1.1  mrg #ifndef NPRINTF_L
    822      1.1  mrg   check_vsprintf ("00000010610209857723, -1.2345678875e+07, 0.032258",
    823      1.1  mrg                   "%.*Zi, %R*e, %Lf", 20, mpz, rnd, x, d);
    824      1.1  mrg #endif
    825      1.1  mrg 
    826      1.1  mrg   mpf_clear (mpf);
    827      1.1  mrg   mpq_clear (mpq);
    828      1.1  mrg   mpz_clear (mpz);
    829      1.1  mrg   mpfr_clear (x);
    830      1.1  mrg   return 0;
    831      1.1  mrg }
    832      1.1  mrg 
    833      1.1  mrg /* Check with locale "da_DK". On most platforms, decimal point is ','
    834      1.1  mrg    and thousands separator is '.'; the test is not performed if this
    835      1.1  mrg    is not the case or if the locale doesn't exist. */
    836      1.1  mrg static int
    837      1.1  mrg locale_da_DK (void)
    838      1.1  mrg {
    839      1.1  mrg   mpfr_prec_t p = 128;
    840      1.1  mrg   mpfr_t x;
    841      1.1  mrg 
    842      1.1  mrg   if (setlocale (LC_ALL, "da_DK") == 0 ||
    843      1.1  mrg       localeconv()->decimal_point[0] != ',' ||
    844      1.1  mrg       localeconv()->thousands_sep[0] != '.')
    845      1.1  mrg     return 0;
    846      1.1  mrg 
    847      1.1  mrg   mpfr_init2 (x, p);
    848      1.1  mrg 
    849      1.1  mrg   /* positive numbers */
    850      1.1  mrg   mpfr_set_str (x, "18993474.61279296875", 10, MPFR_RNDN);
    851      1.1  mrg 
    852      1.1  mrg   /* simplest case right justified with thousands separator */
    853      1.1  mrg   check_sprintf ("      1,899347461279296875e+07", "%'30Re", x);
    854      1.1  mrg   check_sprintf ("                   1,89935e+07", "%'30Rg", x);
    855      1.1  mrg   check_sprintf ("        18.993.474,61279296875", "%'30.19Rg", x);
    856      1.1  mrg   check_sprintf ("             18.993.474,612793", "%'30Rf", x);
    857      1.1  mrg 
    858      1.1  mrg   /* sign or space, pad, thousands separator with leading zeros */
    859      1.1  mrg   check_sprintf (" 000001,899347461279296875E+07", "%' 030RE", x);
    860      1.1  mrg   check_sprintf (" 0000000000000000001,89935E+07", "%' 030RG", x);
    861      1.1  mrg   check_sprintf (" 000000018.993.474,61279296875", "%' 030.19RG", x);
    862      1.1  mrg   check_sprintf (" 00000000000018.993.474,612793", "%' 030RF", x);
    863      1.1  mrg 
    864      1.1  mrg   mpfr_set_ui (x, 50, MPFR_RNDN);
    865      1.1  mrg   mpfr_exp10 (x, x, MPFR_RNDN);
    866      1.1  mrg   check_sprintf ("100000000000000000000000000000000000000000000000000", "%.0Rf",
    867      1.1  mrg                  x);
    868      1.1  mrg   check_sprintf
    869      1.1  mrg     ("100.000.000.000.000.000.000.000.000.000.000.000.000.000.000.000.000,",
    870      1.1  mrg      "%'#.0Rf", x);
    871      1.1  mrg   check_sprintf
    872      1.1  mrg     ("100.000.000.000.000.000.000.000.000.000.000.000.000.000.000.000.000,0000",
    873      1.1  mrg      "%'.4Rf", x);
    874      1.1  mrg 
    875      1.1  mrg   mpfr_clear (x);
    876      1.1  mrg   return 0;
    877      1.1  mrg }
    878      1.1  mrg 
    879      1.1  mrg /* check concordance between mpfr_asprintf result with a regular mpfr float
    880      1.1  mrg    and with a regular double float */
    881      1.1  mrg static int
    882      1.1  mrg random_double (void)
    883      1.1  mrg {
    884      1.1  mrg   mpfr_t x; /* random regular mpfr float */
    885      1.1  mrg   double y; /* regular double float (equal to x) */
    886      1.1  mrg 
    887      1.1  mrg   char flag[] =
    888      1.1  mrg     {
    889      1.1  mrg       '-',
    890      1.1  mrg       '+',
    891      1.1  mrg       ' ',
    892      1.1  mrg       '#',
    893      1.1  mrg       '0', /* no ambiguity: first zeros are flag zero*/
    894      1.1  mrg       '\''
    895      1.1  mrg     };
    896      1.1  mrg   /* no 'a': mpfr and glibc do not have the same semantic */
    897      1.1  mrg   char specifier[] =
    898      1.1  mrg     {
    899      1.1  mrg       'e',
    900      1.1  mrg       'f',
    901      1.1  mrg       'g',
    902      1.1  mrg       'E',
    903      1.1  mrg       'f', /* SUSv2 doesn't accept %F, but %F and %f are the same for
    904      1.1  mrg               regular numbers */
    905      1.1  mrg       'G',
    906      1.1  mrg     };
    907      1.1  mrg   int spec; /* random index in specifier[] */
    908      1.1  mrg   int prec; /* random value for precision field */
    909      1.1  mrg 
    910      1.1  mrg   /* in the format string for mpfr_t variable, the maximum length is
    911      1.1  mrg      reached by something like "%-+ #0'.*Rf", that is 12 characters. */
    912      1.1  mrg #define FMT_MPFR_SIZE 12
    913      1.1  mrg   char fmt_mpfr[FMT_MPFR_SIZE];
    914      1.1  mrg   char *ptr_mpfr;
    915      1.1  mrg 
    916      1.1  mrg   /* in the format string for double variable, the maximum length is
    917      1.1  mrg      reached by something like "%-+ #0'.*f", that is 11 characters. */
    918      1.1  mrg #define FMT_SIZE 11
    919      1.1  mrg   char fmt[FMT_SIZE];
    920      1.1  mrg   char *ptr;
    921      1.1  mrg 
    922      1.1  mrg   int xi;
    923      1.1  mrg   char *xs;
    924      1.1  mrg   int yi;
    925      1.1  mrg   char *ys;
    926      1.1  mrg 
    927      1.1  mrg   int i, j, jmax;
    928      1.1  mrg 
    929      1.1  mrg   mpfr_init2 (x, MPFR_LDBL_MANT_DIG);
    930      1.1  mrg 
    931      1.1  mrg   for (i = 0; i < 1000; ++i)
    932      1.1  mrg     {
    933      1.1  mrg       /* 1. random double */
    934      1.1  mrg       do
    935      1.1  mrg         {
    936      1.1  mrg           y = DBL_RAND ();
    937      1.1  mrg         }
    938      1.1  mrg #ifdef HAVE_DENORMS
    939      1.1  mrg       while (0);
    940      1.1  mrg #else
    941      1.1  mrg       while (ABS(y) < DBL_MIN);
    942      1.1  mrg #endif
    943      1.1  mrg 
    944      1.1  mrg       if (randlimb () % 2 == 0)
    945      1.1  mrg         y = -y;
    946      1.1  mrg 
    947      1.1  mrg       mpfr_set_d (x, y, MPFR_RNDN);
    948      1.1  mrg       if (y != mpfr_get_d (x, MPFR_RNDN))
    949      1.1  mrg         /* conversion error: skip this one */
    950      1.1  mrg         continue;
    951      1.1  mrg 
    952      1.1  mrg       /* 2. build random format strings fmt_mpfr and fmt */
    953      1.1  mrg       ptr_mpfr = fmt_mpfr;
    954      1.1  mrg       ptr = fmt;
    955      1.1  mrg       *ptr_mpfr++ = *ptr++ = '%';
    956      1.1  mrg       /* random specifier 'e', 'f', 'g', 'E', 'F', or 'G' */
    957      1.1  mrg       spec = (int) (randlimb() % 6);
    958      1.1  mrg       /* random flags, but no ' flag with %e */
    959      1.1  mrg       jmax = (spec == 0 || spec == 3) ? 5 : 6;
    960      1.1  mrg       for (j = 0; j < jmax; j++)
    961      1.1  mrg         {
    962      1.1  mrg           if (randlimb() % 3 == 0)
    963      1.1  mrg             *ptr_mpfr++ = *ptr++ = flag[j];
    964      1.1  mrg         }
    965      1.1  mrg       *ptr_mpfr++ = *ptr++ = '.';
    966      1.1  mrg       *ptr_mpfr++ = *ptr++ = '*';
    967      1.1  mrg       *ptr_mpfr++ = 'R';
    968      1.1  mrg       *ptr_mpfr++ = *ptr++ = specifier[spec];
    969      1.1  mrg       *ptr_mpfr = *ptr = '\0';
    970      1.1  mrg       MPFR_ASSERTN (ptr - fmt < FMT_SIZE);
    971      1.1  mrg       MPFR_ASSERTN (ptr_mpfr - fmt_mpfr < FMT_MPFR_SIZE);
    972      1.1  mrg 
    973      1.1  mrg       /* advantage small precision */
    974      1.1  mrg       if (randlimb() % 2 == 0)
    975      1.1  mrg         prec = (int) (randlimb() % 10);
    976      1.1  mrg       else
    977      1.1  mrg         prec = (int) (randlimb() % prec_max_printf);
    978      1.1  mrg 
    979      1.1  mrg       /* 3. calls and checks */
    980      1.1  mrg       /* the double float case is handled by the libc asprintf through
    981      1.1  mrg          gmp_asprintf */
    982      1.1  mrg       xi = mpfr_asprintf (&xs, fmt_mpfr, prec, x);
    983      1.1  mrg       yi = mpfr_asprintf (&ys, fmt, prec, y);
    984      1.1  mrg 
    985      1.1  mrg       /* test if XS and YS differ, beware that ISO C99 doesn't specify
    986      1.1  mrg          the sign of a zero exponent (the C99 rationale says: "The sign
    987      1.1  mrg          of a zero exponent in %e format is unspecified.  The committee
    988      1.1  mrg          knows of different implementations and choose not to require
    989      1.1  mrg          implementations to document their behaviour in this case
    990      1.1  mrg          (by making this be implementation defined behaviour).  Most
    991      1.1  mrg          implementations use a "+" sign, e.g., 1.2e+00; but there is at
    992      1.1  mrg          least one implementation that uses the sign of the unlimited
    993      1.1  mrg          precision result, e.g., the 0.987 would be 9.87e-01, so could
    994      1.1  mrg          end up as 1e-00 after rounding to one digit of precision."),
    995      1.1  mrg          while mpfr always uses '+' */
    996      1.1  mrg       if (xi != yi
    997      1.1  mrg           || ((strcmp (xs, ys) != 0)
    998      1.1  mrg               && (spec == 1 || spec == 4
    999      1.1  mrg                   || ((strstr (xs, "e+00") == NULL
   1000      1.1  mrg                        || strstr (ys, "e-00") == NULL)
   1001      1.1  mrg                       && (strstr (xs, "E+00") == NULL
   1002      1.1  mrg                           || strstr (ys, "E-00") == NULL)))))
   1003      1.1  mrg         {
   1004      1.1  mrg           mpfr_printf ("Error in mpfr_asprintf(\"%s\", %d, %Re)\n",
   1005      1.1  mrg                        fmt_mpfr, prec, x);
   1006      1.1  mrg           printf ("expected: %s\n", ys);
   1007      1.1  mrg           printf ("     got: %s\n", xs);
   1008      1.1  mrg           printf ("xi=%d yi=%d spec=%d\n", xi, yi, spec);
   1009      1.1  mrg 
   1010      1.1  mrg           exit (1);
   1011      1.1  mrg         }
   1012      1.1  mrg 
   1013      1.1  mrg       mpfr_free_str (xs);
   1014      1.1  mrg       mpfr_free_str (ys);
   1015      1.1  mrg     }
   1016      1.1  mrg 
   1017      1.1  mrg   mpfr_clear (x);
   1018      1.1  mrg   return 0;
   1019      1.1  mrg }
   1020      1.1  mrg 
   1021      1.1  mrg static void
   1022      1.1  mrg bug20080610 (void)
   1023      1.1  mrg {
   1024      1.1  mrg   /* bug on icc found on June 10, 2008 */
   1025      1.1  mrg   /* this is not a bug but a different implementation choice: ISO C99 doesn't
   1026      1.1  mrg      specify the sign of a zero exponent (see note in random_double above). */
   1027      1.1  mrg   mpfr_t x;
   1028      1.1  mrg   double y;
   1029      1.1  mrg   int xi;
   1030      1.1  mrg   char *xs;
   1031      1.1  mrg   int yi;
   1032      1.1  mrg   char *ys;
   1033      1.1  mrg 
   1034      1.1  mrg   mpfr_init2 (x, MPFR_LDBL_MANT_DIG);
   1035      1.1  mrg 
   1036      1.1  mrg   y = -9.95645044213728791504536275169812142849e-01;
   1037      1.1  mrg   mpfr_set_d (x, y, MPFR_RNDN);
   1038      1.1  mrg 
   1039      1.1  mrg   xi = mpfr_asprintf (&xs, "%- #0.*Re", 1, x);
   1040      1.1  mrg   yi = mpfr_asprintf (&ys, "%- #0.*e", 1, y);
   1041      1.1  mrg 
   1042      1.1  mrg   if (xi != yi || strcmp (xs, ys) != 0)
   1043      1.1  mrg     {
   1044      1.1  mrg       printf ("Error in bug20080610\n");
   1045      1.1  mrg       printf ("expected: %s\n", ys);
   1046      1.1  mrg       printf ("     got: %s\n", xs);
   1047      1.1  mrg       printf ("xi=%d yi=%d\n", xi, yi);
   1048      1.1  mrg 
   1049      1.1  mrg       exit (1);
   1050      1.1  mrg     }
   1051      1.1  mrg 
   1052      1.1  mrg   mpfr_free_str (xs);
   1053      1.1  mrg   mpfr_free_str (ys);
   1054      1.1  mrg   mpfr_clear (x);
   1055      1.1  mrg }
   1056      1.1  mrg 
   1057      1.1  mrg static void
   1058      1.1  mrg bug20081214 (void)
   1059      1.1  mrg {
   1060      1.1  mrg  /* problem with glibc 2.3.6, December 14, 2008:
   1061      1.1  mrg     the system asprintf outputs "-1.0" instead of "-1.". */
   1062      1.1  mrg   mpfr_t x;
   1063      1.1  mrg   double y;
   1064      1.1  mrg   int xi;
   1065      1.1  mrg   char *xs;
   1066      1.1  mrg   int yi;
   1067      1.1  mrg   char *ys;
   1068      1.1  mrg 
   1069      1.1  mrg   mpfr_init2 (x, MPFR_LDBL_MANT_DIG);
   1070      1.1  mrg 
   1071      1.1  mrg   y = -9.90597761233942053494e-01;
   1072      1.1  mrg   mpfr_set_d (x, y, MPFR_RNDN);
   1073      1.1  mrg 
   1074      1.1  mrg   xi = mpfr_asprintf (&xs, "%- #0.*RG", 1, x);
   1075      1.1  mrg   yi = mpfr_asprintf (&ys, "%- #0.*G", 1, y);
   1076      1.1  mrg 
   1077      1.1  mrg   if (xi != yi || strcmp (xs, ys) != 0)
   1078      1.1  mrg     {
   1079      1.1  mrg       mpfr_printf ("Error in bug20081214\n"
   1080      1.1  mrg                    "mpfr_asprintf(\"%- #0.*Re\", 1, %Re)\n", x);
   1081      1.1  mrg       printf ("expected: %s\n", ys);
   1082      1.1  mrg       printf ("     got: %s\n", xs);
   1083      1.1  mrg       printf ("xi=%d yi=%d\n", xi, yi);
   1084      1.1  mrg 
   1085      1.1  mrg       exit (1);
   1086      1.1  mrg     }
   1087      1.1  mrg 
   1088      1.1  mrg   mpfr_free_str (xs);
   1089      1.1  mrg   mpfr_free_str (ys);
   1090      1.1  mrg   mpfr_clear (x);
   1091      1.1  mrg }
   1092      1.1  mrg 
   1093  1.1.1.2  mrg static void
   1094  1.1.1.2  mrg bug20111102 (void)
   1095  1.1.1.2  mrg {
   1096  1.1.1.2  mrg   mpfr_t t;
   1097  1.1.1.2  mrg   char s[100];
   1098  1.1.1.2  mrg 
   1099  1.1.1.2  mrg   mpfr_init2 (t, 84);
   1100  1.1.1.2  mrg   mpfr_set_str (t, "999.99999999999999999999", 10, MPFR_RNDN);
   1101  1.1.1.2  mrg   mpfr_sprintf (s, "%.20RNg", t);
   1102  1.1.1.2  mrg   if (strcmp (s, "1000") != 0)
   1103  1.1.1.2  mrg     {
   1104  1.1.1.2  mrg       printf ("Error in bug20111102, expected 1000, got %s\n", s);
   1105  1.1.1.2  mrg       exit (1);
   1106  1.1.1.2  mrg     }
   1107  1.1.1.2  mrg   mpfr_clear (t);
   1108  1.1.1.2  mrg }
   1109  1.1.1.2  mrg 
   1110      1.1  mrg /* In particular, the following test makes sure that the rounding
   1111      1.1  mrg  * for %Ra and %Rb is not done on the MPFR number itself (as it
   1112      1.1  mrg  * would overflow). Note: it has been reported on comp.std.c that
   1113      1.1  mrg  * some C libraries behave differently on %a, but this is a bug.
   1114      1.1  mrg  */
   1115      1.1  mrg static void
   1116      1.1  mrg check_emax_aux (mpfr_exp_t e)
   1117      1.1  mrg {
   1118      1.1  mrg   mpfr_t x;
   1119      1.1  mrg   char *s1, s2[256];
   1120      1.1  mrg   int i;
   1121      1.1  mrg   mpfr_exp_t emax;
   1122      1.1  mrg 
   1123      1.1  mrg   MPFR_ASSERTN (e <= LONG_MAX);
   1124      1.1  mrg   emax = mpfr_get_emax ();
   1125      1.1  mrg   set_emax (e);
   1126      1.1  mrg 
   1127      1.1  mrg   mpfr_init2 (x, 16);
   1128      1.1  mrg 
   1129      1.1  mrg   mpfr_set_inf (x, 1);
   1130      1.1  mrg   mpfr_nextbelow (x);
   1131      1.1  mrg 
   1132      1.1  mrg   i = mpfr_asprintf (&s1, "%Ra %.2Ra", x, x);
   1133      1.1  mrg   MPFR_ASSERTN (i > 0);
   1134      1.1  mrg 
   1135      1.1  mrg   mpfr_snprintf (s2, 256, "0x7.fff8p+%ld 0x8.00p+%ld", e-3, e-3);
   1136      1.1  mrg 
   1137      1.1  mrg   if (strcmp (s1, s2) != 0)
   1138      1.1  mrg     {
   1139  1.1.1.2  mrg       printf ("Error in check_emax_aux for emax = ");
   1140  1.1.1.2  mrg       if (e > LONG_MAX)
   1141  1.1.1.2  mrg         printf ("(>LONG_MAX)\n");
   1142  1.1.1.2  mrg       else
   1143  1.1.1.2  mrg         printf ("%ld\n", (long) e);
   1144      1.1  mrg       printf ("Expected %s\n", s2);
   1145      1.1  mrg       printf ("Got      %s\n", s1);
   1146      1.1  mrg       exit (1);
   1147      1.1  mrg     }
   1148      1.1  mrg 
   1149      1.1  mrg   mpfr_free_str (s1);
   1150      1.1  mrg 
   1151      1.1  mrg   i = mpfr_asprintf (&s1, "%Rb %.2Rb", x, x);
   1152      1.1  mrg   MPFR_ASSERTN (i > 0);
   1153      1.1  mrg 
   1154      1.1  mrg   mpfr_snprintf (s2, 256, "1.111111111111111p+%ld 1.00p+%ld", e-1, e);
   1155      1.1  mrg 
   1156      1.1  mrg   if (strcmp (s1, s2) != 0)
   1157      1.1  mrg     {
   1158  1.1.1.2  mrg       printf ("Error in check_emax_aux for emax = ");
   1159  1.1.1.2  mrg       if (e > LONG_MAX)
   1160  1.1.1.2  mrg         printf ("(>LONG_MAX)\n");
   1161  1.1.1.2  mrg       else
   1162  1.1.1.2  mrg         printf ("%ld\n", (long) e);
   1163      1.1  mrg       printf ("Expected %s\n", s2);
   1164      1.1  mrg       printf ("Got      %s\n", s1);
   1165      1.1  mrg       exit (1);
   1166      1.1  mrg     }
   1167      1.1  mrg 
   1168      1.1  mrg   mpfr_free_str (s1);
   1169      1.1  mrg 
   1170      1.1  mrg   mpfr_clear (x);
   1171      1.1  mrg   set_emax (emax);
   1172      1.1  mrg }
   1173      1.1  mrg 
   1174      1.1  mrg static void
   1175      1.1  mrg check_emax (void)
   1176      1.1  mrg {
   1177      1.1  mrg   check_emax_aux (15);
   1178      1.1  mrg   check_emax_aux (MPFR_EMAX_MAX);
   1179      1.1  mrg }
   1180      1.1  mrg 
   1181      1.1  mrg int
   1182      1.1  mrg main (int argc, char **argv)
   1183      1.1  mrg {
   1184      1.1  mrg   char *locale;
   1185      1.1  mrg 
   1186      1.1  mrg   tests_start_mpfr ();
   1187      1.1  mrg 
   1188      1.1  mrg #if defined(HAVE_LOCALE_H) && defined(HAVE_SETLOCALE)
   1189      1.1  mrg   /* currently, we just check with 'C' locale */
   1190      1.1  mrg   locale = setlocale (LC_ALL, "C");
   1191      1.1  mrg #endif
   1192      1.1  mrg 
   1193  1.1.1.2  mrg   bug20111102 ();
   1194      1.1  mrg   native_types ();
   1195      1.1  mrg   hexadecimal ();
   1196      1.1  mrg   binary ();
   1197      1.1  mrg   decimal ();
   1198      1.1  mrg   mixed ();
   1199      1.1  mrg   check_emax ();
   1200      1.1  mrg 
   1201      1.1  mrg #if defined(HAVE_LOCALE_H) && defined(HAVE_SETLOCALE)
   1202      1.1  mrg   locale_da_DK ();
   1203      1.1  mrg 
   1204      1.1  mrg   setlocale (LC_ALL, locale);
   1205      1.1  mrg #endif
   1206      1.1  mrg 
   1207      1.1  mrg   if (getenv ("MPFR_CHECK_LIBC_PRINTF"))
   1208      1.1  mrg     {
   1209      1.1  mrg       /* check against libc */
   1210      1.1  mrg       random_double ();
   1211      1.1  mrg       bug20081214 ();
   1212      1.1  mrg       bug20080610 ();
   1213      1.1  mrg     }
   1214      1.1  mrg 
   1215      1.1  mrg   tests_end_mpfr ();
   1216      1.1  mrg   return 0;
   1217      1.1  mrg }
   1218      1.1  mrg 
   1219      1.1  mrg #else  /* MPFR_VERSION */
   1220      1.1  mrg 
   1221      1.1  mrg int
   1222      1.1  mrg main (void)
   1223      1.1  mrg {
   1224      1.1  mrg   printf ("Warning! Test disabled for this MPFR version.\n");
   1225      1.1  mrg   return 0;
   1226      1.1  mrg }
   1227      1.1  mrg 
   1228      1.1  mrg #endif  /* MPFR_VERSION */
   1229      1.1  mrg 
   1230      1.1  mrg #else  /* HAVE_STDARG */
   1231      1.1  mrg 
   1232      1.1  mrg int
   1233      1.1  mrg main (void)
   1234      1.1  mrg {
   1235      1.1  mrg   /* We have nothing to test. */
   1236  1.1.1.2  mrg   return 77;
   1237      1.1  mrg }
   1238      1.1  mrg 
   1239      1.1  mrg #endif  /* HAVE_STDARG */
   1240