tsprintf.c revision 1.1.1.6 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.6 mrg Copyright 2007-2023 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.1.5 mrg https://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.1.6 mrg /* Note: If you use a C99-compatible implementation and GMP (or MPIR)
25 1.1.1.6 mrg * has been compiled without HAVE_VSNPRINTF defined, then this test
26 1.1.1.6 mrg * may fail with an error like
27 1.1.1.6 mrg * repl-vsnprintf.c:389: GNU MP assertion failed: len < total_width
28 1.1.1.6 mrg *
29 1.1.1.6 mrg * The reason is that __gmp_replacement_vsnprintf does not support %a/%A,
30 1.1.1.6 mrg * even though the C library supports it.
31 1.1.1.6 mrg *
32 1.1.1.6 mrg * References:
33 1.1.1.6 mrg * https://sympa.inria.fr/sympa/arc/mpfr/2022-10/msg00001.html
34 1.1.1.6 mrg * https://sympa.inria.fr/sympa/arc/mpfr/2022-10/msg00027.html
35 1.1.1.6 mrg * https://gmplib.org/list-archives/gmp-bugs/2022-October/005200.html
36 1.1.1.6 mrg */
37 1.1.1.6 mrg
38 1.1.1.5 mrg /* Needed due to the tests on HAVE_STDARG and MPFR_USE_MINI_GMP */
39 1.1.1.4 mrg #ifdef HAVE_CONFIG_H
40 1.1.1.4 mrg # include "config.h"
41 1.1.1.4 mrg #endif
42 1.1.1.4 mrg
43 1.1.1.4 mrg #if defined(HAVE_STDARG) && !defined(MPFR_USE_MINI_GMP)
44 1.1 mrg #include <stdarg.h>
45 1.1 mrg
46 1.1 mrg #include <float.h>
47 1.1.1.5 mrg #include <errno.h>
48 1.1 mrg
49 1.1 mrg #ifdef HAVE_LOCALE_H
50 1.1 mrg #include <locale.h>
51 1.1 mrg #endif
52 1.1 mrg
53 1.1 mrg #include "mpfr-test.h"
54 1.1 mrg
55 1.1 mrg const int prec_max_printf = 5000; /* limit for random precision in
56 1.1 mrg random_double() */
57 1.1 mrg #define BUF_SIZE 65536
58 1.1 mrg
59 1.1 mrg const char pinf_str[] = "inf";
60 1.1 mrg const char pinf_uc_str[] = "INF";
61 1.1 mrg const char minf_str[] = "-inf";
62 1.1 mrg const char minf_uc_str[] = "-INF";
63 1.1 mrg const char nan_str[] = "nan";
64 1.1 mrg const char nan_uc_str[] = "NAN";
65 1.1 mrg
66 1.1.1.4 mrg int randsize;
67 1.1.1.4 mrg
68 1.1 mrg /* 1. compare expected string with the string BUFFER returned by
69 1.1 mrg mpfr_sprintf(buffer, fmt, x)
70 1.1 mrg 2. then test mpfr_snprintf (buffer, p, fmt, x) with a random p. */
71 1.1.1.6 mrg static void
72 1.1 mrg check_sprintf (const char *expected, const char *fmt, mpfr_srcptr x)
73 1.1 mrg {
74 1.1.1.4 mrg int n0, n1;
75 1.1 mrg char buffer[BUF_SIZE];
76 1.1 mrg
77 1.1 mrg /* test mpfr_sprintf */
78 1.1 mrg n0 = mpfr_sprintf (buffer, fmt, x);
79 1.1 mrg if (strcmp (buffer, expected) != 0)
80 1.1 mrg {
81 1.1 mrg printf ("Error in mpfr_sprintf (s, \"%s\", x);\n", fmt);
82 1.1 mrg printf ("expected: \"%s\"\ngot: \"%s\"\n", expected, buffer);
83 1.1 mrg
84 1.1 mrg exit (1);
85 1.1 mrg }
86 1.1 mrg
87 1.1 mrg /* test mpfr_snprintf */
88 1.1.1.4 mrg randsize = (int) (randlimb () % (n0 + 3)) - 3; /* between -3 and n0 - 1 */
89 1.1.1.4 mrg if (randsize < 0)
90 1.1 mrg {
91 1.1 mrg n1 = mpfr_snprintf (NULL, 0, fmt, x);
92 1.1 mrg }
93 1.1 mrg else
94 1.1 mrg {
95 1.1.1.4 mrg buffer[randsize] = 17;
96 1.1.1.4 mrg n1 = mpfr_snprintf (buffer, randsize, fmt, x);
97 1.1.1.4 mrg if (buffer[randsize] != 17)
98 1.1 mrg {
99 1.1.1.4 mrg printf ("Buffer overflow in mpfr_snprintf for randsize = %d!\n",
100 1.1.1.4 mrg randsize);
101 1.1 mrg exit (1);
102 1.1 mrg }
103 1.1 mrg }
104 1.1 mrg if (n0 != n1)
105 1.1 mrg {
106 1.1 mrg printf ("Error in mpfr_snprintf (s, %d, \"%s\", x) return value\n",
107 1.1.1.4 mrg randsize, fmt);
108 1.1.1.4 mrg printf ("expected: %d\ngot: %d\nx='", n0, n1);
109 1.1.1.4 mrg mpfr_printf (fmt, x);
110 1.1.1.4 mrg printf ("'\n");
111 1.1 mrg exit (1);
112 1.1 mrg }
113 1.1.1.4 mrg if ((randsize > 1 && strncmp (expected, buffer, randsize - 1) != 0)
114 1.1.1.4 mrg || (randsize == 1 && buffer[0] != '\0'))
115 1.1 mrg {
116 1.1 mrg char part_expected[BUF_SIZE];
117 1.1.1.4 mrg strncpy (part_expected, expected, randsize);
118 1.1.1.4 mrg part_expected[randsize - 1] = '\0';
119 1.1.1.4 mrg printf ("Error in mpfr_vsnprintf (s, %d, \"%s\", ...);\n",
120 1.1.1.4 mrg randsize, fmt);
121 1.1 mrg printf ("expected: \"%s\"\ngot: \"%s\"\n", part_expected, buffer);
122 1.1 mrg exit (1);
123 1.1 mrg }
124 1.1 mrg }
125 1.1 mrg
126 1.1 mrg /* 1. compare expected string with the string BUFFER returned by
127 1.1 mrg mpfr_vsprintf(buffer, fmt, ...)
128 1.1 mrg 2. then, test mpfr_vsnprintf. */
129 1.1 mrg static int
130 1.1 mrg check_vsprintf (const char *expected, const char *fmt, ...)
131 1.1 mrg {
132 1.1.1.4 mrg int n0, n1;
133 1.1 mrg char buffer[BUF_SIZE];
134 1.1 mrg va_list ap0, ap1;
135 1.1 mrg
136 1.1.1.4 mrg va_start (ap0, fmt);
137 1.1 mrg n0 = mpfr_vsprintf (buffer, fmt, ap0);
138 1.1.1.4 mrg va_end (ap0);
139 1.1.1.4 mrg
140 1.1 mrg if (strcmp (buffer, expected) != 0)
141 1.1 mrg {
142 1.1 mrg printf ("Error in mpfr_vsprintf (s, \"%s\", ...);\n", fmt);
143 1.1 mrg printf ("expected: \"%s\"\ngot: \"%s\"\n", expected, buffer);
144 1.1 mrg exit (1);
145 1.1 mrg }
146 1.1.1.4 mrg
147 1.1.1.4 mrg va_start (ap1, fmt);
148 1.1 mrg
149 1.1 mrg /* test mpfr_snprintf */
150 1.1.1.4 mrg randsize = (int) (randlimb () % (n0 + 3)) - 3; /* between -3 and n0 - 1 */
151 1.1.1.4 mrg if (randsize < 0)
152 1.1 mrg {
153 1.1 mrg n1 = mpfr_vsnprintf (NULL, 0, fmt, ap1);
154 1.1 mrg }
155 1.1 mrg else
156 1.1 mrg {
157 1.1.1.4 mrg buffer[randsize] = 17;
158 1.1.1.4 mrg n1 = mpfr_vsnprintf (buffer, randsize, fmt, ap1);
159 1.1.1.4 mrg if (buffer[randsize] != 17)
160 1.1 mrg {
161 1.1.1.4 mrg printf ("Buffer overflow in mpfr_vsnprintf for randsize = %d!\n",
162 1.1.1.4 mrg randsize);
163 1.1 mrg exit (1);
164 1.1 mrg }
165 1.1 mrg }
166 1.1.1.4 mrg
167 1.1.1.4 mrg va_end (ap1);
168 1.1.1.4 mrg
169 1.1 mrg if (n0 != n1)
170 1.1 mrg {
171 1.1 mrg printf ("Error in mpfr_vsnprintf (s, %d, \"%s\", ...) return value\n",
172 1.1.1.4 mrg randsize, fmt);
173 1.1 mrg printf ("expected: %d\ngot: %d\n", n0, n1);
174 1.1 mrg exit (1);
175 1.1 mrg }
176 1.1.1.4 mrg if ((randsize > 1 && strncmp (expected, buffer, randsize - 1) != 0)
177 1.1.1.4 mrg || (randsize == 1 && buffer[0] != '\0'))
178 1.1 mrg {
179 1.1 mrg char part_expected[BUF_SIZE];
180 1.1 mrg
181 1.1.1.4 mrg strncpy (part_expected, expected, randsize);
182 1.1.1.4 mrg part_expected[randsize - 1] = '\0';
183 1.1.1.4 mrg printf ("Error in mpfr_vsnprintf (s, %d, \"%s\", ...);\n",
184 1.1.1.4 mrg randsize, fmt);
185 1.1.1.4 mrg printf ("expected: \"%s\"\ngot: \"%s\"\n", part_expected, buffer);
186 1.1 mrg exit (1);
187 1.1 mrg }
188 1.1 mrg
189 1.1 mrg return n0;
190 1.1 mrg }
191 1.1 mrg
192 1.1 mrg static void
193 1.1 mrg native_types (void)
194 1.1 mrg {
195 1.1 mrg int c = 'a';
196 1.1 mrg int i = -1;
197 1.1 mrg unsigned int ui = 1;
198 1.1.1.6 mrg double d[] = { -1.25, 7.62939453125e-6 /* 2^(-17) */ };
199 1.1 mrg char s[] = "test";
200 1.1 mrg char buf[255];
201 1.1.1.6 mrg int k;
202 1.1 mrg
203 1.1 mrg sprintf (buf, "%c", c);
204 1.1 mrg check_vsprintf (buf, "%c", c);
205 1.1 mrg
206 1.1 mrg sprintf (buf, "%d", i);
207 1.1 mrg check_vsprintf (buf, "%d", i);
208 1.1 mrg
209 1.1.1.6 mrg check_vsprintf ("0", "%d", 0);
210 1.1.1.6 mrg check_vsprintf ("", "%.d", 0);
211 1.1.1.6 mrg check_vsprintf ("", "%.0d", 0);
212 1.1 mrg
213 1.1 mrg sprintf (buf, "%i", i);
214 1.1 mrg check_vsprintf (buf, "%i", i);
215 1.1 mrg
216 1.1.1.6 mrg check_vsprintf ("0", "%i", 0);
217 1.1.1.6 mrg check_vsprintf ("", "%.i", 0);
218 1.1.1.6 mrg check_vsprintf ("", "%.0i", 0);
219 1.1.1.6 mrg
220 1.1.1.6 mrg for (k = 0; k < numberof(d); k++)
221 1.1.1.6 mrg {
222 1.1.1.6 mrg sprintf (buf, "%e", d[k]);
223 1.1.1.6 mrg check_vsprintf (buf, "%e", d[k]);
224 1.1.1.6 mrg
225 1.1.1.6 mrg sprintf (buf, "%E", d[k]);
226 1.1.1.6 mrg check_vsprintf (buf, "%E", d[k]);
227 1.1.1.6 mrg
228 1.1.1.6 mrg sprintf (buf, "%f", d[k]);
229 1.1.1.6 mrg check_vsprintf (buf, "%f", d[k]);
230 1.1.1.6 mrg
231 1.1.1.6 mrg sprintf (buf, "%g", d[k]);
232 1.1.1.6 mrg check_vsprintf (buf, "%g", d[k]);
233 1.1.1.6 mrg
234 1.1.1.6 mrg sprintf (buf, "%G", d[k]);
235 1.1.1.6 mrg check_vsprintf (buf, "%G", d[k]);
236 1.1.1.6 mrg
237 1.1.1.6 mrg #if __MPFR_STDC (199901L)
238 1.1.1.6 mrg
239 1.1.1.6 mrg gmp_sprintf (buf, "%a", d[k]);
240 1.1.1.6 mrg check_vsprintf (buf, "%a", d[k]);
241 1.1.1.6 mrg
242 1.1.1.6 mrg gmp_sprintf (buf, "%A", d[k]);
243 1.1.1.6 mrg check_vsprintf (buf, "%A", d[k]);
244 1.1.1.6 mrg
245 1.1.1.6 mrg gmp_sprintf (buf, "%la", d[k]);
246 1.1.1.6 mrg check_vsprintf (buf, "%la", d[k]);
247 1.1.1.6 mrg
248 1.1.1.6 mrg gmp_sprintf (buf, "%lA", d[k]);
249 1.1.1.6 mrg check_vsprintf (buf, "%lA", d[k]);
250 1.1.1.6 mrg
251 1.1.1.6 mrg sprintf (buf, "%le", d[k]);
252 1.1.1.6 mrg check_vsprintf (buf, "%le", d[k]);
253 1.1.1.6 mrg
254 1.1.1.6 mrg sprintf (buf, "%lE", d[k]);
255 1.1.1.6 mrg check_vsprintf (buf, "%lE", d[k]);
256 1.1.1.6 mrg
257 1.1.1.6 mrg sprintf (buf, "%lf", d[k]);
258 1.1.1.6 mrg check_vsprintf (buf, "%lf", d[k]);
259 1.1.1.6 mrg
260 1.1.1.6 mrg sprintf (buf, "%lg", d[k]);
261 1.1.1.6 mrg check_vsprintf (buf, "%lg", d[k]);
262 1.1.1.6 mrg
263 1.1.1.6 mrg sprintf (buf, "%lG", d[k]);
264 1.1.1.6 mrg check_vsprintf (buf, "%lG", d[k]);
265 1.1.1.6 mrg
266 1.1.1.6 mrg #endif
267 1.1.1.6 mrg }
268 1.1 mrg
269 1.1 mrg sprintf (buf, "%o", i);
270 1.1 mrg check_vsprintf (buf, "%o", i);
271 1.1 mrg
272 1.1 mrg sprintf (buf, "%s", s);
273 1.1 mrg check_vsprintf (buf, "%s", s);
274 1.1 mrg
275 1.1 mrg sprintf (buf, "--%s++", "");
276 1.1 mrg check_vsprintf (buf, "--%s++", "");
277 1.1 mrg
278 1.1 mrg sprintf (buf, "%u", ui);
279 1.1 mrg check_vsprintf (buf, "%u", ui);
280 1.1 mrg
281 1.1 mrg sprintf (buf, "%x", ui);
282 1.1 mrg check_vsprintf (buf, "%x", ui);
283 1.1 mrg }
284 1.1 mrg
285 1.1.1.6 mrg static void
286 1.1 mrg decimal (void)
287 1.1 mrg {
288 1.1 mrg mpfr_prec_t p = 128;
289 1.1.1.5 mrg mpfr_t x, y, z;
290 1.1.1.5 mrg
291 1.1 mrg /* specifier 'P' for precision */
292 1.1 mrg check_vsprintf ("128", "%Pu", p);
293 1.1 mrg check_vsprintf ("00128", "%.5Pu", p);
294 1.1.1.5 mrg check_vsprintf (" 128", "%5Pu", p);
295 1.1.1.5 mrg check_vsprintf ("000128", "%06Pu", p);
296 1.1.1.5 mrg check_vsprintf ("128 :", "%-7Pu:", p);
297 1.1.1.5 mrg check_vsprintf ("000128:", "%-2.6Pd:", p);
298 1.1.1.5 mrg check_vsprintf (" 000128:", "%8.6Pd:", p);
299 1.1.1.5 mrg check_vsprintf ("000128 :", "%-8.6Pd:", p);
300 1.1.1.5 mrg check_vsprintf ("+128:", "%+Pd:", p);
301 1.1.1.5 mrg check_vsprintf (" 128:", "% Pd:", p);
302 1.1.1.5 mrg check_vsprintf ("80:", "% Px:", p);
303 1.1.1.5 mrg check_vsprintf ("0x80:", "% #Px:", p);
304 1.1.1.5 mrg check_vsprintf ("0x80:", "%0#+ -Px:", p);
305 1.1.1.5 mrg check_vsprintf ("0200:", "%0#+ -Po:", p);
306 1.1.1.5 mrg check_vsprintf ("+0000128 :", "%0+ *.*Pd:", -9, 7, p);
307 1.1.1.5 mrg check_vsprintf ("+12345 :", "%0+ -*.*Pd:", -9, -3, (mpfr_prec_t) 12345);
308 1.1.1.6 mrg check_vsprintf ("0", "%Pu", (mpfr_prec_t) 0);
309 1.1.1.5 mrg /* Do not add a test like "%05.1Pd" as MS Windows is buggy: when
310 1.1.1.5 mrg a precision is given, the '0' flag must be ignored. */
311 1.1 mrg
312 1.1.1.6 mrg /* specifier 'P' with precision field 0 */
313 1.1.1.6 mrg check_vsprintf ("128", "%.Pu", p);
314 1.1.1.6 mrg check_vsprintf ("128", "%.0Pd", p);
315 1.1.1.6 mrg check_vsprintf ("", "%.Pu", (mpfr_prec_t) 0);
316 1.1.1.6 mrg check_vsprintf ("", "%.0Pd", (mpfr_prec_t) 0);
317 1.1.1.6 mrg
318 1.1.1.6 mrg mpfr_init (z);
319 1.1.1.6 mrg mpfr_init2 (x, 128);
320 1.1.1.6 mrg
321 1.1 mrg /* special numbers */
322 1.1 mrg mpfr_set_inf (x, 1);
323 1.1 mrg check_sprintf (pinf_str, "%Re", x);
324 1.1 mrg check_sprintf (pinf_str, "%RUe", x);
325 1.1 mrg check_sprintf (pinf_uc_str, "%RE", x);
326 1.1 mrg check_sprintf (pinf_uc_str, "%RDE", x);
327 1.1 mrg check_sprintf (pinf_str, "%Rf", x);
328 1.1 mrg check_sprintf (pinf_str, "%RYf", x);
329 1.1 mrg check_sprintf (pinf_uc_str, "%RF", x);
330 1.1 mrg check_sprintf (pinf_uc_str, "%RZF", x);
331 1.1 mrg check_sprintf (pinf_str, "%Rg", x);
332 1.1 mrg check_sprintf (pinf_str, "%RNg", x);
333 1.1 mrg check_sprintf (pinf_uc_str, "%RG", x);
334 1.1 mrg check_sprintf (pinf_uc_str, "%RUG", x);
335 1.1 mrg check_sprintf (" inf", "%010Re", x);
336 1.1 mrg check_sprintf (" inf", "%010RDe", x);
337 1.1 mrg
338 1.1 mrg mpfr_set_inf (x, -1);
339 1.1 mrg check_sprintf (minf_str, "%Re", x);
340 1.1 mrg check_sprintf (minf_str, "%RYe", x);
341 1.1 mrg check_sprintf (minf_uc_str, "%RE", x);
342 1.1 mrg check_sprintf (minf_uc_str, "%RZE", x);
343 1.1 mrg check_sprintf (minf_str, "%Rf", x);
344 1.1 mrg check_sprintf (minf_str, "%RNf", x);
345 1.1 mrg check_sprintf (minf_uc_str, "%RF", x);
346 1.1 mrg check_sprintf (minf_uc_str, "%RUF", x);
347 1.1 mrg check_sprintf (minf_str, "%Rg", x);
348 1.1 mrg check_sprintf (minf_str, "%RDg", x);
349 1.1 mrg check_sprintf (minf_uc_str, "%RG", x);
350 1.1 mrg check_sprintf (minf_uc_str, "%RYG", x);
351 1.1 mrg check_sprintf (" -inf", "%010Re", x);
352 1.1 mrg check_sprintf (" -inf", "%010RZe", x);
353 1.1 mrg
354 1.1 mrg mpfr_set_nan (x);
355 1.1 mrg check_sprintf (nan_str, "%Re", x);
356 1.1 mrg check_sprintf (nan_str, "%RNe", x);
357 1.1 mrg check_sprintf (nan_uc_str, "%RE", x);
358 1.1 mrg check_sprintf (nan_uc_str, "%RUE", x);
359 1.1 mrg check_sprintf (nan_str, "%Rf", x);
360 1.1 mrg check_sprintf (nan_str, "%RDf", x);
361 1.1 mrg check_sprintf (nan_uc_str, "%RF", x);
362 1.1 mrg check_sprintf (nan_uc_str, "%RYF", x);
363 1.1 mrg check_sprintf (nan_str, "%Rg", x);
364 1.1 mrg check_sprintf (nan_str, "%RZg", x);
365 1.1 mrg check_sprintf (nan_uc_str, "%RG", x);
366 1.1 mrg check_sprintf (nan_uc_str, "%RNG", x);
367 1.1 mrg check_sprintf (" nan", "%010Re", x);
368 1.1 mrg
369 1.1 mrg /* positive numbers */
370 1.1 mrg mpfr_set_str (x, "18993474.61279296875", 10, MPFR_RNDN);
371 1.1.1.5 mrg mpfr_init2 (y, 59);
372 1.1.1.5 mrg mpfr_set (y, x, MPFR_RNDN);
373 1.1 mrg mpfr_set_ui (z, 0, MPFR_RNDD);
374 1.1 mrg
375 1.1 mrg /* simplest case right justified */
376 1.1.1.5 mrg check_sprintf ("1.899347461279296875000000000000000000000e+07", "%30Re", x);
377 1.1.1.5 mrg check_sprintf (" 1.899347461279296875e+07", "%30Re", y);
378 1.1 mrg check_sprintf (" 2e+07", "%30.0Re", x);
379 1.1 mrg check_sprintf (" 18993474.612793", "%30Rf", x);
380 1.1 mrg check_sprintf (" 18993474.6127930", "%30.7Rf", x);
381 1.1 mrg check_sprintf (" 1.89935e+07", "%30Rg", x);
382 1.1 mrg check_sprintf (" 2e+07", "%30.0Rg", x);
383 1.1 mrg check_sprintf (" 18993474.61279296875", "%30.19Rg", x);
384 1.1.1.5 mrg check_sprintf (" 0.0000000000000000e+00", "%30Re", z);
385 1.1.1.5 mrg check_sprintf (" 0.000000", "%30Rf", z);
386 1.1.1.5 mrg check_sprintf (" 0", "%30Rg", z);
387 1.1.1.5 mrg check_sprintf (" 0.00000", "%#30Rg", z);
388 1.1 mrg check_sprintf (" 0e+00", "%30.0Re", z);
389 1.1 mrg check_sprintf (" 0", "%30.0Rf", z);
390 1.1 mrg check_sprintf (" 0.0000", "%30.4Rf", z);
391 1.1 mrg check_sprintf (" 0", "%30.0Rg", z);
392 1.1 mrg check_sprintf (" 0", "%30.4Rg", z);
393 1.1 mrg /* sign or space, pad with leading zeros */
394 1.1.1.5 mrg check_sprintf (" 1.899347461279296875000000000000000000000E+07", "% 030RE", x);
395 1.1.1.5 mrg check_sprintf (" 000001.899347461279296875E+07", "% 030RE", y);
396 1.1 mrg check_sprintf (" 0000000000000000001.89935E+07", "% 030RG", x);
397 1.1 mrg check_sprintf (" 0000000000000000000000002E+07", "% 030.0RE", x);
398 1.1 mrg check_sprintf (" 0000000000000000000000000E+00", "% 030.0RE", z);
399 1.1 mrg check_sprintf (" 00000000000000000000000000000", "% 030.0RF", z);
400 1.1 mrg /* sign + or -, left justified */
401 1.1.1.5 mrg check_sprintf ("+1.899347461279296875000000000000000000000e+07", "%+-30Re", x);
402 1.1.1.5 mrg check_sprintf ("+1.899347461279296875e+07 ", "%+-30Re", y);
403 1.1 mrg check_sprintf ("+2e+07 ", "%+-30.0Re", x);
404 1.1 mrg check_sprintf ("+0e+00 ", "%+-30.0Re", z);
405 1.1 mrg check_sprintf ("+0 ", "%+-30.0Rf", z);
406 1.1 mrg /* decimal point, left justified, precision and rounding parameter */
407 1.1 mrg check_vsprintf ("1.9E+07 ", "%#-10.*R*E", 1, MPFR_RNDN, x);
408 1.1 mrg check_vsprintf ("2.E+07 ", "%#*.*R*E", -10, 0, MPFR_RNDN, x);
409 1.1 mrg check_vsprintf ("2.E+07 ", "%#-10.*R*G", 0, MPFR_RNDN, x);
410 1.1 mrg check_vsprintf ("0.E+00 ", "%#-10.*R*E", 0, MPFR_RNDN, z);
411 1.1 mrg check_vsprintf ("0. ", "%#-10.*R*F", 0, MPFR_RNDN, z);
412 1.1 mrg check_vsprintf ("0. ", "%#-10.*R*G", 0, MPFR_RNDN, z);
413 1.1 mrg /* sign or space */
414 1.1 mrg check_sprintf (" 1.899e+07", "% .3RNe", x);
415 1.1 mrg check_sprintf (" 2e+07", "% .0RNe", x);
416 1.1 mrg /* sign + or -, decimal point, pad with leading zeros */
417 1.1 mrg check_sprintf ("+0001.8E+07", "%0+#11.1RZE", x);
418 1.1 mrg check_sprintf ("+00001.E+07", "%0+#11.0RZE", x);
419 1.1 mrg check_sprintf ("+0000.0E+00", "%0+#11.1RZE", z);
420 1.1 mrg check_sprintf ("+00000000.0", "%0+#11.1RZF", z);
421 1.1 mrg /* pad with leading zero */
422 1.1.1.5 mrg check_sprintf ("1.899347461279296875000000000000000000000e+07", "%030RDe", x);
423 1.1.1.5 mrg check_sprintf ("0000001.899347461279296875e+07", "%030RDe", y);
424 1.1 mrg check_sprintf ("00000000000000000000000001e+07", "%030.0RDe", x);
425 1.1 mrg /* sign or space, decimal point, left justified */
426 1.1 mrg check_sprintf (" 1.8E+07 ", "%- #11.1RDE", x);
427 1.1 mrg check_sprintf (" 1.E+07 ", "%- #11.0RDE", x);
428 1.1.1.4 mrg /* large requested precision */
429 1.1.1.4 mrg check_sprintf ("18993474.61279296875", "%.2147483647Rg", x);
430 1.1 mrg
431 1.1 mrg /* negative numbers */
432 1.1 mrg mpfr_mul_si (x, x, -1, MPFR_RNDD);
433 1.1 mrg mpfr_mul_si (z, z, -1, MPFR_RNDD);
434 1.1 mrg
435 1.1 mrg /* sign + or - */
436 1.1 mrg check_sprintf (" -1.8e+07", "%+10.1RUe", x);
437 1.1 mrg check_sprintf (" -1e+07", "%+10.0RUe", x);
438 1.1 mrg check_sprintf (" -0e+00", "%+10.0RUe", z);
439 1.1 mrg check_sprintf (" -0", "%+10.0RUf", z);
440 1.1 mrg
441 1.1 mrg /* neighborhood of 1 */
442 1.1 mrg mpfr_set_str (x, "0.99993896484375", 10, MPFR_RNDN);
443 1.1.1.5 mrg mpfr_set_prec (y, 43);
444 1.1.1.5 mrg mpfr_set (y, x, MPFR_RNDN);
445 1.1.1.5 mrg check_sprintf ("9.999389648437500000000000000000000000000E-01", "%-20RE", x);
446 1.1.1.5 mrg check_sprintf ("9.9993896484375E-01 ", "%-20RE", y);
447 1.1.1.6 mrg check_sprintf ("1E+00 ", "%-20.RE", x);
448 1.1.1.6 mrg check_sprintf ("1E+00 ", "%-20.RE", y);
449 1.1 mrg check_sprintf ("1E+00 ", "%-20.0RE", x);
450 1.1 mrg check_sprintf ("1.0E+00 ", "%-20.1RE", x);
451 1.1 mrg check_sprintf ("1.00E+00 ", "%-20.2RE", x);
452 1.1 mrg check_sprintf ("9.999E-01 ", "%-20.3RE", x);
453 1.1 mrg check_sprintf ("9.9994E-01 ", "%-20.4RE", x);
454 1.1 mrg check_sprintf ("0.999939 ", "%-20RF", x);
455 1.1.1.6 mrg check_sprintf ("1 ", "%-20.RF", x);
456 1.1 mrg check_sprintf ("1 ", "%-20.0RF", x);
457 1.1 mrg check_sprintf ("1.0 ", "%-20.1RF", x);
458 1.1 mrg check_sprintf ("1.00 ", "%-20.2RF", x);
459 1.1 mrg check_sprintf ("1.000 ", "%-20.3RF", x);
460 1.1 mrg check_sprintf ("0.9999 ", "%-20.4RF", x);
461 1.1 mrg check_sprintf ("0.999939 ", "%-#20RF", x);
462 1.1.1.6 mrg check_sprintf ("1. ", "%-#20.RF", x);
463 1.1 mrg check_sprintf ("1. ", "%-#20.0RF", x);
464 1.1 mrg check_sprintf ("1.0 ", "%-#20.1RF", x);
465 1.1 mrg check_sprintf ("1.00 ", "%-#20.2RF", x);
466 1.1 mrg check_sprintf ("1.000 ", "%-#20.3RF", x);
467 1.1 mrg check_sprintf ("0.9999 ", "%-#20.4RF", x);
468 1.1.1.6 mrg check_sprintf ("0.999939 ", "%-20RG", x);
469 1.1.1.6 mrg check_sprintf ("1 ", "%-20.RG", x);
470 1.1 mrg check_sprintf ("1 ", "%-20.0RG", x);
471 1.1 mrg check_sprintf ("1 ", "%-20.1RG", x);
472 1.1 mrg check_sprintf ("1 ", "%-20.2RG", x);
473 1.1 mrg check_sprintf ("1 ", "%-20.3RG", x);
474 1.1 mrg check_sprintf ("0.9999 ", "%-20.4RG", x);
475 1.1 mrg check_sprintf ("0.999939 ", "%-#20RG", x);
476 1.1.1.6 mrg check_sprintf ("1. ", "%-#20.RG", x);
477 1.1 mrg check_sprintf ("1. ", "%-#20.0RG", x);
478 1.1 mrg check_sprintf ("1. ", "%-#20.1RG", x);
479 1.1 mrg check_sprintf ("1.0 ", "%-#20.2RG", x);
480 1.1 mrg check_sprintf ("1.00 ", "%-#20.3RG", x);
481 1.1 mrg check_sprintf ("0.9999 ", "%-#20.4RG", x);
482 1.1 mrg
483 1.1.1.5 mrg /* powers of 10 */
484 1.1 mrg mpfr_set_str (x, "1e17", 10, MPFR_RNDN);
485 1.1.1.5 mrg check_sprintf ("1.000000000000000000000000000000000000000e+17", "%Re", x);
486 1.1 mrg check_sprintf ("1.000e+17", "%.3Re", x);
487 1.1.1.6 mrg check_sprintf ("100000000000000000", "%.Rf", x);
488 1.1 mrg check_sprintf ("100000000000000000", "%.0Rf", x);
489 1.1 mrg check_sprintf ("100000000000000000.0", "%.1Rf", x);
490 1.1 mrg check_sprintf ("100000000000000000.000000", "%'Rf", x);
491 1.1 mrg check_sprintf ("100000000000000000.0", "%'.1Rf", x);
492 1.1 mrg
493 1.1 mrg mpfr_ui_div (x, 1, x, MPFR_RNDN); /* x=1e-17 */
494 1.1.1.5 mrg check_sprintf ("1.000000000000000000000000000000000000000e-17", "%Re", x);
495 1.1 mrg check_sprintf ("0.000000", "%Rf", x);
496 1.1 mrg check_sprintf ("1e-17", "%Rg", x);
497 1.1 mrg check_sprintf ("0.0", "%.1RDf", x);
498 1.1 mrg check_sprintf ("0.0", "%.1RZf", x);
499 1.1 mrg check_sprintf ("0.1", "%.1RUf", x);
500 1.1 mrg check_sprintf ("0.1", "%.1RYf", x);
501 1.1 mrg check_sprintf ("0", "%.0RDf", x);
502 1.1 mrg check_sprintf ("0", "%.0RZf", x);
503 1.1 mrg check_sprintf ("1", "%.0RUf", x);
504 1.1 mrg check_sprintf ("1", "%.0RYf", x);
505 1.1 mrg
506 1.1.1.5 mrg /* powers of 10 with 'g' style */
507 1.1.1.2 mrg mpfr_set_str (x, "10", 10, MPFR_RNDN);
508 1.1.1.2 mrg check_sprintf ("10", "%Rg", x);
509 1.1.1.2 mrg check_sprintf ("1e+01", "%.0Rg", x);
510 1.1.1.2 mrg check_sprintf ("1e+01", "%.1Rg", x);
511 1.1.1.2 mrg check_sprintf ("10", "%.2Rg", x);
512 1.1.1.2 mrg
513 1.1.1.2 mrg mpfr_ui_div (x, 1, x, MPFR_RNDN);
514 1.1.1.2 mrg check_sprintf ("0.1", "%Rg", x);
515 1.1.1.2 mrg check_sprintf ("0.1", "%.0Rg", x);
516 1.1.1.2 mrg check_sprintf ("0.1", "%.1Rg", x);
517 1.1.1.2 mrg
518 1.1.1.2 mrg mpfr_set_str (x, "1000", 10, MPFR_RNDN);
519 1.1.1.2 mrg check_sprintf ("1000", "%Rg", x);
520 1.1.1.2 mrg check_sprintf ("1e+03", "%.0Rg", x);
521 1.1.1.2 mrg check_sprintf ("1e+03", "%.3Rg", x);
522 1.1.1.2 mrg check_sprintf ("1000", "%.4Rg", x);
523 1.1.1.5 mrg check_sprintf ("1e+03", "%.3Rg", x);
524 1.1.1.5 mrg check_sprintf ("1000", "%.4Rg", x);
525 1.1.1.5 mrg check_sprintf (" 1e+03", "%9.3Rg", x);
526 1.1.1.5 mrg check_sprintf (" 1000", "%9.4Rg", x);
527 1.1.1.5 mrg check_sprintf ("00001e+03", "%09.3Rg", x);
528 1.1.1.5 mrg check_sprintf ("000001000", "%09.4Rg", x);
529 1.1.1.2 mrg
530 1.1.1.2 mrg mpfr_ui_div (x, 1, x, MPFR_RNDN);
531 1.1.1.2 mrg check_sprintf ("0.001", "%Rg", x);
532 1.1.1.2 mrg check_sprintf ("0.001", "%.0Rg", x);
533 1.1.1.2 mrg check_sprintf ("0.001", "%.1Rg", x);
534 1.1.1.2 mrg
535 1.1.1.2 mrg mpfr_set_str (x, "100000", 10, MPFR_RNDN);
536 1.1.1.2 mrg check_sprintf ("100000", "%Rg", x);
537 1.1.1.2 mrg check_sprintf ("1e+05", "%.0Rg", x);
538 1.1.1.2 mrg check_sprintf ("1e+05", "%.5Rg", x);
539 1.1.1.2 mrg check_sprintf ("100000", "%.6Rg", x);
540 1.1.1.5 mrg check_sprintf (" 1e+05", "%17.5Rg", x);
541 1.1.1.5 mrg check_sprintf (" 100000", "%17.6Rg", x);
542 1.1.1.5 mrg check_sprintf ("0000000000001e+05", "%017.5Rg", x);
543 1.1.1.5 mrg check_sprintf ("00000000000100000", "%017.6Rg", x);
544 1.1.1.2 mrg
545 1.1.1.2 mrg mpfr_ui_div (x, 1, x, MPFR_RNDN);
546 1.1.1.2 mrg check_sprintf ("1e-05", "%Rg", x);
547 1.1.1.2 mrg check_sprintf ("1e-05", "%.0Rg", x);
548 1.1.1.2 mrg check_sprintf ("1e-05", "%.1Rg", x);
549 1.1.1.2 mrg
550 1.1 mrg /* check rounding mode */
551 1.1 mrg mpfr_set_str (x, "0.0076", 10, MPFR_RNDN);
552 1.1 mrg check_sprintf ("0.007", "%.3RDF", x);
553 1.1 mrg check_sprintf ("0.007", "%.3RZF", x);
554 1.1 mrg check_sprintf ("0.008", "%.3RF", x);
555 1.1 mrg check_sprintf ("0.008", "%.3RUF", x);
556 1.1 mrg check_sprintf ("0.008", "%.3RYF", x);
557 1.1 mrg check_vsprintf ("0.008", "%.3R*F", MPFR_RNDA, x);
558 1.1 mrg
559 1.1 mrg /* check limit between %f-style and %g-style */
560 1.1 mrg mpfr_set_str (x, "0.0000999", 10, MPFR_RNDN);
561 1.1 mrg check_sprintf ("0.0001", "%.0Rg", x);
562 1.1 mrg check_sprintf ("9e-05", "%.0RDg", x);
563 1.1 mrg check_sprintf ("0.0001", "%.1Rg", x);
564 1.1 mrg check_sprintf ("0.0001", "%.2Rg", x);
565 1.1 mrg check_sprintf ("9.99e-05", "%.3Rg", x);
566 1.1 mrg
567 1.1 mrg /* trailing zeros */
568 1.1 mrg mpfr_set_si_2exp (x, -1, -15, MPFR_RNDN); /* x=-2^-15 */
569 1.1 mrg check_sprintf ("-3.0517578125e-05", "%.30Rg", x);
570 1.1 mrg check_sprintf ("-3.051757812500000000000000000000e-05", "%.30Re", x);
571 1.1 mrg check_sprintf ("-3.05175781250000000000000000000e-05", "%#.30Rg", x);
572 1.1 mrg check_sprintf ("-0.000030517578125000000000000000", "%.30Rf", x);
573 1.1 mrg
574 1.1 mrg /* bug 20081023 */
575 1.1 mrg check_sprintf ("-3.0517578125e-05", "%.30Rg", x);
576 1.1 mrg mpfr_set_str (x, "1.9999", 10, MPFR_RNDN);
577 1.1 mrg check_sprintf ("1.999900 ", "%-#10.7RG", x);
578 1.1 mrg check_sprintf ("1.9999 ", "%-10.7RG", x);
579 1.1 mrg mpfr_set_ui (x, 1, MPFR_RNDN);
580 1.1.1.3 mrg check_sprintf ("1.", "%#.1Rg", x);
581 1.1.1.3 mrg check_sprintf ("1. ", "%-#5.1Rg", x);
582 1.1.1.3 mrg check_sprintf (" 1.0", "%#5.2Rg", x);
583 1.1 mrg check_sprintf ("1.00000000000000000000000000000", "%#.30Rg", x);
584 1.1 mrg check_sprintf ("1", "%.30Rg", x);
585 1.1 mrg mpfr_set_ui (x, 0, MPFR_RNDN);
586 1.1.1.3 mrg check_sprintf ("0.", "%#.1Rg", x);
587 1.1.1.3 mrg check_sprintf ("0. ", "%-#5.1Rg", x);
588 1.1.1.3 mrg check_sprintf (" 0.0", "%#5.2Rg", x);
589 1.1.1.3 mrg check_sprintf ("0.00000000000000000000000000000", "%#.30Rg", x);
590 1.1 mrg check_sprintf ("0", "%.30Rg", x);
591 1.1 mrg
592 1.1 mrg /* following tests with precision 53 bits */
593 1.1 mrg mpfr_set_prec (x, 53);
594 1.1 mrg
595 1.1 mrg /* Exponent zero has a plus sign */
596 1.1 mrg mpfr_set_str (x, "-9.95645044213728791504536275169812142849e-01", 10,
597 1.1 mrg MPFR_RNDN);
598 1.1 mrg check_sprintf ("-1.0e+00", "%- #0.1Re", x);
599 1.1 mrg
600 1.1 mrg /* Decimal point and no figure after it with '#' flag and 'G' style */
601 1.1 mrg mpfr_set_str (x, "-9.90597761233942053494e-01", 10, MPFR_RNDN);
602 1.1 mrg check_sprintf ("-1.", "%- #0.1RG", x);
603 1.1 mrg
604 1.1 mrg /* precision zero */
605 1.1.1.2 mrg mpfr_set_d (x, 9.5, MPFR_RNDN);
606 1.1.1.2 mrg check_sprintf ("9", "%.0RDf", x);
607 1.1.1.2 mrg check_sprintf ("10", "%.0RUf", x);
608 1.1.1.2 mrg
609 1.1.1.2 mrg mpfr_set_d (x, 19.5, MPFR_RNDN);
610 1.1.1.2 mrg check_sprintf ("19", "%.0RDf", x);
611 1.1.1.2 mrg check_sprintf ("20", "%.0RUf", x);
612 1.1.1.2 mrg
613 1.1.1.2 mrg mpfr_set_d (x, 99.5, MPFR_RNDN);
614 1.1.1.2 mrg check_sprintf ("99", "%.0RDf", x);
615 1.1.1.2 mrg check_sprintf ("100", "%.0RUf", x);
616 1.1.1.2 mrg
617 1.1 mrg mpfr_set_d (x, -9.5, MPFR_RNDN);
618 1.1 mrg check_sprintf ("-10", "%.0RDf", x);
619 1.1 mrg check_sprintf ("-10", "%.0RYf", x);
620 1.1 mrg check_sprintf ("-10", "%.0Rf", x);
621 1.1 mrg check_sprintf ("-1e+01", "%.0Re", x);
622 1.1 mrg check_sprintf ("-1e+01", "%.0Rg", x);
623 1.1 mrg mpfr_set_ui_2exp (x, 1, -1, MPFR_RNDN);
624 1.1 mrg check_sprintf ("0", "%.0Rf", x);
625 1.1 mrg check_sprintf ("5e-01", "%.0Re", x);
626 1.1 mrg check_sprintf ("0.5", "%.0Rg", x);
627 1.1 mrg mpfr_set_ui_2exp (x, 3, -1, MPFR_RNDN);
628 1.1 mrg check_sprintf ("2", "%.0Rf", x);
629 1.1 mrg mpfr_set_ui_2exp (x, 5, -1, MPFR_RNDN);
630 1.1 mrg check_sprintf ("2", "%.0Rf", x);
631 1.1 mrg mpfr_set_ui (x, 0x1f, MPFR_RNDN);
632 1.1 mrg check_sprintf ("0x1p+5", "%.0Ra", x);
633 1.1 mrg mpfr_set_ui (x, 3, MPFR_RNDN);
634 1.1 mrg check_sprintf ("1p+2", "%.0Rb", x);
635 1.1 mrg
636 1.1 mrg /* round to next ten power with %f but not with %g */
637 1.1 mrg mpfr_set_str (x, "-6.64464380544039223686e-02", 10, MPFR_RNDN);
638 1.1 mrg check_sprintf ("-0.1", "%.1Rf", x);
639 1.1 mrg check_sprintf ("-0.0", "%.1RZf", x);
640 1.1 mrg check_sprintf ("-0.07", "%.1Rg", x);
641 1.1 mrg check_sprintf ("-0.06", "%.1RZg", x);
642 1.1 mrg
643 1.1 mrg /* round to next ten power and do not remove trailing zeros */
644 1.1 mrg mpfr_set_str (x, "9.98429393291486722006e-02", 10, MPFR_RNDN);
645 1.1 mrg check_sprintf ("0.1", "%#.1Rg", x);
646 1.1 mrg check_sprintf ("0.10", "%#.2Rg", x);
647 1.1 mrg check_sprintf ("0.099", "%#.2RZg", x);
648 1.1 mrg
649 1.1 mrg /* Halfway cases */
650 1.1 mrg mpfr_set_str (x, "1.5", 10, MPFR_RNDN);
651 1.1 mrg check_sprintf ("2e+00", "%.0Re", x);
652 1.1 mrg mpfr_set_str (x, "2.5", 10, MPFR_RNDN);
653 1.1 mrg check_sprintf ("2e+00", "%.0Re", x);
654 1.1 mrg mpfr_set_str (x, "9.5", 10, MPFR_RNDN);
655 1.1 mrg check_sprintf ("1e+01", "%.0Re", x);
656 1.1 mrg mpfr_set_str (x, "1.25", 10, MPFR_RNDN);
657 1.1 mrg check_sprintf ("1.2e+00", "%.1Re", x);
658 1.1 mrg mpfr_set_str (x, "1.75", 10, MPFR_RNDN);
659 1.1 mrg check_sprintf ("1.8e+00", "%.1Re", x);
660 1.1 mrg mpfr_set_str (x, "-0.5", 10, MPFR_RNDN);
661 1.1 mrg check_sprintf ("-0", "%.0Rf", x);
662 1.1 mrg mpfr_set_str (x, "1.25", 10, MPFR_RNDN);
663 1.1 mrg check_sprintf ("1.2", "%.1Rf", x);
664 1.1 mrg mpfr_set_str (x, "1.75", 10, MPFR_RNDN);
665 1.1 mrg check_sprintf ("1.8", "%.1Rf", x);
666 1.1 mrg mpfr_set_str (x, "1.5", 10, MPFR_RNDN);
667 1.1 mrg check_sprintf ("2", "%.1Rg", x);
668 1.1 mrg mpfr_set_str (x, "2.5", 10, MPFR_RNDN);
669 1.1 mrg check_sprintf ("2", "%.1Rg", x);
670 1.1 mrg mpfr_set_str (x, "9.25", 10, MPFR_RNDN);
671 1.1 mrg check_sprintf ("9.2", "%.2Rg", x);
672 1.1 mrg mpfr_set_str (x, "9.75", 10, MPFR_RNDN);
673 1.1 mrg check_sprintf ("9.8", "%.2Rg", x);
674 1.1 mrg
675 1.1 mrg /* assertion failure in r6320 */
676 1.1 mrg mpfr_set_str (x, "-9.996", 10, MPFR_RNDN);
677 1.1 mrg check_sprintf ("-10.0", "%.1Rf", x);
678 1.1 mrg
679 1.1.1.4 mrg /* regression in MPFR 3.1.0 (bug introduced in r7761, fixed in r7931) */
680 1.1.1.4 mrg check_sprintf ("-10", "%.2Rg", x);
681 1.1.1.4 mrg
682 1.1.1.5 mrg mpfr_clears (x, y, z, (mpfr_ptr) 0);
683 1.1 mrg }
684 1.1 mrg
685 1.1.1.6 mrg static void
686 1.1 mrg hexadecimal (void)
687 1.1 mrg {
688 1.1 mrg mpfr_t x, z;
689 1.1.1.6 mrg
690 1.1 mrg mpfr_inits2 (64, x, z, (mpfr_ptr) 0);
691 1.1 mrg
692 1.1 mrg /* special */
693 1.1 mrg mpfr_set_inf (x, 1);
694 1.1 mrg check_sprintf (pinf_str, "%Ra", x);
695 1.1 mrg check_sprintf (pinf_str, "%RUa", x);
696 1.1 mrg check_sprintf (pinf_str, "%RDa", x);
697 1.1 mrg check_sprintf (pinf_uc_str, "%RA", x);
698 1.1 mrg check_sprintf (pinf_uc_str, "%RYA", x);
699 1.1 mrg check_sprintf (pinf_uc_str, "%RZA", x);
700 1.1 mrg check_sprintf (pinf_uc_str, "%RNA", x);
701 1.1 mrg
702 1.1 mrg mpfr_set_inf (x, -1);
703 1.1 mrg check_sprintf (minf_str, "%Ra", x);
704 1.1 mrg check_sprintf (minf_str, "%RYa", x);
705 1.1 mrg check_sprintf (minf_str, "%RZa", x);
706 1.1 mrg check_sprintf (minf_str, "%RNa", x);
707 1.1 mrg check_sprintf (minf_uc_str, "%RA", x);
708 1.1 mrg check_sprintf (minf_uc_str, "%RUA", x);
709 1.1 mrg check_sprintf (minf_uc_str, "%RDA", x);
710 1.1 mrg
711 1.1 mrg mpfr_set_nan (x);
712 1.1 mrg check_sprintf (nan_str, "%Ra", x);
713 1.1 mrg check_sprintf (nan_uc_str, "%RA", x);
714 1.1 mrg
715 1.1 mrg /* regular numbers */
716 1.1 mrg mpfr_set_str (x, "FEDCBA9.87654321", 16, MPFR_RNDN);
717 1.1 mrg mpfr_set_ui (z, 0, MPFR_RNDZ);
718 1.1 mrg
719 1.1 mrg /* simplest case right justified */
720 1.1 mrg check_sprintf (" 0xf.edcba987654321p+24", "%25Ra", x);
721 1.1 mrg check_sprintf (" 0xf.edcba987654321p+24", "%25RUa", x);
722 1.1 mrg check_sprintf (" 0xf.edcba987654321p+24", "%25RDa", x);
723 1.1 mrg check_sprintf (" 0xf.edcba987654321p+24", "%25RYa", x);
724 1.1 mrg check_sprintf (" 0xf.edcba987654321p+24", "%25RZa", x);
725 1.1 mrg check_sprintf (" 0xf.edcba987654321p+24", "%25RNa", x);
726 1.1 mrg check_sprintf (" 0x1p+28", "%25.0Ra", x);
727 1.1 mrg check_sprintf (" 0x0p+0", "%25.0Ra", z);
728 1.1.1.5 mrg check_sprintf (" 0x0p+0", "%25Ra", z);
729 1.1.1.5 mrg check_sprintf (" 0x0.p+0", "%#25Ra", z);
730 1.1 mrg /* sign or space, pad with leading zeros */
731 1.1 mrg check_sprintf (" 0X00F.EDCBA987654321P+24", "% 025RA", x);
732 1.1 mrg check_sprintf (" 0X000000000000000001P+28", "% 025.0RA", x);
733 1.1 mrg check_sprintf (" 0X0000000000000000000P+0", "% 025.0RA", z);
734 1.1 mrg /* sign + or -, left justified */
735 1.1 mrg check_sprintf ("+0xf.edcba987654321p+24 ", "%+-25Ra", x);
736 1.1 mrg check_sprintf ("+0x1p+28 ", "%+-25.0Ra", x);
737 1.1 mrg check_sprintf ("+0x0p+0 ", "%+-25.0Ra", z);
738 1.1 mrg /* decimal point, left justified, precision and rounding parameter */
739 1.1 mrg check_vsprintf ("0XF.FP+24 ", "%#-10.*R*A", 1, MPFR_RNDN, x);
740 1.1 mrg check_vsprintf ("0X1.P+28 ", "%#-10.*R*A", 0, MPFR_RNDN, x);
741 1.1 mrg check_vsprintf ("0X0.P+0 ", "%#-10.*R*A", 0, MPFR_RNDN, z);
742 1.1 mrg /* sign or space */
743 1.1 mrg check_sprintf (" 0xf.eddp+24", "% .3RNa", x);
744 1.1 mrg check_sprintf (" 0x1p+28", "% .0RNa", x);
745 1.1 mrg /* sign + or -, decimal point, pad with leading zeros */
746 1.1 mrg check_sprintf ("+0X0F.EP+24", "%0+#11.1RZA", x);
747 1.1 mrg check_sprintf ("+0X00F.P+24", "%0+#11.0RZA", x);
748 1.1 mrg check_sprintf ("+0X000.0P+0", "%0+#11.1RZA", z);
749 1.1 mrg /* pad with leading zero */
750 1.1 mrg check_sprintf ("0x0000f.edcba987654321p+24", "%026RDa", x);
751 1.1 mrg check_sprintf ("0x0000000000000000000fp+24", "%026.0RDa", x);
752 1.1 mrg /* sign or space, decimal point, left justified */
753 1.1.1.6 mrg check_sprintf (" 0XF.EP+24 ", "%- #11.1RDA", x);
754 1.1.1.6 mrg check_sprintf (" 0XF.P+24 ", "%- #11.0RDA", x);
755 1.1 mrg
756 1.1 mrg mpfr_mul_si (x, x, -1, MPFR_RNDD);
757 1.1 mrg mpfr_mul_si (z, z, -1, MPFR_RNDD);
758 1.1 mrg
759 1.1 mrg /* sign + or - */
760 1.1 mrg check_sprintf ("-0xf.ep+24", "%+10.1RUa", x);
761 1.1 mrg check_sprintf (" -0xfp+24", "%+10.0RUa", x);
762 1.1 mrg check_sprintf (" -0x0p+0", "%+10.0RUa", z);
763 1.1 mrg
764 1.1 mrg /* rounding bit is zero */
765 1.1 mrg mpfr_set_str (x, "0xF.7", 16, MPFR_RNDN);
766 1.1 mrg check_sprintf ("0XFP+0", "%.0RNA", x);
767 1.1 mrg /* tie case in round to nearest mode */
768 1.1 mrg mpfr_set_str (x, "0x0.8800000000000000p+3", 16, MPFR_RNDN);
769 1.1 mrg check_sprintf ("0x9.p-1", "%#.0RNa", x);
770 1.1 mrg mpfr_set_str (x, "-0x0.9800000000000000p+3", 16, MPFR_RNDN);
771 1.1 mrg check_sprintf ("-0xap-1", "%.0RNa", x);
772 1.1 mrg /* trailing zeros in fractional part */
773 1.1 mrg check_sprintf ("-0X4.C0000000000000000000P+0", "%.20RNA", x);
774 1.1 mrg /* rounding bit is one and the first non zero bit is far away */
775 1.1 mrg mpfr_set_prec (x, 1024);
776 1.1 mrg mpfr_set_ui_2exp (x, 29, -1, MPFR_RNDN);
777 1.1 mrg mpfr_nextabove (x);
778 1.1 mrg check_sprintf ("0XFP+0", "%.0RNA", x);
779 1.1 mrg
780 1.1 mrg /* with more than one limb */
781 1.1 mrg mpfr_set_prec (x, 300);
782 1.1 mrg mpfr_set_str (x, "0xf.ffffffffffffffffffffffffffffffffffffffffffffffffffff"
783 1.1 mrg "fffffffffffffffff", 16, MPFR_RNDN);
784 1.1 mrg check_sprintf ("0x1p+4 [300]", "%.0RNa [300]", x);
785 1.1 mrg check_sprintf ("0xfp+0 [300]", "%.0RZa [300]", x);
786 1.1 mrg check_sprintf ("0x1p+4 [300]", "%.0RYa [300]", x);
787 1.1 mrg check_sprintf ("0xfp+0 [300]", "%.0RDa [300]", x);
788 1.1 mrg check_sprintf ("0x1p+4 [300]", "%.0RUa [300]", x);
789 1.1 mrg check_sprintf ("0x1.0000000000000000000000000000000000000000p+4",
790 1.1 mrg "%.40RNa", x);
791 1.1 mrg check_sprintf ("0xf.ffffffffffffffffffffffffffffffffffffffffp+0",
792 1.1 mrg "%.40RZa", x);
793 1.1 mrg check_sprintf ("0x1.0000000000000000000000000000000000000000p+4",
794 1.1 mrg "%.40RYa", x);
795 1.1 mrg check_sprintf ("0xf.ffffffffffffffffffffffffffffffffffffffffp+0",
796 1.1 mrg "%.40RDa", x);
797 1.1 mrg check_sprintf ("0x1.0000000000000000000000000000000000000000p+4",
798 1.1 mrg "%.40RUa", x);
799 1.1 mrg
800 1.1 mrg mpfr_set_str (x, "0xf.7fffffffffffffffffffffffffffffffffffffffffffffffffff"
801 1.1 mrg "ffffffffffffffffff", 16, MPFR_RNDN);
802 1.1 mrg check_sprintf ("0XFP+0", "%.0RNA", x);
803 1.1 mrg check_sprintf ("0XFP+0", "%.0RZA", x);
804 1.1 mrg check_sprintf ("0X1P+4", "%.0RYA", x);
805 1.1 mrg check_sprintf ("0XFP+0", "%.0RDA", x);
806 1.1 mrg check_sprintf ("0X1P+4", "%.0RUA", x);
807 1.1 mrg check_sprintf ("0XF.8P+0", "%.1RNA", x);
808 1.1 mrg check_sprintf ("0XF.7P+0", "%.1RZA", x);
809 1.1 mrg check_sprintf ("0XF.8P+0", "%.1RYA", x);
810 1.1 mrg check_sprintf ("0XF.7P+0", "%.1RDA", x);
811 1.1 mrg check_sprintf ("0XF.8P+0", "%.1RUA", x);
812 1.1 mrg
813 1.1 mrg /* do not round up to the next power of the base */
814 1.1 mrg mpfr_set_str (x, "0xf.fffffffffffffffffffffffffffffffffffffeffffffffffffff"
815 1.1 mrg "ffffffffffffffffff", 16, MPFR_RNDN);
816 1.1 mrg check_sprintf ("0xf.ffffffffffffffffffffffffffffffffffffff00p+0",
817 1.1 mrg "%.40RNa", x);
818 1.1 mrg check_sprintf ("0xf.fffffffffffffffffffffffffffffffffffffeffp+0",
819 1.1 mrg "%.40RZa", x);
820 1.1 mrg check_sprintf ("0xf.ffffffffffffffffffffffffffffffffffffff00p+0",
821 1.1 mrg "%.40RYa", x);
822 1.1 mrg check_sprintf ("0xf.fffffffffffffffffffffffffffffffffffffeffp+0",
823 1.1 mrg "%.40RDa", x);
824 1.1 mrg check_sprintf ("0xf.ffffffffffffffffffffffffffffffffffffff00p+0",
825 1.1 mrg "%.40RUa", x);
826 1.1 mrg
827 1.1 mrg mpfr_clears (x, z, (mpfr_ptr) 0);
828 1.1 mrg }
829 1.1 mrg
830 1.1.1.6 mrg static void
831 1.1 mrg binary (void)
832 1.1 mrg {
833 1.1 mrg mpfr_t x;
834 1.1 mrg mpfr_t z;
835 1.1.1.6 mrg
836 1.1 mrg mpfr_inits2 (64, x, z, (mpfr_ptr) 0);
837 1.1 mrg
838 1.1 mrg /* special */
839 1.1 mrg mpfr_set_inf (x, 1);
840 1.1 mrg check_sprintf (pinf_str, "%Rb", x);
841 1.1 mrg
842 1.1 mrg mpfr_set_inf (x, -1);
843 1.1 mrg check_sprintf (minf_str, "%Rb", x);
844 1.1 mrg
845 1.1 mrg mpfr_set_nan (x);
846 1.1 mrg check_sprintf (nan_str, "%Rb", x);
847 1.1 mrg
848 1.1 mrg /* regular numbers */
849 1.1 mrg mpfr_set_str (x, "1110010101.1001101", 2, MPFR_RNDN);
850 1.1 mrg mpfr_set_ui (z, 0, MPFR_RNDN);
851 1.1 mrg
852 1.1 mrg /* simplest case: right justified */
853 1.1 mrg check_sprintf (" 1.1100101011001101p+9", "%25Rb", x);
854 1.1 mrg check_sprintf (" 0p+0", "%25Rb", z);
855 1.1.1.5 mrg check_sprintf (" 0.p+0", "%#25Rb", z);
856 1.1 mrg /* sign or space, pad with leading zeros */
857 1.1 mrg check_sprintf (" 0001.1100101011001101p+9", "% 025Rb", x);
858 1.1 mrg check_sprintf (" 000000000000000000000p+0", "% 025Rb", z);
859 1.1 mrg /* sign + or -, left justified */
860 1.1 mrg check_sprintf ("+1.1100101011001101p+9 ", "%+-25Rb", x);
861 1.1 mrg check_sprintf ("+0p+0 ", "%+-25Rb", z);
862 1.1 mrg /* sign or space */
863 1.1 mrg check_sprintf (" 1.110p+9", "% .3RNb", x);
864 1.1 mrg check_sprintf (" 1.1101p+9", "% .4RNb", x);
865 1.1 mrg check_sprintf (" 0.0000p+0", "% .4RNb", z);
866 1.1 mrg /* sign + or -, decimal point, pad with leading zeros */
867 1.1 mrg check_sprintf ("+00001.1p+9", "%0+#11.1RZb", x);
868 1.1 mrg check_sprintf ("+0001.0p+10", "%0+#11.1RNb", x);
869 1.1 mrg check_sprintf ("+000000.p+0", "%0+#11.0RNb", z);
870 1.1 mrg /* pad with leading zero */
871 1.1 mrg check_sprintf ("00001.1100101011001101p+9", "%025RDb", x);
872 1.1 mrg /* sign or space, decimal point (unused), left justified */
873 1.1 mrg check_sprintf (" 1.1p+9 ", "%- #11.1RDb", x);
874 1.1 mrg check_sprintf (" 1.p+9 ", "%- #11.0RDb", x);
875 1.1 mrg check_sprintf (" 1.p+10 ", "%- #11.0RUb", x);
876 1.1 mrg check_sprintf (" 1.p+9 ", "%- #11.0RZb", x);
877 1.1 mrg check_sprintf (" 1.p+10 ", "%- #11.0RYb", x);
878 1.1 mrg check_sprintf (" 1.p+10 ", "%- #11.0RNb", x);
879 1.1 mrg
880 1.1 mrg mpfr_mul_si (x, x, -1, MPFR_RNDD);
881 1.1 mrg mpfr_mul_si (z, z, -1, MPFR_RNDD);
882 1.1 mrg
883 1.1 mrg /* sign + or - */
884 1.1 mrg check_sprintf (" -1.1p+9", "%+10.1RUb", x);
885 1.1 mrg check_sprintf (" -0.0p+0", "%+10.1RUb", z);
886 1.1 mrg
887 1.1 mrg /* precision 0 */
888 1.1 mrg check_sprintf ("-1p+10", "%.0RNb", x);
889 1.1 mrg check_sprintf ("-1p+10", "%.0RDb", x);
890 1.1 mrg check_sprintf ("-1p+9", "%.0RUb", x);
891 1.1 mrg check_sprintf ("-1p+9", "%.0RZb", x);
892 1.1 mrg check_sprintf ("-1p+10", "%.0RYb", x);
893 1.1 mrg /* round to next base power */
894 1.1 mrg check_sprintf ("-1.0p+10", "%.1RNb", x);
895 1.1 mrg check_sprintf ("-1.0p+10", "%.1RDb", x);
896 1.1 mrg check_sprintf ("-1.0p+10", "%.1RYb", x);
897 1.1 mrg /* do not round to next base power */
898 1.1 mrg check_sprintf ("-1.1p+9", "%.1RUb", x);
899 1.1 mrg check_sprintf ("-1.1p+9", "%.1RZb", x);
900 1.1 mrg /* rounding bit is zero */
901 1.1 mrg check_sprintf ("-1.11p+9", "%.2RNb", x);
902 1.1 mrg /* tie case in round to nearest mode */
903 1.1 mrg check_sprintf ("-1.1100101011001101p+9", "%.16RNb", x);
904 1.1 mrg /* trailing zeros in fractional part */
905 1.1 mrg check_sprintf ("-1.110010101100110100000000000000p+9", "%.30RNb", x);
906 1.1 mrg
907 1.1 mrg mpfr_clears (x, z, (mpfr_ptr) 0);
908 1.1 mrg }
909 1.1 mrg
910 1.1.1.6 mrg static void
911 1.1 mrg mixed (void)
912 1.1 mrg {
913 1.1 mrg int n1;
914 1.1 mrg int n2;
915 1.1 mrg int i = 121;
916 1.1.1.4 mrg #ifdef PRINTF_L
917 1.1 mrg long double d = 1. / 31.;
918 1.1.1.2 mrg #endif
919 1.1 mrg mpf_t mpf;
920 1.1 mrg mpq_t mpq;
921 1.1 mrg mpz_t mpz;
922 1.1 mrg mpfr_t x;
923 1.1 mrg mpfr_rnd_t rnd;
924 1.1.1.4 mrg int k;
925 1.1 mrg
926 1.1 mrg mpf_init (mpf);
927 1.1 mrg mpf_set_ui (mpf, 40);
928 1.1 mrg mpf_div_ui (mpf, mpf, 31); /* mpf = 40.0 / 31.0 */
929 1.1 mrg mpq_init (mpq);
930 1.1 mrg mpq_set_ui (mpq, 123456, 4567890);
931 1.1 mrg mpz_init (mpz);
932 1.1 mrg mpz_fib_ui (mpz, 64);
933 1.1 mrg mpfr_init (x);
934 1.1 mrg mpfr_set_str (x, "-12345678.875", 10, MPFR_RNDN);
935 1.1 mrg rnd = MPFR_RNDD;
936 1.1 mrg
937 1.1 mrg check_vsprintf ("121%", "%i%%", i);
938 1.1.1.5 mrg check_vsprintf ("121% -1.2345678875000000E+07", "%i%% %RNE", i, x);
939 1.1 mrg check_vsprintf ("121, -12345679", "%i, %.0Rf", i, x);
940 1.1.1.5 mrg check_vsprintf ("10610209857723, -1.2345678875000000e+07", "%Zi, %R*e", mpz, rnd,
941 1.1 mrg x);
942 1.1 mrg check_vsprintf ("-12345678.9, 121", "%.1Rf, %i", x, i);
943 1.1 mrg check_vsprintf ("-12345678, 1e240/45b352", "%.0R*f, %Qx", MPFR_RNDZ, x, mpq);
944 1.1.1.4 mrg
945 1.1.1.4 mrg /* TODO: Systematically test with and without %n in check_vsprintf? */
946 1.1.1.4 mrg /* Do the test several times due to random parameters in check_vsprintf
947 1.1.1.4 mrg and the use of %n. In r11501, n2 is incorrect (seems random) when
948 1.1.1.4 mrg randsize <= 0, i.e. when the size argument of mpfr_vsnprintf is 0. */
949 1.1.1.4 mrg for (k = 0; k < 30; k++)
950 1.1.1.4 mrg {
951 1.1.1.4 mrg n2 = -17;
952 1.1.1.4 mrg /* If this value is obtained for n2 after the check_vsprintf call below,
953 1.1.1.4 mrg this probably means that n2 has not been written as expected. */
954 1.1.1.4 mrg n1 = check_vsprintf ("121, -12345678.875000000000, 1.290323",
955 1.1.1.4 mrg "%i, %.*Rf, %Ff%n", i, 12, x, mpf, &n2);
956 1.1.1.4 mrg if (n1 != n2)
957 1.1.1.4 mrg {
958 1.1.1.4 mrg printf ("error in number of characters written by mpfr_vsprintf"
959 1.1.1.4 mrg " for k = %d, randsize = %d\n", k, randsize);
960 1.1.1.4 mrg printf ("expected: %d\n", n2);
961 1.1.1.4 mrg printf (" got: %d\n", n1);
962 1.1.1.4 mrg exit (1);
963 1.1.1.4 mrg }
964 1.1 mrg }
965 1.1 mrg
966 1.1.1.4 mrg #ifdef PRINTF_L
967 1.1.1.4 mrg /* under MinGW, -D__USE_MINGW_ANSI_STDIO is required to support %Lf
968 1.1.1.5 mrg see https://gcc.gnu.org/legacy-ml/gcc/2013-03/msg00103.html */
969 1.1.1.5 mrg check_vsprintf ("00000010610209857723, -1.2345678875000000e+07, 0.032258",
970 1.1 mrg "%.*Zi, %R*e, %Lf", 20, mpz, rnd, x, d);
971 1.1 mrg #endif
972 1.1 mrg
973 1.1.1.5 mrg /* check invalid spec.spec */
974 1.1.1.5 mrg check_vsprintf ("%,", "%,");
975 1.1.1.5 mrg check_vsprintf ("%3*Rg", "%3*Rg");
976 1.1.1.5 mrg
977 1.1.1.5 mrg /* check empty format */
978 1.1.1.5 mrg check_vsprintf ("%", "%");
979 1.1.1.5 mrg
980 1.1 mrg mpf_clear (mpf);
981 1.1 mrg mpq_clear (mpq);
982 1.1 mrg mpz_clear (mpz);
983 1.1 mrg mpfr_clear (x);
984 1.1 mrg }
985 1.1 mrg
986 1.1.1.5 mrg #if defined(HAVE_LOCALE_H) && defined(HAVE_SETLOCALE) && MPFR_LCONV_DPTS
987 1.1.1.3 mrg
988 1.1.1.6 mrg /* Check with locale "da_DK.utf8" or "da_DK".
989 1.1.1.6 mrg On most platforms, decimal point is ',' and thousands separator is '.';
990 1.1.1.6 mrg if this is not the case or if the locale does not exist, the test is not
991 1.1.1.6 mrg performed (and if the MPFR_CHECK_LOCALES environment variable is set,
992 1.1.1.6 mrg the program fails). */
993 1.1.1.5 mrg static void
994 1.1 mrg locale_da_DK (void)
995 1.1 mrg {
996 1.1 mrg mpfr_prec_t p = 128;
997 1.1.1.5 mrg mpfr_t x, y;
998 1.1 mrg
999 1.1.1.6 mrg if ((setlocale (LC_ALL, "da_DK.utf8") == 0 &&
1000 1.1.1.6 mrg setlocale (LC_ALL, "da_DK") == 0) ||
1001 1.1 mrg localeconv()->decimal_point[0] != ',' ||
1002 1.1 mrg localeconv()->thousands_sep[0] != '.')
1003 1.1.1.5 mrg {
1004 1.1.1.5 mrg setlocale (LC_ALL, "C");
1005 1.1.1.5 mrg
1006 1.1.1.5 mrg if (getenv ("MPFR_CHECK_LOCALES") == NULL)
1007 1.1.1.5 mrg return;
1008 1.1.1.5 mrg
1009 1.1.1.5 mrg fprintf (stderr,
1010 1.1.1.5 mrg "Cannot test the da_DK locale (not found or inconsistent).\n");
1011 1.1.1.5 mrg exit (1);
1012 1.1.1.5 mrg }
1013 1.1 mrg
1014 1.1 mrg mpfr_init2 (x, p);
1015 1.1 mrg
1016 1.1 mrg /* positive numbers */
1017 1.1 mrg mpfr_set_str (x, "18993474.61279296875", 10, MPFR_RNDN);
1018 1.1.1.5 mrg mpfr_init2 (y, 59);
1019 1.1.1.5 mrg mpfr_set (y, x, MPFR_RNDN);
1020 1.1 mrg
1021 1.1 mrg /* simplest case right justified with thousands separator */
1022 1.1.1.5 mrg check_sprintf ("1,899347461279296875000000000000000000000e+07", "%'30Re", x);
1023 1.1.1.5 mrg check_sprintf (" 1,899347461279296875e+07", "%'30Re", y);
1024 1.1 mrg check_sprintf (" 1,89935e+07", "%'30Rg", x);
1025 1.1 mrg check_sprintf (" 18.993.474,61279296875", "%'30.19Rg", x);
1026 1.1 mrg check_sprintf (" 18.993.474,612793", "%'30Rf", x);
1027 1.1 mrg
1028 1.1 mrg /* sign or space, pad, thousands separator with leading zeros */
1029 1.1.1.5 mrg check_sprintf (" 1,899347461279296875000000000000000000000E+07", "%' 030RE", x);
1030 1.1.1.5 mrg check_sprintf (" 000001,899347461279296875E+07", "%' 030RE", y);
1031 1.1 mrg check_sprintf (" 0000000000000000001,89935E+07", "%' 030RG", x);
1032 1.1 mrg check_sprintf (" 000000018.993.474,61279296875", "%' 030.19RG", x);
1033 1.1 mrg check_sprintf (" 00000000000018.993.474,612793", "%' 030RF", x);
1034 1.1 mrg
1035 1.1.1.4 mrg #define T1 "000"
1036 1.1.1.4 mrg #define T2 ".000"
1037 1.1.1.4 mrg #define S1 T1 T1 T1 T1 T1 T1 T1 T1 T1 T1 T1 T1 T1 T1 T1 T1
1038 1.1.1.4 mrg #define S2 T2 T2 T2 T2 T2 T2 T2 T2 T2 T2 T2 T2 T2 T2 T2 T2 ","
1039 1.1.1.4 mrg
1040 1.1.1.4 mrg mpfr_set_ui (x, 48, MPFR_RNDN);
1041 1.1 mrg mpfr_exp10 (x, x, MPFR_RNDN);
1042 1.1.1.4 mrg check_sprintf ("1" S1, "%.0Rf", x);
1043 1.1.1.4 mrg check_sprintf ("1" S2, "%'#.0Rf", x);
1044 1.1.1.4 mrg check_sprintf ("1" S2 "0000", "%'.4Rf", x);
1045 1.1.1.4 mrg mpfr_mul_ui (x, x, 10, MPFR_RNDN);
1046 1.1.1.4 mrg check_sprintf ("10" S1, "%.0Rf", x);
1047 1.1.1.4 mrg check_sprintf ("10" S2, "%'#.0Rf", x);
1048 1.1.1.4 mrg check_sprintf ("10" S2 "0000", "%'.4Rf", x);
1049 1.1.1.4 mrg mpfr_mul_ui (x, x, 10, MPFR_RNDN);
1050 1.1.1.4 mrg check_sprintf ("100" S1, "%.0Rf", x);
1051 1.1.1.4 mrg check_sprintf ("100" S2, "%'#.0Rf", x);
1052 1.1.1.4 mrg check_sprintf ("100" S2 "0000", "%'.4Rf", x);
1053 1.1 mrg
1054 1.1 mrg mpfr_clear (x);
1055 1.1.1.5 mrg mpfr_clear (y);
1056 1.1.1.5 mrg
1057 1.1.1.5 mrg setlocale (LC_ALL, "C");
1058 1.1 mrg }
1059 1.1 mrg
1060 1.1.1.5 mrg #endif /* ... && MPFR_LCONV_DPTS */
1061 1.1.1.3 mrg
1062 1.1 mrg /* check concordance between mpfr_asprintf result with a regular mpfr float
1063 1.1 mrg and with a regular double float */
1064 1.1.1.6 mrg static void
1065 1.1 mrg random_double (void)
1066 1.1 mrg {
1067 1.1 mrg mpfr_t x; /* random regular mpfr float */
1068 1.1 mrg double y; /* regular double float (equal to x) */
1069 1.1 mrg
1070 1.1 mrg char flag[] =
1071 1.1 mrg {
1072 1.1 mrg '-',
1073 1.1 mrg '+',
1074 1.1 mrg ' ',
1075 1.1 mrg '#',
1076 1.1.1.4 mrg '0', /* no ambiguity: first zeros are flag zero */
1077 1.1.1.4 mrg '\'' /* SUS extension */
1078 1.1 mrg };
1079 1.1 mrg /* no 'a': mpfr and glibc do not have the same semantic */
1080 1.1 mrg char specifier[] =
1081 1.1 mrg {
1082 1.1 mrg 'e',
1083 1.1 mrg 'f',
1084 1.1 mrg 'g',
1085 1.1 mrg 'E',
1086 1.1 mrg 'f', /* SUSv2 doesn't accept %F, but %F and %f are the same for
1087 1.1 mrg regular numbers */
1088 1.1 mrg 'G',
1089 1.1 mrg };
1090 1.1 mrg int spec; /* random index in specifier[] */
1091 1.1 mrg int prec; /* random value for precision field */
1092 1.1 mrg
1093 1.1 mrg /* in the format string for mpfr_t variable, the maximum length is
1094 1.1 mrg reached by something like "%-+ #0'.*Rf", that is 12 characters. */
1095 1.1 mrg #define FMT_MPFR_SIZE 12
1096 1.1 mrg char fmt_mpfr[FMT_MPFR_SIZE];
1097 1.1 mrg char *ptr_mpfr;
1098 1.1 mrg
1099 1.1 mrg /* in the format string for double variable, the maximum length is
1100 1.1 mrg reached by something like "%-+ #0'.*f", that is 11 characters. */
1101 1.1 mrg #define FMT_SIZE 11
1102 1.1 mrg char fmt[FMT_SIZE];
1103 1.1 mrg char *ptr;
1104 1.1 mrg
1105 1.1 mrg int xi;
1106 1.1 mrg char *xs;
1107 1.1 mrg int yi;
1108 1.1 mrg char *ys;
1109 1.1 mrg
1110 1.1 mrg int i, j, jmax;
1111 1.1 mrg
1112 1.1 mrg mpfr_init2 (x, MPFR_LDBL_MANT_DIG);
1113 1.1 mrg
1114 1.1 mrg for (i = 0; i < 1000; ++i)
1115 1.1 mrg {
1116 1.1 mrg /* 1. random double */
1117 1.1 mrg do
1118 1.1 mrg {
1119 1.1 mrg y = DBL_RAND ();
1120 1.1 mrg }
1121 1.1 mrg while (ABS(y) < DBL_MIN);
1122 1.1 mrg
1123 1.1.1.6 mrg if (RAND_BOOL ())
1124 1.1 mrg y = -y;
1125 1.1 mrg
1126 1.1 mrg mpfr_set_d (x, y, MPFR_RNDN);
1127 1.1 mrg if (y != mpfr_get_d (x, MPFR_RNDN))
1128 1.1 mrg /* conversion error: skip this one */
1129 1.1 mrg continue;
1130 1.1 mrg
1131 1.1 mrg /* 2. build random format strings fmt_mpfr and fmt */
1132 1.1 mrg ptr_mpfr = fmt_mpfr;
1133 1.1 mrg ptr = fmt;
1134 1.1 mrg *ptr_mpfr++ = *ptr++ = '%';
1135 1.1 mrg /* random specifier 'e', 'f', 'g', 'E', 'F', or 'G' */
1136 1.1 mrg spec = (int) (randlimb() % 6);
1137 1.1.1.4 mrg /* random flags, but no ' flag with %e or with non-glibc */
1138 1.1.1.4 mrg #if __MPFR_GLIBC(1,0)
1139 1.1 mrg jmax = (spec == 0 || spec == 3) ? 5 : 6;
1140 1.1.1.4 mrg #else
1141 1.1.1.4 mrg jmax = 5;
1142 1.1.1.4 mrg #endif
1143 1.1 mrg for (j = 0; j < jmax; j++)
1144 1.1 mrg {
1145 1.1 mrg if (randlimb() % 3 == 0)
1146 1.1 mrg *ptr_mpfr++ = *ptr++ = flag[j];
1147 1.1 mrg }
1148 1.1 mrg *ptr_mpfr++ = *ptr++ = '.';
1149 1.1 mrg *ptr_mpfr++ = *ptr++ = '*';
1150 1.1 mrg *ptr_mpfr++ = 'R';
1151 1.1 mrg *ptr_mpfr++ = *ptr++ = specifier[spec];
1152 1.1 mrg *ptr_mpfr = *ptr = '\0';
1153 1.1 mrg MPFR_ASSERTN (ptr - fmt < FMT_SIZE);
1154 1.1 mrg MPFR_ASSERTN (ptr_mpfr - fmt_mpfr < FMT_MPFR_SIZE);
1155 1.1 mrg
1156 1.1 mrg /* advantage small precision */
1157 1.1.1.6 mrg prec = RAND_BOOL () ? 10 : prec_max_printf;
1158 1.1.1.6 mrg prec = (int) (randlimb () % prec);
1159 1.1 mrg
1160 1.1 mrg /* 3. calls and checks */
1161 1.1 mrg /* the double float case is handled by the libc asprintf through
1162 1.1 mrg gmp_asprintf */
1163 1.1 mrg xi = mpfr_asprintf (&xs, fmt_mpfr, prec, x);
1164 1.1 mrg yi = mpfr_asprintf (&ys, fmt, prec, y);
1165 1.1 mrg
1166 1.1 mrg /* test if XS and YS differ, beware that ISO C99 doesn't specify
1167 1.1 mrg the sign of a zero exponent (the C99 rationale says: "The sign
1168 1.1 mrg of a zero exponent in %e format is unspecified. The committee
1169 1.1 mrg knows of different implementations and choose not to require
1170 1.1.1.4 mrg implementations to document their behavior in this case
1171 1.1 mrg (by making this be implementation defined behaviour). Most
1172 1.1 mrg implementations use a "+" sign, e.g., 1.2e+00; but there is at
1173 1.1 mrg least one implementation that uses the sign of the unlimited
1174 1.1 mrg precision result, e.g., the 0.987 would be 9.87e-01, so could
1175 1.1 mrg end up as 1e-00 after rounding to one digit of precision."),
1176 1.1 mrg while mpfr always uses '+' */
1177 1.1 mrg if (xi != yi
1178 1.1 mrg || ((strcmp (xs, ys) != 0)
1179 1.1 mrg && (spec == 1 || spec == 4
1180 1.1 mrg || ((strstr (xs, "e+00") == NULL
1181 1.1 mrg || strstr (ys, "e-00") == NULL)
1182 1.1 mrg && (strstr (xs, "E+00") == NULL
1183 1.1 mrg || strstr (ys, "E-00") == NULL)))))
1184 1.1 mrg {
1185 1.1 mrg mpfr_printf ("Error in mpfr_asprintf(\"%s\", %d, %Re)\n",
1186 1.1 mrg fmt_mpfr, prec, x);
1187 1.1 mrg printf ("expected: %s\n", ys);
1188 1.1 mrg printf (" got: %s\n", xs);
1189 1.1 mrg printf ("xi=%d yi=%d spec=%d\n", xi, yi, spec);
1190 1.1 mrg
1191 1.1 mrg exit (1);
1192 1.1 mrg }
1193 1.1 mrg
1194 1.1 mrg mpfr_free_str (xs);
1195 1.1 mrg mpfr_free_str (ys);
1196 1.1 mrg }
1197 1.1 mrg
1198 1.1 mrg mpfr_clear (x);
1199 1.1 mrg }
1200 1.1 mrg
1201 1.1 mrg static void
1202 1.1 mrg bug20080610 (void)
1203 1.1 mrg {
1204 1.1 mrg /* bug on icc found on June 10, 2008 */
1205 1.1 mrg /* this is not a bug but a different implementation choice: ISO C99 doesn't
1206 1.1 mrg specify the sign of a zero exponent (see note in random_double above). */
1207 1.1 mrg mpfr_t x;
1208 1.1 mrg double y;
1209 1.1 mrg int xi;
1210 1.1 mrg char *xs;
1211 1.1 mrg int yi;
1212 1.1 mrg char *ys;
1213 1.1 mrg
1214 1.1 mrg mpfr_init2 (x, MPFR_LDBL_MANT_DIG);
1215 1.1 mrg
1216 1.1 mrg y = -9.95645044213728791504536275169812142849e-01;
1217 1.1 mrg mpfr_set_d (x, y, MPFR_RNDN);
1218 1.1 mrg
1219 1.1 mrg xi = mpfr_asprintf (&xs, "%- #0.*Re", 1, x);
1220 1.1 mrg yi = mpfr_asprintf (&ys, "%- #0.*e", 1, y);
1221 1.1 mrg
1222 1.1 mrg if (xi != yi || strcmp (xs, ys) != 0)
1223 1.1 mrg {
1224 1.1 mrg printf ("Error in bug20080610\n");
1225 1.1 mrg printf ("expected: %s\n", ys);
1226 1.1 mrg printf (" got: %s\n", xs);
1227 1.1 mrg printf ("xi=%d yi=%d\n", xi, yi);
1228 1.1 mrg
1229 1.1 mrg exit (1);
1230 1.1 mrg }
1231 1.1 mrg
1232 1.1 mrg mpfr_free_str (xs);
1233 1.1 mrg mpfr_free_str (ys);
1234 1.1 mrg mpfr_clear (x);
1235 1.1 mrg }
1236 1.1 mrg
1237 1.1 mrg static void
1238 1.1 mrg bug20081214 (void)
1239 1.1 mrg {
1240 1.1 mrg /* problem with glibc 2.3.6, December 14, 2008:
1241 1.1 mrg the system asprintf outputs "-1.0" instead of "-1.". */
1242 1.1 mrg mpfr_t x;
1243 1.1 mrg double y;
1244 1.1 mrg int xi;
1245 1.1 mrg char *xs;
1246 1.1 mrg int yi;
1247 1.1 mrg char *ys;
1248 1.1 mrg
1249 1.1 mrg mpfr_init2 (x, MPFR_LDBL_MANT_DIG);
1250 1.1 mrg
1251 1.1 mrg y = -9.90597761233942053494e-01;
1252 1.1 mrg mpfr_set_d (x, y, MPFR_RNDN);
1253 1.1 mrg
1254 1.1 mrg xi = mpfr_asprintf (&xs, "%- #0.*RG", 1, x);
1255 1.1 mrg yi = mpfr_asprintf (&ys, "%- #0.*G", 1, y);
1256 1.1 mrg
1257 1.1 mrg if (xi != yi || strcmp (xs, ys) != 0)
1258 1.1 mrg {
1259 1.1 mrg mpfr_printf ("Error in bug20081214\n"
1260 1.1 mrg "mpfr_asprintf(\"%- #0.*Re\", 1, %Re)\n", x);
1261 1.1 mrg printf ("expected: %s\n", ys);
1262 1.1 mrg printf (" got: %s\n", xs);
1263 1.1 mrg printf ("xi=%d yi=%d\n", xi, yi);
1264 1.1 mrg
1265 1.1 mrg exit (1);
1266 1.1 mrg }
1267 1.1 mrg
1268 1.1 mrg mpfr_free_str (xs);
1269 1.1 mrg mpfr_free_str (ys);
1270 1.1 mrg mpfr_clear (x);
1271 1.1 mrg }
1272 1.1 mrg
1273 1.1.1.2 mrg static void
1274 1.1.1.2 mrg bug20111102 (void)
1275 1.1.1.2 mrg {
1276 1.1.1.2 mrg mpfr_t t;
1277 1.1.1.2 mrg char s[100];
1278 1.1.1.2 mrg
1279 1.1.1.2 mrg mpfr_init2 (t, 84);
1280 1.1.1.2 mrg mpfr_set_str (t, "999.99999999999999999999", 10, MPFR_RNDN);
1281 1.1.1.2 mrg mpfr_sprintf (s, "%.20RNg", t);
1282 1.1.1.2 mrg if (strcmp (s, "1000") != 0)
1283 1.1.1.2 mrg {
1284 1.1.1.2 mrg printf ("Error in bug20111102, expected 1000, got %s\n", s);
1285 1.1.1.2 mrg exit (1);
1286 1.1.1.2 mrg }
1287 1.1.1.2 mrg mpfr_clear (t);
1288 1.1.1.2 mrg }
1289 1.1.1.2 mrg
1290 1.1 mrg /* In particular, the following test makes sure that the rounding
1291 1.1 mrg * for %Ra and %Rb is not done on the MPFR number itself (as it
1292 1.1 mrg * would overflow). Note: it has been reported on comp.std.c that
1293 1.1 mrg * some C libraries behave differently on %a, but this is a bug.
1294 1.1 mrg */
1295 1.1 mrg static void
1296 1.1 mrg check_emax_aux (mpfr_exp_t e)
1297 1.1 mrg {
1298 1.1 mrg mpfr_t x;
1299 1.1 mrg char *s1, s2[256];
1300 1.1 mrg int i;
1301 1.1 mrg mpfr_exp_t emax;
1302 1.1 mrg
1303 1.1 mrg MPFR_ASSERTN (e <= LONG_MAX);
1304 1.1 mrg emax = mpfr_get_emax ();
1305 1.1 mrg set_emax (e);
1306 1.1 mrg
1307 1.1 mrg mpfr_init2 (x, 16);
1308 1.1 mrg
1309 1.1 mrg mpfr_set_inf (x, 1);
1310 1.1 mrg mpfr_nextbelow (x);
1311 1.1 mrg
1312 1.1 mrg i = mpfr_asprintf (&s1, "%Ra %.2Ra", x, x);
1313 1.1 mrg MPFR_ASSERTN (i > 0);
1314 1.1 mrg
1315 1.1 mrg mpfr_snprintf (s2, 256, "0x7.fff8p+%ld 0x8.00p+%ld", e-3, e-3);
1316 1.1 mrg
1317 1.1 mrg if (strcmp (s1, s2) != 0)
1318 1.1 mrg {
1319 1.1.1.2 mrg printf ("Error in check_emax_aux for emax = ");
1320 1.1.1.2 mrg if (e > LONG_MAX)
1321 1.1.1.2 mrg printf ("(>LONG_MAX)\n");
1322 1.1.1.2 mrg else
1323 1.1.1.2 mrg printf ("%ld\n", (long) e);
1324 1.1.1.4 mrg printf ("Expected '%s'\n", s2);
1325 1.1.1.4 mrg printf ("Got '%s'\n", s1);
1326 1.1 mrg exit (1);
1327 1.1 mrg }
1328 1.1 mrg
1329 1.1 mrg mpfr_free_str (s1);
1330 1.1 mrg
1331 1.1 mrg i = mpfr_asprintf (&s1, "%Rb %.2Rb", x, x);
1332 1.1 mrg MPFR_ASSERTN (i > 0);
1333 1.1 mrg
1334 1.1 mrg mpfr_snprintf (s2, 256, "1.111111111111111p+%ld 1.00p+%ld", e-1, e);
1335 1.1 mrg
1336 1.1 mrg if (strcmp (s1, s2) != 0)
1337 1.1 mrg {
1338 1.1.1.2 mrg printf ("Error in check_emax_aux for emax = ");
1339 1.1.1.2 mrg if (e > LONG_MAX)
1340 1.1.1.2 mrg printf ("(>LONG_MAX)\n");
1341 1.1.1.2 mrg else
1342 1.1.1.2 mrg printf ("%ld\n", (long) e);
1343 1.1 mrg printf ("Expected %s\n", s2);
1344 1.1 mrg printf ("Got %s\n", s1);
1345 1.1 mrg exit (1);
1346 1.1 mrg }
1347 1.1 mrg
1348 1.1 mrg mpfr_free_str (s1);
1349 1.1 mrg
1350 1.1 mrg mpfr_clear (x);
1351 1.1 mrg set_emax (emax);
1352 1.1 mrg }
1353 1.1 mrg
1354 1.1 mrg static void
1355 1.1 mrg check_emax (void)
1356 1.1 mrg {
1357 1.1 mrg check_emax_aux (15);
1358 1.1 mrg check_emax_aux (MPFR_EMAX_MAX);
1359 1.1 mrg }
1360 1.1 mrg
1361 1.1.1.3 mrg static void
1362 1.1.1.3 mrg check_emin_aux (mpfr_exp_t e)
1363 1.1.1.3 mrg {
1364 1.1.1.3 mrg mpfr_t x;
1365 1.1.1.3 mrg char *s1, s2[256];
1366 1.1.1.3 mrg int i;
1367 1.1.1.3 mrg mpfr_exp_t emin;
1368 1.1.1.3 mrg mpz_t ee;
1369 1.1.1.3 mrg
1370 1.1.1.3 mrg MPFR_ASSERTN (e >= LONG_MIN);
1371 1.1.1.3 mrg emin = mpfr_get_emin ();
1372 1.1.1.3 mrg set_emin (e);
1373 1.1.1.3 mrg
1374 1.1.1.3 mrg mpfr_init2 (x, 16);
1375 1.1.1.3 mrg mpz_init (ee);
1376 1.1.1.3 mrg
1377 1.1.1.3 mrg mpfr_setmin (x, e);
1378 1.1.1.3 mrg mpz_set_si (ee, e);
1379 1.1.1.3 mrg mpz_sub_ui (ee, ee, 1);
1380 1.1.1.3 mrg
1381 1.1.1.3 mrg i = mpfr_asprintf (&s1, "%Ra", x);
1382 1.1.1.3 mrg MPFR_ASSERTN (i > 0);
1383 1.1.1.3 mrg
1384 1.1.1.3 mrg gmp_snprintf (s2, 256, "0x1p%Zd", ee);
1385 1.1.1.3 mrg
1386 1.1.1.3 mrg if (strcmp (s1, s2) != 0)
1387 1.1.1.3 mrg {
1388 1.1.1.3 mrg printf ("Error in check_emin_aux for emin = %ld\n", (long) e);
1389 1.1.1.3 mrg printf ("Expected %s\n", s2);
1390 1.1.1.3 mrg printf ("Got %s\n", s1);
1391 1.1.1.3 mrg exit (1);
1392 1.1.1.3 mrg }
1393 1.1.1.3 mrg
1394 1.1.1.3 mrg mpfr_free_str (s1);
1395 1.1.1.3 mrg
1396 1.1.1.3 mrg i = mpfr_asprintf (&s1, "%Rb", x);
1397 1.1.1.3 mrg MPFR_ASSERTN (i > 0);
1398 1.1.1.3 mrg
1399 1.1.1.3 mrg gmp_snprintf (s2, 256, "1p%Zd", ee);
1400 1.1.1.3 mrg
1401 1.1.1.3 mrg if (strcmp (s1, s2) != 0)
1402 1.1.1.3 mrg {
1403 1.1.1.3 mrg printf ("Error in check_emin_aux for emin = %ld\n", (long) e);
1404 1.1.1.3 mrg printf ("Expected %s\n", s2);
1405 1.1.1.3 mrg printf ("Got %s\n", s1);
1406 1.1.1.3 mrg exit (1);
1407 1.1.1.3 mrg }
1408 1.1.1.3 mrg
1409 1.1.1.3 mrg mpfr_free_str (s1);
1410 1.1.1.3 mrg
1411 1.1.1.3 mrg mpfr_clear (x);
1412 1.1.1.3 mrg mpz_clear (ee);
1413 1.1.1.3 mrg set_emin (emin);
1414 1.1.1.3 mrg }
1415 1.1.1.3 mrg
1416 1.1.1.3 mrg static void
1417 1.1.1.3 mrg check_emin (void)
1418 1.1.1.3 mrg {
1419 1.1.1.3 mrg check_emin_aux (-15);
1420 1.1.1.3 mrg check_emin_aux (mpfr_get_emin ());
1421 1.1.1.3 mrg check_emin_aux (MPFR_EMIN_MIN);
1422 1.1.1.3 mrg }
1423 1.1.1.3 mrg
1424 1.1.1.4 mrg static void
1425 1.1.1.4 mrg test20161214 (void)
1426 1.1.1.4 mrg {
1427 1.1.1.4 mrg mpfr_t x;
1428 1.1.1.4 mrg char buf[32];
1429 1.1.1.4 mrg const char s[] = "0x0.fffffffffffff8p+1024";
1430 1.1.1.4 mrg int r;
1431 1.1.1.4 mrg
1432 1.1.1.4 mrg mpfr_init2 (x, 64);
1433 1.1.1.4 mrg mpfr_set_str (x, s, 16, MPFR_RNDN);
1434 1.1.1.4 mrg r = mpfr_snprintf (buf, 32, "%.*RDf", -2, x);
1435 1.1.1.4 mrg MPFR_ASSERTN(r == 316);
1436 1.1.1.4 mrg r = mpfr_snprintf (buf, 32, "%.*RDf", INT_MIN + 1, x);
1437 1.1.1.4 mrg MPFR_ASSERTN(r == 316);
1438 1.1.1.4 mrg r = mpfr_snprintf (buf, 32, "%.*RDf", INT_MIN, x);
1439 1.1.1.4 mrg MPFR_ASSERTN(r == 316);
1440 1.1.1.4 mrg mpfr_clear (x);
1441 1.1.1.4 mrg }
1442 1.1.1.4 mrg
1443 1.1.1.4 mrg /* http://gforge.inria.fr/tracker/index.php?func=detail&aid=21056 */
1444 1.1.1.4 mrg static void
1445 1.1.1.4 mrg bug21056 (void)
1446 1.1.1.4 mrg {
1447 1.1.1.4 mrg mpfr_t x;
1448 1.1.1.4 mrg const char s[] = "0x0.fffffffffffff8p+1024";
1449 1.1.1.4 mrg int ndigits, r;
1450 1.1.1.4 mrg
1451 1.1.1.4 mrg mpfr_init2 (x, 64);
1452 1.1.1.4 mrg
1453 1.1.1.4 mrg mpfr_set_str (x, s, 16, MPFR_RNDN);
1454 1.1.1.4 mrg
1455 1.1.1.4 mrg ndigits = 1000;
1456 1.1.1.4 mrg r = mpfr_snprintf (0, 0, "%.*RDf", ndigits, x);
1457 1.1.1.4 mrg /* the return value should be ndigits + 310 */
1458 1.1.1.4 mrg MPFR_ASSERTN(r == ndigits + 310);
1459 1.1.1.4 mrg
1460 1.1.1.4 mrg ndigits = INT_MAX - 310;
1461 1.1.1.4 mrg r = mpfr_snprintf (0, 0, "%.*RDf", ndigits, x);
1462 1.1.1.4 mrg MPFR_ASSERTN(r == INT_MAX);
1463 1.1.1.4 mrg
1464 1.1.1.4 mrg ndigits = INT_MAX - 10;
1465 1.1.1.4 mrg r = mpfr_snprintf (0, 0, "%.*RDa", ndigits, x);
1466 1.1.1.4 mrg MPFR_ASSERTN(r == INT_MAX);
1467 1.1.1.4 mrg
1468 1.1.1.4 mrg ndigits = INT_MAX - 7;
1469 1.1.1.4 mrg r = mpfr_snprintf (0, 0, "%.*RDe", ndigits, x);
1470 1.1.1.4 mrg MPFR_ASSERTN(r == INT_MAX);
1471 1.1.1.4 mrg
1472 1.1.1.4 mrg ndigits = 1000;
1473 1.1.1.4 mrg r = mpfr_snprintf (0, 0, "%.*RDg", ndigits, x);
1474 1.1.1.4 mrg /* since trailing zeros are removed with %g, we get less digits */
1475 1.1.1.4 mrg MPFR_ASSERTN(r == 309);
1476 1.1.1.4 mrg
1477 1.1.1.4 mrg ndigits = INT_MAX;
1478 1.1.1.4 mrg r = mpfr_snprintf (0, 0, "%.*RDg", ndigits, x);
1479 1.1.1.4 mrg /* since trailing zeros are removed with %g, we get less digits */
1480 1.1.1.4 mrg MPFR_ASSERTN(r == 309);
1481 1.1.1.4 mrg
1482 1.1.1.4 mrg ndigits = INT_MAX - 1;
1483 1.1.1.4 mrg r = mpfr_snprintf (0, 0, "%#.*RDg", ndigits, x);
1484 1.1.1.4 mrg MPFR_ASSERTN(r == ndigits + 1);
1485 1.1.1.4 mrg
1486 1.1.1.4 mrg mpfr_clear (x);
1487 1.1.1.4 mrg }
1488 1.1.1.4 mrg
1489 1.1.1.4 mrg /* Fails for i = 5, i.e. t[i] = (size_t) UINT_MAX + 1,
1490 1.1.1.4 mrg with r11427 on 64-bit machines (4-byte int, 8-byte size_t).
1491 1.1.1.4 mrg On such machines, t[5] converted to int typically gives 0.
1492 1.1.1.4 mrg Note: the assumed behavior corresponds to the snprintf behavior
1493 1.1.1.4 mrg in ISO C, but this conflicts with POSIX:
1494 1.1.1.4 mrg https://sourceware.org/bugzilla/show_bug.cgi?id=14771#c2
1495 1.1.1.6 mrg https://austingroupbugs.net/view.php?id=761
1496 1.1.1.6 mrg https://austingroupbugs.net/view.php?id=1219
1497 1.1.1.5 mrg https://gcc.gnu.org/bugzilla/show_bug.cgi?id=87096
1498 1.1.1.5 mrg Fixed in r11429.
1499 1.1.1.4 mrg */
1500 1.1.1.4 mrg static void
1501 1.1.1.4 mrg snprintf_size (void)
1502 1.1.1.4 mrg {
1503 1.1.1.4 mrg mpfr_t x;
1504 1.1.1.4 mrg char buf[12];
1505 1.1.1.4 mrg const char s[] = "17.00000000";
1506 1.1.1.4 mrg size_t t[] = { 11, 12, 64, INT_MAX, (size_t) INT_MAX + 1,
1507 1.1.1.4 mrg (size_t) UINT_MAX + 1, (size_t) UINT_MAX + 2,
1508 1.1.1.4 mrg (size_t) -1 };
1509 1.1.1.4 mrg int i, r;
1510 1.1.1.4 mrg
1511 1.1.1.4 mrg mpfr_init2 (x, 64);
1512 1.1.1.4 mrg mpfr_set_ui (x, 17, MPFR_RNDN);
1513 1.1.1.4 mrg
1514 1.1.1.4 mrg for (i = 0; i < sizeof (t) / sizeof (*t); i++)
1515 1.1.1.4 mrg {
1516 1.1.1.4 mrg memset (buf, 0, sizeof (buf));
1517 1.1.1.4 mrg /* r = snprintf (buf, t[i], "%.8f", 17.0); */
1518 1.1.1.4 mrg r = mpfr_snprintf (buf, t[i], "%.8Rf", x);
1519 1.1.1.4 mrg if (r != 11 || (t[i] > 11 && strcmp (buf, s) != 0))
1520 1.1.1.4 mrg {
1521 1.1.1.4 mrg printf ("Error in snprintf_size for i = %d:\n", i);
1522 1.1.1.4 mrg printf ("expected r = 11, \"%s\"\n", s);
1523 1.1.1.4 mrg printf ("got r = %d, \"%s\"\n", r, buf);
1524 1.1.1.4 mrg exit (1);
1525 1.1.1.4 mrg }
1526 1.1.1.4 mrg }
1527 1.1.1.4 mrg
1528 1.1.1.4 mrg mpfr_clear (x);
1529 1.1.1.4 mrg }
1530 1.1.1.4 mrg
1531 1.1.1.4 mrg /* With r11516, n2 gets a random value for i = 0 only!
1532 1.1.1.4 mrg valgrind detects a problem for "nchar = buf.curr - buf.start;"
1533 1.1.1.4 mrg in the spec.spec == 'n' case. Indeed, there is no buffer when
1534 1.1.1.4 mrg size is 0. */
1535 1.1.1.4 mrg static void
1536 1.1.1.4 mrg percent_n (void)
1537 1.1.1.4 mrg {
1538 1.1.1.4 mrg int err = 0, i, j;
1539 1.1.1.4 mrg
1540 1.1.1.4 mrg for (i = 0; i < 24; i++)
1541 1.1.1.4 mrg for (j = 0; j < 3; j++)
1542 1.1.1.4 mrg {
1543 1.1.1.4 mrg volatile int n1, n2;
1544 1.1.1.4 mrg char buffer[64];
1545 1.1.1.4 mrg
1546 1.1.1.4 mrg memset (buffer, 0, 64);
1547 1.1.1.4 mrg n2 = -17;
1548 1.1.1.4 mrg n1 = mpfr_snprintf (buffer, i % 8, "%d%n", 123, &n2);
1549 1.1.1.4 mrg if (n1 != 3 || n2 != 3)
1550 1.1.1.4 mrg {
1551 1.1.1.4 mrg printf ("Error 1 in percent_n: i = %d, n1 = %d, n2 = %d\n",
1552 1.1.1.4 mrg i, n1, n2);
1553 1.1.1.4 mrg err = 1;
1554 1.1.1.4 mrg }
1555 1.1.1.4 mrg }
1556 1.1.1.4 mrg
1557 1.1.1.4 mrg if (err)
1558 1.1.1.4 mrg exit (1);
1559 1.1.1.4 mrg }
1560 1.1.1.4 mrg
1561 1.1.1.5 mrg struct clo
1562 1.1.1.5 mrg {
1563 1.1.1.5 mrg const char *fmt;
1564 1.1.1.5 mrg int width, r, e;
1565 1.1.1.5 mrg };
1566 1.1.1.5 mrg
1567 1.1.1.5 mrg static void
1568 1.1.1.5 mrg check_length_overflow (void)
1569 1.1.1.5 mrg {
1570 1.1.1.5 mrg mpfr_t x;
1571 1.1.1.5 mrg int i, r, e;
1572 1.1.1.5 mrg struct clo t[] = {
1573 1.1.1.5 mrg { "%Rg", 0, 1, 0 },
1574 1.1.1.5 mrg { "%*Rg", 1, 1, 0 },
1575 1.1.1.5 mrg { "%*Rg", -1, 1, 0 },
1576 1.1.1.5 mrg { "%5Rg", 0, 5, 0 },
1577 1.1.1.5 mrg { "%*Rg", 5, 5, 0 },
1578 1.1.1.5 mrg { "%*Rg", -5, 5, 0 },
1579 1.1.1.5 mrg #if INT_MAX == 2147483647
1580 1.1.1.5 mrg { "%2147483647Rg", 0, 2147483647, 0 },
1581 1.1.1.5 mrg { "%2147483647Rg ", 0, -1, 1 },
1582 1.1.1.5 mrg { "%2147483648Rg", 0, -1, 1 },
1583 1.1.1.5 mrg { "%18446744073709551616Rg", 0, -1, 1 },
1584 1.1.1.5 mrg { "%*Rg", 2147483647, 2147483647, 0 },
1585 1.1.1.5 mrg { "%*Rg", -2147483647, 2147483647, 0 },
1586 1.1.1.5 mrg # if INT_MIN < -INT_MAX
1587 1.1.1.5 mrg { "%*Rg", INT_MIN, -1, 1 },
1588 1.1.1.5 mrg # endif
1589 1.1.1.5 mrg #endif
1590 1.1.1.5 mrg };
1591 1.1.1.5 mrg
1592 1.1.1.5 mrg mpfr_init2 (x, MPFR_PREC_MIN);
1593 1.1.1.5 mrg mpfr_set_ui (x, 0, MPFR_RNDN);
1594 1.1.1.5 mrg
1595 1.1.1.5 mrg for (i = 0; i < numberof (t); i++)
1596 1.1.1.5 mrg {
1597 1.1.1.5 mrg errno = 0;
1598 1.1.1.5 mrg r = t[i].width == 0 ?
1599 1.1.1.5 mrg mpfr_snprintf (NULL, 0, t[i].fmt, x) :
1600 1.1.1.5 mrg mpfr_snprintf (NULL, 0, t[i].fmt, t[i].width, x);
1601 1.1.1.5 mrg e = errno;
1602 1.1.1.5 mrg if ((t[i].r < 0 ? r >= 0 : r != t[i].r)
1603 1.1.1.5 mrg #ifdef EOVERFLOW
1604 1.1.1.5 mrg || (t[i].e && e != EOVERFLOW)
1605 1.1.1.5 mrg #endif
1606 1.1.1.5 mrg )
1607 1.1.1.5 mrg {
1608 1.1.1.5 mrg printf ("Error in check_length_overflow for i=%d (%s %d)\n",
1609 1.1.1.5 mrg i, t[i].fmt, t[i].width);
1610 1.1.1.5 mrg printf ("Expected r=%d, got r=%d\n", t[i].r, r);
1611 1.1.1.5 mrg #ifdef EOVERFLOW
1612 1.1.1.5 mrg if (t[i].e && e != EOVERFLOW)
1613 1.1.1.5 mrg printf ("Expected errno=EOVERFLOW=%d, got errno=%d\n",
1614 1.1.1.5 mrg EOVERFLOW, e);
1615 1.1.1.5 mrg #endif
1616 1.1.1.5 mrg exit (1);
1617 1.1.1.5 mrg }
1618 1.1.1.5 mrg }
1619 1.1.1.5 mrg
1620 1.1.1.5 mrg mpfr_clear (x);
1621 1.1.1.5 mrg }
1622 1.1.1.5 mrg
1623 1.1.1.5 mrg #if defined(HAVE_LOCALE_H) && defined(HAVE_SETLOCALE)
1624 1.1.1.5 mrg
1625 1.1.1.5 mrg /* The following tests should be equivalent to those from test_locale()
1626 1.1.1.5 mrg in tprintf.c (remove the \n at the end of the test strings). */
1627 1.1.1.5 mrg
1628 1.1.1.5 mrg static void
1629 1.1.1.5 mrg test_locale (void)
1630 1.1.1.5 mrg {
1631 1.1.1.5 mrg const char * const tab_locale[] = {
1632 1.1.1.5 mrg "en_US",
1633 1.1.1.5 mrg "en_US.iso88591",
1634 1.1.1.5 mrg "en_US.iso885915",
1635 1.1.1.5 mrg "en_US.utf8"
1636 1.1.1.5 mrg };
1637 1.1.1.5 mrg int i;
1638 1.1.1.5 mrg mpfr_t x;
1639 1.1.1.5 mrg char v[] = "99999999999999999999999.5";
1640 1.1.1.5 mrg
1641 1.1.1.5 mrg for (i = 0; i < numberof(tab_locale); i++)
1642 1.1.1.5 mrg {
1643 1.1.1.5 mrg char *s;
1644 1.1.1.5 mrg
1645 1.1.1.5 mrg s = setlocale (LC_ALL, tab_locale[i]);
1646 1.1.1.5 mrg
1647 1.1.1.5 mrg if (s != NULL && MPFR_THOUSANDS_SEPARATOR == ',')
1648 1.1.1.5 mrg break;
1649 1.1.1.5 mrg }
1650 1.1.1.5 mrg
1651 1.1.1.5 mrg if (i == numberof(tab_locale))
1652 1.1.1.5 mrg {
1653 1.1.1.5 mrg if (getenv ("MPFR_CHECK_LOCALES") == NULL)
1654 1.1.1.5 mrg return;
1655 1.1.1.5 mrg
1656 1.1.1.5 mrg fprintf (stderr, "Cannot find a locale with ',' thousands separator.\n"
1657 1.1.1.5 mrg "Please install one of the en_US based locales.\n");
1658 1.1.1.5 mrg exit (1);
1659 1.1.1.5 mrg }
1660 1.1.1.5 mrg
1661 1.1.1.5 mrg mpfr_init2 (x, 113);
1662 1.1.1.5 mrg mpfr_set_ui (x, 10000, MPFR_RNDN);
1663 1.1.1.5 mrg
1664 1.1.1.5 mrg check_sprintf ("(1) 10000=10,000 ", "(1) 10000=%'Rg ", x);
1665 1.1.1.5 mrg check_sprintf ("(2) 10000=10,000.000000 ", "(2) 10000=%'Rf ", x);
1666 1.1.1.5 mrg
1667 1.1.1.5 mrg mpfr_set_ui (x, 1000, MPFR_RNDN);
1668 1.1.1.5 mrg check_sprintf ("(3) 1000=1,000.000000 ", "(3) 1000=%'Rf ", x);
1669 1.1.1.5 mrg
1670 1.1.1.5 mrg for (i = 1; i <= sizeof (v) - 3; i++)
1671 1.1.1.5 mrg {
1672 1.1.1.5 mrg char buf[64];
1673 1.1.1.5 mrg int j;
1674 1.1.1.5 mrg
1675 1.1.1.5 mrg strcpy (buf, "(4) 10^i=1");
1676 1.1.1.5 mrg for (j = i; j > 0; j--)
1677 1.1.1.6 mrg strcat (buf, (j % 3 == 0) ? ",0" : "0");
1678 1.1.1.5 mrg strcat (buf, " ");
1679 1.1.1.5 mrg mpfr_set_str (x, v + sizeof (v) - 3 - i, 10, MPFR_RNDN);
1680 1.1.1.5 mrg check_sprintf (buf, "(4) 10^i=%'.0Rf ", x);
1681 1.1.1.5 mrg }
1682 1.1.1.5 mrg
1683 1.1.1.5 mrg #define N0 20
1684 1.1.1.5 mrg
1685 1.1.1.5 mrg for (i = 1; i <= N0; i++)
1686 1.1.1.5 mrg {
1687 1.1.1.5 mrg char s[N0+4], buf[64];
1688 1.1.1.5 mrg int j;
1689 1.1.1.5 mrg
1690 1.1.1.5 mrg s[0] = '1';
1691 1.1.1.5 mrg for (j = 1; j <= i; j++)
1692 1.1.1.5 mrg s[j] = '0';
1693 1.1.1.5 mrg s[i+1] = '\0';
1694 1.1.1.5 mrg
1695 1.1.1.5 mrg strcpy (buf, "(5) 10^i=1");
1696 1.1.1.5 mrg for (j = i; j > 0; j--)
1697 1.1.1.6 mrg strcat (buf, (j % 3 == 0) ? ",0" : "0");
1698 1.1.1.5 mrg strcat (buf, " ");
1699 1.1.1.5 mrg
1700 1.1.1.5 mrg mpfr_set_str (x, s, 10, MPFR_RNDN);
1701 1.1.1.5 mrg
1702 1.1.1.5 mrg check_sprintf (buf, "(5) 10^i=%'.0RNf ", x);
1703 1.1.1.5 mrg check_sprintf (buf, "(5) 10^i=%'.0RZf ", x);
1704 1.1.1.5 mrg check_sprintf (buf, "(5) 10^i=%'.0RUf ", x);
1705 1.1.1.5 mrg check_sprintf (buf, "(5) 10^i=%'.0RDf ", x);
1706 1.1.1.5 mrg check_sprintf (buf, "(5) 10^i=%'.0RYf ", x);
1707 1.1.1.5 mrg
1708 1.1.1.5 mrg strcat (s + (i + 1), ".5");
1709 1.1.1.5 mrg check_sprintf (buf, "(5) 10^i=%'.0Rf ", x);
1710 1.1.1.5 mrg }
1711 1.1.1.5 mrg
1712 1.1.1.5 mrg mpfr_set_str (x, "1000", 10, MPFR_RNDN);
1713 1.1.1.5 mrg check_sprintf ("00000001e+03", "%'012.3Rg", x);
1714 1.1.1.5 mrg check_sprintf ("00000001,000", "%'012.4Rg", x);
1715 1.1.1.5 mrg check_sprintf ("000000001,000", "%'013.4Rg", x);
1716 1.1.1.5 mrg
1717 1.1.1.5 mrg #ifdef PRINTF_GROUPFLAG
1718 1.1.1.5 mrg check_vsprintf ("+01,234,567 :", "%0+ -'13.10Pd:", (mpfr_prec_t) 1234567);
1719 1.1.1.5 mrg #endif
1720 1.1.1.5 mrg
1721 1.1.1.5 mrg mpfr_clear (x);
1722 1.1.1.5 mrg }
1723 1.1.1.5 mrg
1724 1.1.1.5 mrg #else
1725 1.1.1.5 mrg
1726 1.1.1.5 mrg static void
1727 1.1.1.5 mrg test_locale (void)
1728 1.1.1.5 mrg {
1729 1.1.1.5 mrg if (getenv ("MPFR_CHECK_LOCALES") != NULL)
1730 1.1.1.5 mrg {
1731 1.1.1.5 mrg fprintf (stderr, "Cannot test locales.\n");
1732 1.1.1.5 mrg exit (1);
1733 1.1.1.5 mrg }
1734 1.1.1.5 mrg }
1735 1.1.1.5 mrg
1736 1.1.1.5 mrg #endif
1737 1.1.1.5 mrg
1738 1.1 mrg int
1739 1.1 mrg main (int argc, char **argv)
1740 1.1 mrg {
1741 1.1.1.4 mrg int k;
1742 1.1 mrg
1743 1.1 mrg tests_start_mpfr ();
1744 1.1 mrg
1745 1.1 mrg #if defined(HAVE_LOCALE_H) && defined(HAVE_SETLOCALE)
1746 1.1 mrg /* currently, we just check with 'C' locale */
1747 1.1.1.4 mrg setlocale (LC_ALL, "C");
1748 1.1 mrg #endif
1749 1.1 mrg
1750 1.1.1.2 mrg bug20111102 ();
1751 1.1.1.4 mrg
1752 1.1.1.4 mrg for (k = 0; k < 40; k++)
1753 1.1.1.4 mrg {
1754 1.1.1.4 mrg native_types ();
1755 1.1.1.4 mrg hexadecimal ();
1756 1.1.1.4 mrg binary ();
1757 1.1.1.4 mrg decimal ();
1758 1.1 mrg
1759 1.1.1.5 mrg #if defined(HAVE_LOCALE_H) && defined(HAVE_SETLOCALE) && MPFR_LCONV_DPTS
1760 1.1.1.4 mrg locale_da_DK ();
1761 1.1.1.5 mrg #else
1762 1.1.1.5 mrg if (getenv ("MPFR_CHECK_LOCALES") != NULL)
1763 1.1.1.5 mrg {
1764 1.1.1.5 mrg fprintf (stderr, "Cannot test locales.\n");
1765 1.1.1.5 mrg exit (1);
1766 1.1.1.5 mrg }
1767 1.1 mrg #endif
1768 1.1.1.4 mrg }
1769 1.1.1.4 mrg
1770 1.1.1.4 mrg check_emax ();
1771 1.1.1.4 mrg check_emin ();
1772 1.1.1.4 mrg test20161214 ();
1773 1.1.1.4 mrg bug21056 ();
1774 1.1.1.4 mrg snprintf_size ();
1775 1.1.1.4 mrg percent_n ();
1776 1.1.1.4 mrg mixed ();
1777 1.1.1.5 mrg check_length_overflow ();
1778 1.1.1.5 mrg test_locale ();
1779 1.1 mrg
1780 1.1 mrg if (getenv ("MPFR_CHECK_LIBC_PRINTF"))
1781 1.1 mrg {
1782 1.1 mrg /* check against libc */
1783 1.1 mrg random_double ();
1784 1.1 mrg bug20081214 ();
1785 1.1 mrg bug20080610 ();
1786 1.1 mrg }
1787 1.1 mrg
1788 1.1 mrg tests_end_mpfr ();
1789 1.1 mrg return 0;
1790 1.1 mrg }
1791 1.1 mrg
1792 1.1 mrg #else /* HAVE_STDARG */
1793 1.1 mrg
1794 1.1 mrg int
1795 1.1 mrg main (void)
1796 1.1 mrg {
1797 1.1 mrg /* We have nothing to test. */
1798 1.1.1.2 mrg return 77;
1799 1.1 mrg }
1800 1.1 mrg
1801 1.1 mrg #endif /* HAVE_STDARG */
1802