From: John Maddock (john_at_[hidden])
Date: 2006-03-14 14:22:31
> This is a common cause of errors when using floating point values.
> Writing a floating point value to a string representation, as are XML
> values, and attempting to read that string representation back, does
> not guarantee that the floating point value will remain exactly the
> since there are a number of floating point values which have no exact
> representation in the C++ floating point formats. That is simply
> of the nature of floating point representation used in C++ and most
> modern languages. After all, the number of floating point values
> any range of numbers is infinite while the C++ floating point
> representation cab not be. The only way to guarantee what you want for
> floating point values is to write and read back to a binary
> representation of the value.
While it's true that some decimal values have no exact binary representation
and vice-versa, I believe you *should* be able to write as a decimal string
and read back in, and get the same value, provided:
* You write enough digits to the file, numeric_limits<T>::digits + 2 seems
to be enough, but I wouldn't want to guarantee that.
* You're std lib is bug free: there certainly have been cases of std lib's
that don't round-trip numbers in this way (I know because I've reported
these as bugs!), getting round-trip binary-decimal-binary conversion right
is actually pretty hard.
The classic "What Every Computer Scientist Should Know About Floating-Point
Arithmetic" at http://docs.sun.com/source/806-3568/ncg_goldberg.html fills
in the details: 9 decimal digits are required for single precision reals,
and 17 for double precision, a formula is also given that allows you to
check that you have enough decimal digits for some p-digit binary number.
It's also apparent that reading in a decimal number correctly requires
extended precision arithmetic, so I suspect most problems are likely to
occur when serialising the widest floating point type on the system. Even
Knuth says "leave it to the experts" when discussing binary-decimal
conversion BTW :-)
Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk