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" <(E-Mail Removed)> escribió en el mensaje

news:(E-Mail Removed)...

> 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

> (E-Mail Removed)