
Boost : 
From: John Maddock (john_at_[hidden])
Date: 20060314 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
> same
> since there are a number of floating point values which have no exact
> representation in the C++ floating point formats. That is simply
> because
> of the nature of floating point representation used in C++ and most
> modern languages. After all, the number of floating point values
> within
> 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 viceversa, 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 roundtrip numbers in this way (I know because I've reported
these as bugs!), getting roundtrip binarydecimalbinary conversion right
is actually pretty hard.
The classic "What Every Computer Scientist Should Know About FloatingPoint
Arithmetic" at http://docs.sun.com/source/8063568/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 pdigit 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 binarydecimal
conversion BTW :)
HTH, John.
Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk