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