"bug" in gmp_scanf et al.?
Ronald Bruck
bruck at usc.edu
Wed Mar 10 00:39:28 CET 2010
This doesn't qualify as a bug, as far as I'm concerned, except that it's unexpected behavior.
gmp_scanf, gmp_fscanf, and gmp_sscanf all consider a real number of the form 1.23e to be malformed. I'm inclined to agree; but that's not what seems to be the C standard. At least I deduce that from this program, compiled with icc. (I haven't c checked to see if the compiler's behavior is correct.)
#include <stdio.h>
#include <stdlib.h>
#include <gmp.h>
int main (int argc, char **argv)
{
char buf[1024];
double f;
mpf_t t;
mpf_init (t);
if (argc == 1) {
fprintf (stderr, "Usage: test string\n");
exit (-1);
}
/* First print as a string. */
sscanf (argv[1], "%s", buf);
printf ("string = \"%s\"\n", buf);
/* Then print using C's sscanf/printf */
sscanf (buf, "%le", &f);
printf ("scanf = %le\n", f);
/* Finally, print using GMP's sscanf/printf */
gmp_sscanf (buf, "%Fe", t);
gmp_printf ("gmpscanf = %Fe\n", t);
}
Compiling this as program "test" and executing
test 1.23e7
results in an output of
string = "1.23e7"
scanf = 1.230000e+07
gmpscanf = 1.230000e+07
whereas executing
test 1.23e
results in
string = "1.23e"
scanf = 1.230000e+00
gmpscanf = 0.000000e+00
This behavior is also true of hexadecimal reals, such as 0.abcd@ That is, gmp considers it malformed; standard C doesn't recognize it at all.
-- Ron Bruck
More information about the gmp-bugs
mailing list