in reply to Re^2: Getting different results with $var++ and $var += 1
in thread Getting different results with $var++ and $var += 1
Ah. The old decimal fraction in binary floating point malarkey.
The reason for prefering to hold currency as, say, pennies or cents is that it ensures that the value is exact. If you hold the pennies or cents as a fraction in binary floating point, it is unlikely to be exact.
For example, when decimal 1.51 is converted to a binary fraction the result is:
1.1000_0010_1000_1111_0101_1100_0010_1000_1111_0101_1100_0010_1000_1111_0101_1100_0010_1000_1111_0101...which you can see is a repeating binary fraction, some part of which will be rounded off.
Most decimal fractions are like this... so before any errors can be introduced by rounding and what not in any arithmetic you go on to do, most decimal fractions have a built-in "representation" error.
Much of the time you won't see the "representation" error, because conversion back to decimal rounds it off. This can lead to bafflement when two values look the same when printed out, but fail $x == $y.
Addition and subtraction are the more difficult floating point operations, so you're more likely to see the problems there. Consider:
which gives:print 1.09 - 1, "\n" ; print "0.84 - 0.34 == ", 0.84 - 0.34, ( 0.84 - 0.34 == 0.5 ? " ==" : " but !=" ), " 0.5\n" ;
0.0900000000000001 0.84 - 0.34 == 0.5 but != 0.5it really makes me wonder why we persist in using binary floating point for decimal arithmetic !
|
|---|
| Replies are listed 'Best First'. | |
|---|---|
|
Re^4: Getting different results with $var++ and $var += 1
by jczeus (Monk) on Dec 04, 2008 at 07:37 UTC | |
|
Re^4: Getting different results with $var++ and $var += 1
by JavaFan (Canon) on Dec 04, 2008 at 00:47 UTC | |
by gone2015 (Deacon) on Dec 04, 2008 at 09:23 UTC | |
by Corion (Patriarch) on Dec 04, 2008 at 09:26 UTC | |
by gone2015 (Deacon) on Dec 04, 2008 at 10:50 UTC |