The strtod removal of trailing 0s from the integer part with a negative exponent doesn't adjust the exponent correctly (by 4) for each 0 removed from a hex number. if (dig_no == int_no && dig_no > 0 && exponent < 0) do { while (! (base == 16 ? ISXDIGIT (expp[-1]) : ISDIGIT (expp[-1]))) --expp; if (expp[-1] != L_('0')) break; --expp; --dig_no; --int_no; ++exponent; } while (dig_no > 0 && exponent < 0); Testcase: #include <stdio.h> #include <stdlib.h> int main(void) { printf("%g\n", atof("0x10p-1")); return 0; } prints 1 but should print 8.
Fixed in cvs.
Subject: Bug 3674 CVSROOT: /cvs/glibc Module name: libc Branch: glibc-2_5-branch Changes by: jakub@sourceware.org 2007-01-12 18:07:19 Modified files: . : ChangeLog stdlib : Makefile strtod_l.c Added files: stdlib : tst-atof1.c tst-atof2.c tst-strtod2.c tst-strtod3.c Log message: * stdlib/Makefile (tst-strtod3-ENV): Define. * stdlib/strtod_l.c (____STRTOF_INTERNAL): Parse thousand separators also if no non-zero digits found. * stdlib/Makefile (tests): Add tst-strtod3. [BZ #3664] * stdlib/strtod_l.c (____STRTOF_INTERNAL): Fix test to recognize empty parsed strings. * stdlib/Makefile (tests): Add tst-strtod2. * stdlib/tst-strtod2.c: New file. [BZ #3673] * stdlib/strtod_l.c (____STRTOF_INTERNAL): Fix exp_limit computation. * stdlib/Makefile (tests): Add tst-atof2. * stdlib/tst-atof2.c: New file. [BZ #3674] * stdlib/strtod_l.c (____STRTOF_INTERNAL): Adjust exponent value correctly if removing trailing zero of hex-float. * stdlib/Makefile (tests): Add tst-atof1. * stdlib/tst-atof1.c: New file. Patches: http://sourceware.org/cgi-bin/cvsweb.cgi/libc/ChangeLog.diff?cvsroot=glibc&only_with_tag=glibc-2_5-branch&r1=1.10362.2.28&r2=1.10362.2.29 http://sourceware.org/cgi-bin/cvsweb.cgi/libc/stdlib/tst-atof1.c.diff?cvsroot=glibc&only_with_tag=glibc-2_5-branch&r1=NONE&r2=1.1.4.1 http://sourceware.org/cgi-bin/cvsweb.cgi/libc/stdlib/tst-atof2.c.diff?cvsroot=glibc&only_with_tag=glibc-2_5-branch&r1=NONE&r2=1.1.4.1 http://sourceware.org/cgi-bin/cvsweb.cgi/libc/stdlib/tst-strtod2.c.diff?cvsroot=glibc&only_with_tag=glibc-2_5-branch&r1=NONE&r2=1.3.2.1 http://sourceware.org/cgi-bin/cvsweb.cgi/libc/stdlib/tst-strtod3.c.diff?cvsroot=glibc&only_with_tag=glibc-2_5-branch&r1=NONE&r2=1.1.4.1 http://sourceware.org/cgi-bin/cvsweb.cgi/libc/stdlib/Makefile.diff?cvsroot=glibc&only_with_tag=glibc-2_5-branch&r1=1.109.2.2&r2=1.109.2.3 http://sourceware.org/cgi-bin/cvsweb.cgi/libc/stdlib/strtod_l.c.diff?cvsroot=glibc&only_with_tag=glibc-2_5-branch&r1=1.14&r2=1.14.2.1