Home | History | Annotate | Line # | Download | only in examples
version.c revision 1.1.1.3.2.1
      1          1.1       mrg /*
      2          1.1       mrg  * Output various information about GMP and MPFR.
      3          1.1       mrg  */
      4          1.1       mrg 
      5          1.1       mrg /*
      6  1.1.1.3.2.1  pgoyette Copyright 2010-2018 Free Software Foundation, Inc.
      7      1.1.1.3       mrg Contributed by the AriC and Caramba projects, INRIA.
      8          1.1       mrg 
      9          1.1       mrg This file is part of the GNU MPFR Library.
     10          1.1       mrg 
     11          1.1       mrg The GNU MPFR Library is free software; you can redistribute it and/or modify
     12          1.1       mrg it under the terms of the GNU Lesser General Public License as published by
     13          1.1       mrg the Free Software Foundation; either version 3 of the License, or (at your
     14          1.1       mrg option) any later version.
     15          1.1       mrg 
     16          1.1       mrg The GNU MPFR Library is distributed in the hope that it will be useful, but
     17          1.1       mrg WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
     18          1.1       mrg or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public
     19          1.1       mrg License for more details.
     20          1.1       mrg 
     21          1.1       mrg You should have received a copy of the GNU Lesser General Public License
     22          1.1       mrg along with the GNU MPFR Library; see the file COPYING.LESSER.  If not, see
     23          1.1       mrg http://www.gnu.org/licenses/ or write to the Free Software Foundation, Inc.,
     24          1.1       mrg 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.
     25          1.1       mrg */
     26          1.1       mrg 
     27          1.1       mrg #include <stdio.h>
     28          1.1       mrg #include <limits.h>
     29          1.1       mrg #include <gmp.h>
     30          1.1       mrg #include <mpfr.h>
     31          1.1       mrg 
     32          1.1       mrg /* The following failure can occur if GMP has been rebuilt with
     33          1.1       mrg  * a different ABI, e.g.
     34          1.1       mrg  *   1. GMP built with ABI=mode32.
     35          1.1       mrg  *   2. MPFR built against this GMP version.
     36          1.1       mrg  *   3. GMP rebuilt with ABI=32.
     37          1.1       mrg  */
     38          1.1       mrg static void failure_test (void)
     39          1.1       mrg {
     40          1.1       mrg   mpfr_t x;
     41          1.1       mrg 
     42          1.1       mrg   mpfr_init2 (x, 128);
     43      1.1.1.2       mrg   mpfr_set_str (x, "17", 0, MPFR_RNDN);
     44          1.1       mrg   if (mpfr_cmp_ui (x, 17) != 0)
     45          1.1       mrg     printf ("\nFailure in mpfr_set_str! Probably an unmatched ABI!\n");
     46          1.1       mrg   mpfr_clear (x);
     47          1.1       mrg }
     48          1.1       mrg 
     49      1.1.1.3       mrg static void patches (void)
     50      1.1.1.3       mrg {
     51      1.1.1.3       mrg   const char *p = mpfr_get_patches ();
     52      1.1.1.3       mrg   printf ("MPFR patches: %s\n", p[0] ? p : "[none]");
     53      1.1.1.3       mrg }
     54      1.1.1.3       mrg 
     55      1.1.1.3       mrg #define STRINGIZE(S) #S
     56      1.1.1.3       mrg #define MAKE_STR(S) STRINGIZE(S)
     57      1.1.1.3       mrg 
     58      1.1.1.3       mrg #define SIGNED_STR(V) ((V) < 0 ? "signed" : "unsigned")
     59      1.1.1.3       mrg #define SIGNED(I) SIGNED_STR((I) - (I) - 1)
     60      1.1.1.3       mrg 
     61          1.1       mrg int main (void)
     62          1.1       mrg {
     63          1.1       mrg   unsigned long c;
     64      1.1.1.3       mrg   mp_limb_t t[4];
     65      1.1.1.3       mrg   int i;
     66      1.1.1.3       mrg 
     67      1.1.1.3       mrg   /* Casts are for C++ compilers. */
     68      1.1.1.3       mrg   for (i = 0; i < (int) (sizeof (t) / sizeof (mp_limb_t)); i++)
     69      1.1.1.3       mrg     t[i] = (mp_limb_t) -1;
     70      1.1.1.3       mrg 
     71      1.1.1.3       mrg   /**************** Information about the C implementation ****************/
     72      1.1.1.3       mrg 
     73      1.1.1.3       mrg   /* This is useful, as this can affect the behavior of MPFR. */
     74      1.1.1.3       mrg 
     75      1.1.1.3       mrg #define COMP "Compiler: "
     76      1.1.1.3       mrg #ifdef __INTEL_COMPILER
     77      1.1.1.3       mrg # ifdef __VERSION__
     78      1.1.1.3       mrg #  define ICCV " [" __VERSION__ "]"
     79      1.1.1.3       mrg # else
     80      1.1.1.3       mrg #  define ICCV ""
     81      1.1.1.3       mrg # endif
     82      1.1.1.3       mrg   printf (COMP "ICC %d.%d.%d" ICCV "\n", __INTEL_COMPILER / 100,
     83      1.1.1.3       mrg           __INTEL_COMPILER % 100, __INTEL_COMPILER_UPDATE);
     84      1.1.1.3       mrg #elif (defined(__GNUC__) || defined(__clang__)) && defined(__VERSION__)
     85      1.1.1.3       mrg # ifdef __clang__
     86      1.1.1.3       mrg #  define COMP2 COMP
     87      1.1.1.3       mrg # else
     88      1.1.1.3       mrg #  define COMP2 COMP "GCC "
     89      1.1.1.3       mrg # endif
     90      1.1.1.3       mrg   printf (COMP2 "%s\n", __VERSION__);
     91      1.1.1.3       mrg #endif
     92          1.1       mrg 
     93      1.1.1.3       mrg #if defined(__STDC__) || defined(__STDC_VERSION__)
     94      1.1.1.3       mrg   printf ("C/C++: __STDC__ = "
     95      1.1.1.3       mrg #if defined(__STDC__)
     96      1.1.1.3       mrg           MAKE_STR(__STDC__)
     97      1.1.1.3       mrg #else
     98      1.1.1.3       mrg           "undef"
     99      1.1.1.3       mrg #endif
    100      1.1.1.3       mrg           ", __STDC_VERSION__ = "
    101      1.1.1.3       mrg #if defined(__STDC_VERSION__)
    102      1.1.1.3       mrg           MAKE_STR(__STDC_VERSION__)
    103      1.1.1.3       mrg #else
    104      1.1.1.3       mrg           "undef"
    105      1.1.1.3       mrg #endif
    106          1.1       mrg #if defined(__cplusplus)
    107      1.1.1.3       mrg           ", C++"
    108      1.1.1.3       mrg #endif
    109      1.1.1.3       mrg           "\n");
    110          1.1       mrg #endif
    111          1.1       mrg 
    112      1.1.1.3       mrg #if defined(__GNUC__)
    113      1.1.1.3       mrg   printf ("GNU compatibility: __GNUC__ = " MAKE_STR(__GNUC__)
    114      1.1.1.3       mrg           ", __GNUC_MINOR__ = "
    115      1.1.1.3       mrg #if defined(__GNUC_MINOR__)
    116      1.1.1.3       mrg           MAKE_STR(__GNUC_MINOR__)
    117      1.1.1.3       mrg #else
    118      1.1.1.3       mrg           "undef"
    119      1.1.1.3       mrg #endif
    120      1.1.1.3       mrg           "\n");
    121      1.1.1.3       mrg #endif
    122      1.1.1.3       mrg 
    123      1.1.1.3       mrg #if defined(__ICC) || defined(__INTEL_COMPILER)
    124      1.1.1.3       mrg   printf ("Intel compiler: __ICC = "
    125      1.1.1.3       mrg #if defined(__ICC)
    126      1.1.1.3       mrg           MAKE_STR(__ICC)
    127      1.1.1.3       mrg #else
    128      1.1.1.3       mrg           "undef"
    129      1.1.1.3       mrg #endif
    130      1.1.1.3       mrg           ", __INTEL_COMPILER = "
    131      1.1.1.3       mrg #if defined(__INTEL_COMPILER)
    132      1.1.1.3       mrg           MAKE_STR(__INTEL_COMPILER)
    133      1.1.1.3       mrg #else
    134      1.1.1.3       mrg           "undef"
    135      1.1.1.3       mrg #endif
    136      1.1.1.3       mrg           "\n");
    137      1.1.1.3       mrg #endif
    138      1.1.1.3       mrg 
    139      1.1.1.3       mrg #if defined(_WIN32) || defined(_MSC_VER)
    140      1.1.1.3       mrg   printf ("MS Windows: _WIN32 = "
    141      1.1.1.3       mrg #if defined(_WIN32)
    142      1.1.1.3       mrg           MAKE_STR(_WIN32)
    143      1.1.1.3       mrg #else
    144      1.1.1.3       mrg           "undef"
    145      1.1.1.3       mrg #endif
    146      1.1.1.3       mrg           ", _MSC_VER = "
    147      1.1.1.3       mrg #if defined(_MSC_VER)
    148      1.1.1.3       mrg           MAKE_STR(_MSC_VER)
    149      1.1.1.3       mrg #else
    150      1.1.1.3       mrg           "undef"
    151      1.1.1.3       mrg #endif
    152      1.1.1.3       mrg           "\n");
    153      1.1.1.3       mrg #endif
    154      1.1.1.3       mrg 
    155      1.1.1.3       mrg #if defined(__GLIBC__)
    156      1.1.1.3       mrg   printf ("GNU C library: __GLIBC__ = " MAKE_STR(__GLIBC__)
    157      1.1.1.3       mrg           ", __GLIBC_MINOR__ = "
    158      1.1.1.3       mrg #if defined(__GLIBC_MINOR__)
    159      1.1.1.3       mrg           MAKE_STR(__GLIBC_MINOR__)
    160      1.1.1.3       mrg #else
    161      1.1.1.3       mrg           "undef"
    162      1.1.1.3       mrg #endif
    163      1.1.1.3       mrg           "\n");
    164      1.1.1.3       mrg #endif
    165      1.1.1.3       mrg 
    166      1.1.1.3       mrg   printf ("\n");
    167      1.1.1.3       mrg 
    168      1.1.1.3       mrg   /************************************************************************/
    169      1.1.1.3       mrg 
    170      1.1.1.3       mrg #if defined(__MPIR_VERSION)
    171      1.1.1.3       mrg   printf ("MPIR ....  Library: %-12s  Header: %d.%d.%d\n",
    172      1.1.1.3       mrg           mpir_version, __MPIR_VERSION, __MPIR_VERSION_MINOR,
    173      1.1.1.3       mrg           __MPIR_VERSION_PATCHLEVEL);
    174      1.1.1.3       mrg #else
    175          1.1       mrg   printf ("GMP .....  Library: %-12s  Header: %d.%d.%d\n",
    176          1.1       mrg           gmp_version, __GNU_MP_VERSION, __GNU_MP_VERSION_MINOR,
    177          1.1       mrg           __GNU_MP_VERSION_PATCHLEVEL);
    178      1.1.1.3       mrg #endif
    179          1.1       mrg 
    180          1.1       mrg   printf ("MPFR ....  Library: %-12s  Header: %s (based on %d.%d.%d)\n",
    181          1.1       mrg           mpfr_get_version (), MPFR_VERSION_STRING, MPFR_VERSION_MAJOR,
    182          1.1       mrg           MPFR_VERSION_MINOR, MPFR_VERSION_PATCHLEVEL);
    183      1.1.1.2       mrg 
    184  1.1.1.3.2.1  pgoyette   printf ("MPFR features: TLS = %s", mpfr_buildopt_tls_p () ? "yes" : "no");
    185  1.1.1.3.2.1  pgoyette #if MPFR_VERSION_MAJOR >= 4
    186  1.1.1.3.2.1  pgoyette   printf (", float128 = %s", mpfr_buildopt_float128_p () ? "yes" : "no");
    187  1.1.1.3.2.1  pgoyette #endif
    188  1.1.1.3.2.1  pgoyette   printf (", decimal = %s", mpfr_buildopt_decimal_p () ? "yes" : "no");
    189      1.1.1.3       mrg #if MPFR_VERSION_MAJOR > 3 || MPFR_VERSION_MINOR >= 1
    190      1.1.1.2       mrg   printf (", GMP internals = %s\nMPFR tuning: %s",
    191      1.1.1.2       mrg           mpfr_buildopt_gmpinternals_p () ? "yes" : "no",
    192      1.1.1.2       mrg           mpfr_buildopt_tune_case ());
    193      1.1.1.3       mrg #endif  /* 3.1 */
    194      1.1.1.2       mrg   printf ("\n");
    195      1.1.1.2       mrg 
    196      1.1.1.3       mrg   patches ();
    197          1.1       mrg 
    198      1.1.1.3       mrg   printf ("\n");
    199          1.1       mrg #ifdef __GMP_CC
    200          1.1       mrg   printf ("__GMP_CC = \"%s\"\n", __GMP_CC);
    201          1.1       mrg #endif
    202          1.1       mrg #ifdef __GMP_CFLAGS
    203          1.1       mrg   printf ("__GMP_CFLAGS = \"%s\"\n", __GMP_CFLAGS);
    204          1.1       mrg #endif
    205          1.1       mrg   printf ("GMP_LIMB_BITS     = %d\n", (int) GMP_LIMB_BITS);
    206          1.1       mrg   printf ("GMP_NAIL_BITS     = %d\n", (int) GMP_NAIL_BITS);
    207          1.1       mrg   printf ("GMP_NUMB_BITS     = %d\n", (int) GMP_NUMB_BITS);
    208          1.1       mrg   printf ("mp_bits_per_limb  = %d\n", (int) mp_bits_per_limb);
    209          1.1       mrg   printf ("sizeof(mp_limb_t) = %d\n", (int) sizeof(mp_limb_t));
    210          1.1       mrg   if (mp_bits_per_limb != GMP_LIMB_BITS)
    211          1.1       mrg     printf ("Warning! mp_bits_per_limb != GMP_LIMB_BITS\n");
    212          1.1       mrg   if (GMP_LIMB_BITS != sizeof(mp_limb_t) * CHAR_BIT)
    213          1.1       mrg     printf ("Warning! GMP_LIMB_BITS != sizeof(mp_limb_t) * CHAR_BIT\n");
    214          1.1       mrg 
    215          1.1       mrg   c = mpn_popcount (t, 1);
    216          1.1       mrg   printf ("The GMP library expects %lu bits in a mp_limb_t.\n", c);
    217          1.1       mrg   if (c != GMP_LIMB_BITS)
    218          1.1       mrg     printf ("Warning! This is different from GMP_LIMB_BITS!\n"
    219          1.1       mrg             "Different ABI caused by a GMP library upgrade?\n");
    220          1.1       mrg 
    221      1.1.1.2       mrg   printf ("\n");
    222      1.1.1.3       mrg   printf ("sizeof(mpfr_prec_t) = %d (%s type)\n", (int) sizeof(mpfr_prec_t),
    223      1.1.1.3       mrg           SIGNED_STR((mpfr_prec_t) -1));
    224      1.1.1.3       mrg   printf ("sizeof(mpfr_exp_t)  = %d (%s type)\n", (int) sizeof(mpfr_exp_t),
    225      1.1.1.3       mrg           SIGNED_STR((mpfr_exp_t) -1));
    226      1.1.1.3       mrg #ifdef _MPFR_PREC_FORMAT
    227      1.1.1.3       mrg   printf ("_MPFR_PREC_FORMAT = %d\n", (int) _MPFR_PREC_FORMAT);
    228      1.1.1.2       mrg #endif
    229      1.1.1.3       mrg   /* Note: "long" is sufficient for all current _MPFR_PREC_FORMAT values
    230      1.1.1.3       mrg      (1, 2, 3). Thus we do not need to depend on ISO C99 or later. */
    231      1.1.1.3       mrg   printf ("MPFR_PREC_MIN = %ld (%s)\n", (long) MPFR_PREC_MIN,
    232      1.1.1.3       mrg           SIGNED (MPFR_PREC_MIN));
    233      1.1.1.3       mrg   printf ("MPFR_PREC_MAX = %ld (%s)\n", (long) MPFR_PREC_MAX,
    234      1.1.1.3       mrg           SIGNED (MPFR_PREC_MAX));
    235      1.1.1.3       mrg #ifdef _MPFR_EXP_FORMAT
    236      1.1.1.3       mrg   printf ("_MPFR_EXP_FORMAT = %d\n", (int) _MPFR_EXP_FORMAT);
    237      1.1.1.3       mrg #endif
    238      1.1.1.3       mrg   printf ("sizeof(mpfr_t) = %d\n", (int) sizeof(mpfr_t));
    239      1.1.1.3       mrg   printf ("sizeof(mpfr_ptr) = %d\n", (int) sizeof(mpfr_ptr));
    240          1.1       mrg   failure_test ();
    241          1.1       mrg 
    242          1.1       mrg   return 0;
    243          1.1       mrg }
    244