Home | History | Annotate | Line # | Download | only in examples
      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.6  mrg Copyright 2010-2023 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.1.5  mrg https://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.6  mrg #elif defined(__TINYC__)
     85  1.1.1.6  mrg   /* The format of __TINYC__ is not described, but libtcc.c defines it with
     86  1.1.1.6  mrg    *   sprintf(buffer, "%d", a*10000 + b*100 + c);
     87  1.1.1.6  mrg    *   tcc_define_symbol(s, "__TINYC__", buffer);
     88  1.1.1.6  mrg    */
     89  1.1.1.6  mrg   printf (COMP "TCC %d.%d.%d\n", (int) (__TINYC__ / 10000),
     90  1.1.1.6  mrg           (int) ((__TINYC__ / 100) % 100), (int) (__TINYC__ % 100));
     91  1.1.1.3  mrg #elif (defined(__GNUC__) || defined(__clang__)) && defined(__VERSION__)
     92  1.1.1.3  mrg # ifdef __clang__
     93  1.1.1.3  mrg #  define COMP2 COMP
     94  1.1.1.3  mrg # else
     95  1.1.1.3  mrg #  define COMP2 COMP "GCC "
     96  1.1.1.3  mrg # endif
     97  1.1.1.3  mrg   printf (COMP2 "%s\n", __VERSION__);
     98  1.1.1.3  mrg #endif
     99      1.1  mrg 
    100  1.1.1.3  mrg #if defined(__STDC__) || defined(__STDC_VERSION__)
    101  1.1.1.3  mrg   printf ("C/C++: __STDC__ = "
    102  1.1.1.3  mrg #if defined(__STDC__)
    103  1.1.1.3  mrg           MAKE_STR(__STDC__)
    104  1.1.1.3  mrg #else
    105  1.1.1.3  mrg           "undef"
    106  1.1.1.3  mrg #endif
    107  1.1.1.3  mrg           ", __STDC_VERSION__ = "
    108  1.1.1.3  mrg #if defined(__STDC_VERSION__)
    109  1.1.1.3  mrg           MAKE_STR(__STDC_VERSION__)
    110  1.1.1.3  mrg #else
    111  1.1.1.3  mrg           "undef"
    112  1.1.1.3  mrg #endif
    113      1.1  mrg #if defined(__cplusplus)
    114  1.1.1.3  mrg           ", C++"
    115  1.1.1.3  mrg #endif
    116  1.1.1.3  mrg           "\n");
    117      1.1  mrg #endif
    118      1.1  mrg 
    119  1.1.1.3  mrg #if defined(__GNUC__)
    120  1.1.1.3  mrg   printf ("GNU compatibility: __GNUC__ = " MAKE_STR(__GNUC__)
    121  1.1.1.3  mrg           ", __GNUC_MINOR__ = "
    122  1.1.1.3  mrg #if defined(__GNUC_MINOR__)
    123  1.1.1.3  mrg           MAKE_STR(__GNUC_MINOR__)
    124  1.1.1.3  mrg #else
    125  1.1.1.3  mrg           "undef"
    126  1.1.1.3  mrg #endif
    127  1.1.1.3  mrg           "\n");
    128  1.1.1.3  mrg #endif
    129  1.1.1.3  mrg 
    130  1.1.1.3  mrg #if defined(__ICC) || defined(__INTEL_COMPILER)
    131  1.1.1.3  mrg   printf ("Intel compiler: __ICC = "
    132  1.1.1.3  mrg #if defined(__ICC)
    133  1.1.1.3  mrg           MAKE_STR(__ICC)
    134  1.1.1.3  mrg #else
    135  1.1.1.3  mrg           "undef"
    136  1.1.1.3  mrg #endif
    137  1.1.1.3  mrg           ", __INTEL_COMPILER = "
    138  1.1.1.3  mrg #if defined(__INTEL_COMPILER)
    139  1.1.1.3  mrg           MAKE_STR(__INTEL_COMPILER)
    140  1.1.1.3  mrg #else
    141  1.1.1.3  mrg           "undef"
    142  1.1.1.3  mrg #endif
    143  1.1.1.3  mrg           "\n");
    144  1.1.1.3  mrg #endif
    145  1.1.1.3  mrg 
    146  1.1.1.3  mrg #if defined(_WIN32) || defined(_MSC_VER)
    147  1.1.1.3  mrg   printf ("MS Windows: _WIN32 = "
    148  1.1.1.3  mrg #if defined(_WIN32)
    149  1.1.1.3  mrg           MAKE_STR(_WIN32)
    150  1.1.1.3  mrg #else
    151  1.1.1.3  mrg           "undef"
    152  1.1.1.3  mrg #endif
    153  1.1.1.3  mrg           ", _MSC_VER = "
    154  1.1.1.3  mrg #if defined(_MSC_VER)
    155  1.1.1.3  mrg           MAKE_STR(_MSC_VER)
    156  1.1.1.3  mrg #else
    157  1.1.1.3  mrg           "undef"
    158  1.1.1.3  mrg #endif
    159  1.1.1.3  mrg           "\n");
    160  1.1.1.3  mrg #endif
    161  1.1.1.3  mrg 
    162  1.1.1.3  mrg #if defined(__GLIBC__)
    163  1.1.1.3  mrg   printf ("GNU C library: __GLIBC__ = " MAKE_STR(__GLIBC__)
    164  1.1.1.3  mrg           ", __GLIBC_MINOR__ = "
    165  1.1.1.3  mrg #if defined(__GLIBC_MINOR__)
    166  1.1.1.3  mrg           MAKE_STR(__GLIBC_MINOR__)
    167  1.1.1.3  mrg #else
    168  1.1.1.3  mrg           "undef"
    169  1.1.1.3  mrg #endif
    170  1.1.1.3  mrg           "\n");
    171  1.1.1.3  mrg #endif
    172  1.1.1.3  mrg 
    173  1.1.1.3  mrg   printf ("\n");
    174  1.1.1.3  mrg 
    175  1.1.1.3  mrg   /************************************************************************/
    176  1.1.1.3  mrg 
    177  1.1.1.3  mrg #if defined(__MPIR_VERSION)
    178  1.1.1.3  mrg   printf ("MPIR ....  Library: %-12s  Header: %d.%d.%d\n",
    179  1.1.1.3  mrg           mpir_version, __MPIR_VERSION, __MPIR_VERSION_MINOR,
    180  1.1.1.3  mrg           __MPIR_VERSION_PATCHLEVEL);
    181  1.1.1.3  mrg #else
    182      1.1  mrg   printf ("GMP .....  Library: %-12s  Header: %d.%d.%d\n",
    183      1.1  mrg           gmp_version, __GNU_MP_VERSION, __GNU_MP_VERSION_MINOR,
    184      1.1  mrg           __GNU_MP_VERSION_PATCHLEVEL);
    185  1.1.1.3  mrg #endif
    186      1.1  mrg 
    187      1.1  mrg   printf ("MPFR ....  Library: %-12s  Header: %s (based on %d.%d.%d)\n",
    188      1.1  mrg           mpfr_get_version (), MPFR_VERSION_STRING, MPFR_VERSION_MAJOR,
    189      1.1  mrg           MPFR_VERSION_MINOR, MPFR_VERSION_PATCHLEVEL);
    190  1.1.1.2  mrg 
    191  1.1.1.4  mrg   printf ("MPFR features: TLS = %s", mpfr_buildopt_tls_p () ? "yes" : "no");
    192  1.1.1.4  mrg #if MPFR_VERSION_MAJOR >= 4
    193  1.1.1.4  mrg   printf (", float128 = %s", mpfr_buildopt_float128_p () ? "yes" : "no");
    194  1.1.1.4  mrg #endif
    195  1.1.1.4  mrg   printf (", decimal = %s", mpfr_buildopt_decimal_p () ? "yes" : "no");
    196  1.1.1.3  mrg #if MPFR_VERSION_MAJOR > 3 || MPFR_VERSION_MINOR >= 1
    197  1.1.1.2  mrg   printf (", GMP internals = %s\nMPFR tuning: %s",
    198  1.1.1.2  mrg           mpfr_buildopt_gmpinternals_p () ? "yes" : "no",
    199  1.1.1.2  mrg           mpfr_buildopt_tune_case ());
    200  1.1.1.3  mrg #endif  /* 3.1 */
    201  1.1.1.2  mrg   printf ("\n");
    202  1.1.1.2  mrg 
    203  1.1.1.3  mrg   patches ();
    204      1.1  mrg 
    205  1.1.1.3  mrg   printf ("\n");
    206      1.1  mrg #ifdef __GMP_CC
    207      1.1  mrg   printf ("__GMP_CC = \"%s\"\n", __GMP_CC);
    208      1.1  mrg #endif
    209      1.1  mrg #ifdef __GMP_CFLAGS
    210      1.1  mrg   printf ("__GMP_CFLAGS = \"%s\"\n", __GMP_CFLAGS);
    211      1.1  mrg #endif
    212      1.1  mrg   printf ("GMP_LIMB_BITS     = %d\n", (int) GMP_LIMB_BITS);
    213      1.1  mrg   printf ("GMP_NAIL_BITS     = %d\n", (int) GMP_NAIL_BITS);
    214      1.1  mrg   printf ("GMP_NUMB_BITS     = %d\n", (int) GMP_NUMB_BITS);
    215      1.1  mrg   printf ("mp_bits_per_limb  = %d\n", (int) mp_bits_per_limb);
    216      1.1  mrg   printf ("sizeof(mp_limb_t) = %d\n", (int) sizeof(mp_limb_t));
    217      1.1  mrg   if (mp_bits_per_limb != GMP_LIMB_BITS)
    218      1.1  mrg     printf ("Warning! mp_bits_per_limb != GMP_LIMB_BITS\n");
    219      1.1  mrg   if (GMP_LIMB_BITS != sizeof(mp_limb_t) * CHAR_BIT)
    220      1.1  mrg     printf ("Warning! GMP_LIMB_BITS != sizeof(mp_limb_t) * CHAR_BIT\n");
    221      1.1  mrg 
    222      1.1  mrg   c = mpn_popcount (t, 1);
    223      1.1  mrg   printf ("The GMP library expects %lu bits in a mp_limb_t.\n", c);
    224      1.1  mrg   if (c != GMP_LIMB_BITS)
    225      1.1  mrg     printf ("Warning! This is different from GMP_LIMB_BITS!\n"
    226      1.1  mrg             "Different ABI caused by a GMP library upgrade?\n");
    227      1.1  mrg 
    228  1.1.1.2  mrg   printf ("\n");
    229  1.1.1.3  mrg   printf ("sizeof(mpfr_prec_t) = %d (%s type)\n", (int) sizeof(mpfr_prec_t),
    230  1.1.1.3  mrg           SIGNED_STR((mpfr_prec_t) -1));
    231  1.1.1.3  mrg   printf ("sizeof(mpfr_exp_t)  = %d (%s type)\n", (int) sizeof(mpfr_exp_t),
    232  1.1.1.3  mrg           SIGNED_STR((mpfr_exp_t) -1));
    233  1.1.1.3  mrg #ifdef _MPFR_PREC_FORMAT
    234  1.1.1.3  mrg   printf ("_MPFR_PREC_FORMAT = %d\n", (int) _MPFR_PREC_FORMAT);
    235  1.1.1.2  mrg #endif
    236  1.1.1.3  mrg   /* Note: "long" is sufficient for all current _MPFR_PREC_FORMAT values
    237  1.1.1.3  mrg      (1, 2, 3). Thus we do not need to depend on ISO C99 or later. */
    238  1.1.1.3  mrg   printf ("MPFR_PREC_MIN = %ld (%s)\n", (long) MPFR_PREC_MIN,
    239  1.1.1.3  mrg           SIGNED (MPFR_PREC_MIN));
    240  1.1.1.3  mrg   printf ("MPFR_PREC_MAX = %ld (%s)\n", (long) MPFR_PREC_MAX,
    241  1.1.1.3  mrg           SIGNED (MPFR_PREC_MAX));
    242  1.1.1.3  mrg #ifdef _MPFR_EXP_FORMAT
    243  1.1.1.3  mrg   printf ("_MPFR_EXP_FORMAT = %d\n", (int) _MPFR_EXP_FORMAT);
    244  1.1.1.3  mrg #endif
    245  1.1.1.3  mrg   printf ("sizeof(mpfr_t) = %d\n", (int) sizeof(mpfr_t));
    246  1.1.1.3  mrg   printf ("sizeof(mpfr_ptr) = %d\n", (int) sizeof(mpfr_ptr));
    247      1.1  mrg   failure_test ();
    248      1.1  mrg 
    249  1.1.1.5  mrg   mpfr_free_cache ();
    250      1.1  mrg   return 0;
    251      1.1  mrg }
    252