The strtod implementation, when handling a hexadecimal value with more
digits than needed to compute the mantissa, passes a value "dig_no>
0" as the last argument to round_and_return. The meaning of this
argument is whether any subsequent bits (after the mantissa and
subsequent MP limb that includes at least the half-ulp bit) are
nonzero.
dig_no here counts the number of remaining digits *including* the one
being processed, so is always positive here and half-way values always
get rounded away from zero. Furthermore, while trailing zeros after
'.' have been excluded from consideration earlier, those before '.'
have not.
I propose this patch to fix this bug by checking the rest of the
string for nonzero digits. Because of the earlier handling of
trailing zeros, there is no need to check for '.' here; if it occurs
before dig_no becomes 0, there must be a nonzero digit after the '.'
(and so '.' can be treated like a nonzero digit). Tested x86_64.
2012-05-02 Joseph Myers<joseph@codesourcery.com>
[BZ #14049]
* stdlib/strtod_l.c (____STRTOF_INTERNAL): Check for trailing
nonzero digits before rounding a hex value.
* stdlib/tst-strtod.c (tests): Add another test.