What steps will reproduce the problem?
1.output a floating point number such as 1 + eps
What version of the product are you using? On what operating system?
0.3.0, affects 0.5.0 too
What is the expected output? What do you see instead?
A number that when parsed yields the same value that was converted, instead a
different number is yielded.
See this or many other threads for detail:
http://stackoverflow.com/questions/4738768/printing-double-without-losing-precis
ion
The executive summary is that digits10 is truncating the fractional digits a
floating point number has and the round-trip output-input will be different in
many cases. You should instead clamp at digits10+1 and arguably set the
defaults to be fully preserving as well to minimize surprises. Patch attached
that does this. Alternatively use/implement David Gay's algorithm to convert
to the shortest string which yields the same value could be used to keep yaml
files small, preserve readability and what the computer actually had in memory
at time of serialization.
http://www.ampl.com/REFS/rounding.pdf
David Gay's implementation:
http://www.netlib.org/fp/dtoa.c
http://www.netlib.org/fp/g_fmt.c
Apparently it is used all over the place (python, numerous web-browsers and
popular databases) so it seems this is the defacto way to do it.
You may also want to use C/C++ strtod on input, which again likely borrows much
of David's code as iostreams don't handle numerous cases, in particular
denormed values (you likely already handle nan/inf)
http://www.cplusplus.com/reference/cstdlib/strtod/
http://www.cplusplus.com/reference/string/stod/
Original issue reported on code.google.com by
nev...@gmail.comon 10 Apr 2013 at 1:06Attachments: