|
Posted by Peter J. Holzer on March 1, 2008, 10:32 am
Please log in for more thread options
> --------------------------------------------------------------------
>
> 4.2: Why is int() broken?
>
> Your "int()" is most probably working just fine. It's the numbers that
> aren't quite what you think.
>
> First, see the answer to "Why am I getting long decimals (eg,
> 19.9499999999999) instead of the numbers I should be getting (eg,
> 19.95)?".
>
> For example, this
>
> print int(0.6/0.2-2), "\n";
Why subtract 2? This example works just as well without the subtraction:
perl -e 'print int(0.6/0.2), "\n";'
2
> will in most computers print 0, not 1, because even such simple numbers
> as 0.6 and 0.2 cannot be presented exactly by floating-point numbers.
I don't like the phrase "even such simple numbers as 0.6 and 0.2". It
implies that these numbers are "simple" and that there is much less of a
chance that such "complicated" numbers as 952279704355844 or
0.845794282927275986594395362772047519683837890625 can be represented
exactly, when in fact they can. Also "by floating-point numbers" is
incorrect in its generality - they could be represented by decimal
floating-point numbers.
How about
... because 0.6 and 0.2 cannot be presented exactly by binary
floating-point numbers because they are not multiples of a power of
two.
> What you think in the above as 'three' is really more like
> 2.9999999999999995559.
And that can be easily demonstrated by subtracting 3:
perl -e 'print +(0.6/0.2) - 3, "\n";'
-4.44089209850063e-16
hp
|