
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 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 :-) HTH, John.