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