Boost logo

Boost :

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
> 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 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 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 :-)

HTH, John.

Boost list run by bdawes at, gregod at, cpdaniel at, john at