Index: strtod.c =================================================================== RCS file: /cvs/src/src/newlib/libc/stdlib/strtod.c,v retrieving revision 1.16 diff -p -u -r1.16 strtod.c --- strtod.c 3 Dec 2009 16:11:27 -0000 1.16 +++ strtod.c 26 Oct 2010 14:12:09 -0000 @@ -299,10 +299,17 @@ _DEFUN (_strtod_r, (ptr, s00, se), } s0 = s; y = z = 0; +#if DBL_DIG >= 8 + #define YDIG 9 + #define ZDIG 16 + #else + #define YDIG (DBL_DIG+1) + #define ZDIG YDIG +#endif for(nd = nf = 0; (c = *s) >= '0' && c <= '9'; nd++, s++) - if (nd < 9) + if (nd < YDIG) y = 10*y + c - '0'; - else if (nd < 16) + else if (nd < ZDIG) z = 10*z + c - '0'; nd0 = nd; if (strncmp (s, _localeconv_r (ptr)->decimal_point, @@ -327,11 +334,11 @@ _DEFUN (_strtod_r, (ptr, s00, se), if (c -= '0') { nf += nz; for(i = 1; i < nz; i++) - if (nd++ < 9) + if (nd++ < YDIG) y *= 10; else if (nd <= DBL_DIG + 1) z *= 10; - if (nd++ < 9) + if (nd++ < YDIG) y = 10*y + c; else if (nd <= DBL_DIG + 1) z = 10*z + c; @@ -441,12 +448,12 @@ _DEFUN (_strtod_r, (ptr, s00, se), nd0 = nd; k = nd < DBL_DIG + 1 ? nd : DBL_DIG + 1; dval(rv) = y; - if (k > 9) { + if (k > YDIG) { #ifdef SET_INEXACT if (k > DBL_DIG) oldinexact = get_inexact(); #endif - dval(rv) = tens[k - 9] * dval(rv) + z; + dval(rv) = tens[k - YDIG] * dval(rv) + z; } bd0 = 0; if (nd <= DBL_DIG