version.c revision 1.1.1.6 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