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