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