Inherent imprecision of floating point variables
Tim Writer
writer at me.utoronto.ca
Thu Jun 28 19:22:52 AEST 1990
In article <b3f.2688bfce at ibmpcug.co.uk> dylan at ibmpcug.co.uk (Matthew Farwell) writes:
>main()
>{
> float f;
> f = 0.0;
> while (1) {
> if (f == 10.0) break;
> printf("%f\n", f);
> f += 0.1;
> }
> printf("Stopped\n");
>}
>If its all to do with conversion routines ...
As has been mentioned in several earlier postings, it is *not* all to do with
conversion routines. It *is* to do with the fact that no floating point
system can represent any real number exactly. Your documentation will tell
you that a float can represent real numbers within in a specific interval.
However, since we know there are an infinite number of reals in any given
interval, we can deduce that your floating point system can only represent
a relative few of these numbers exactly. Thus, when you write `0.1' and
`10.0' in your program, your computer may not store exactly `0.1' or `10.0'.
Then, when you continuously add `0.1', you are not actually adding `0.1' but
some value close to `0.1'. The result is you never get `10.0' because you
have accumulated some error in `f'.
Try this program.
main()
{
float f,
stop;
f = 0.0;
stop = 10.0;
while (1) {
if (f == stop)
break;
f += 0.1;
(void) printf("f=%.20f\tstop=%.20f\n",f,stop);
}
}
Now try this program.
main()
{
float eps,
tst;
eps=1.0;
do {
eps=0.5*eps;
tst=eps+1.0;
} while (tst>1.0);
(void) printf("%.10e\n",eps);
}
This gives an approximation of machine epsilon which differs from its real
value by at most a factor of 2. Machine epsilon is defined to be the
smallest number which when added to 1 produces a result which is greater than
1. It is a measure of the relative error in the floating point
representation of real numbers. On my system, this program gives a value
of roughly 5.9e-8. In other words, I can represent floats with about 8,
yes *only* 8 digits accuracy. Or, to rephrase, any digits following the
eighth digit of the mantissa are garbage.
Tim
More information about the Comp.lang.c
mailing list