I tried the followind (in C) to test how much was lost when storing in a
float:
float x=0.00000011920928955078125f;
printf("%.25f\n", x);
The output is exactly:
0.0000001192092895507812500
Wow!!
For some reason, Mr Fish chose a number which is exactly representable as a
float var.
Anyway, with arbitrary numbers like 0.00000012268758375648363f, the output
is 0.0000001226875809834382400. You get 8 correct significant digits. But
the correct digits is not the important thing, but the precision of the
stored value, or the error of the representation.
The error in that case is around -2.77e-15. If the original number
represented a length of 12.2 cm (approx. the diameter of a CD) expressed in
strange units like thousands of km [:-)], the error would be equivalent to 3
millionths of a millimeter, or around 30 times the diameter of a hydrogen
atom. Is it that bad?
Let's not just look at the written digits (in decimal), counting how many
are right. Let's look at the accuracy of the values for a particular
application. Decimal is just a representation, which can be as bad as
binary, it's just a different one. We should not see a decimal
representation as the perfect one.
float is not that bad for many, many tasks, but double is sure more suitable
for many others.
"Karl Heinz Buchegger" <kb******@gascad.at> escribió en el mensaje
news:43***************@gascad.at...
Mr Fish wrote:
Is it possible for me to record floats in a std::stringstream with
100% accuracy? If so how?
Here's a little prog that demonstrates how the default ss loses
accuracy
//--------------------------------------------------------------------------
--- #include <sstream>
#include <iostream>
using namespace std;
int main()
{
stringstream ss;
float fOriginal = 0.00000011920928955078125f;
In most implementations I am aware of, float is capable of holding
5 to 6 digits. Apply that to your number, and you get:
1.19209 E -7
everything else in your number is already lost. Even the 9 in the
last digit is already a questionable one. Things get worse if you
do sme arithmetic with that number.
As a minimum: forget 'float' and start using 'double'.
Unless you know what you do and are willing to do it and have the
knowledge to do it and have a very, very, very good reason: never
use float.
--
Karl Heinz Buchegger
kb******@gascad.at