"Sean O'Dell" <sean / celsoft.com> writes: > On Wednesday 12 May 2004 10:18, Dave Thomas wrote: >> On May 12, 2004, at 12:07, Sean O'Dell wrote: >> > On Wednesday 12 May 2004 09:53, ts wrote: >> >>>>>>> "S" == Sean O'Dell <sean / celsoft.com> writes: >> >> >> >> S> raise "false" if ((625.91 + 900.00 + 22.00) != 1547.91) >> > >> > How old is this bug? When is it >> > getting fixed? >> >> It's about 40 years old, and unlikely to be fixed. Floating point >> numbers are not represented exactly inside computers, and so floating >> point comparisons are routinely deprecated in books on programming. >> Certain values cannot ever be expressed in floating point >> representation. >> >> If you want exact, fractional, math, you should probably use the >> 'rational' library and investigate 'mathn'. > > Funny though, if I set a variable to 1547.91 exactly, it is > represented just fine. A value during the arithmetic must be a value > which can't be represented. Even the value 1547.91 might not be stored exactly as that value in its internal floating point representation. Doing the arithmentic isn't the only way that "exact" values to become inexact. Even the mere storing the number internally in a floating point value might cause it it lose accuracy. Doing arithmetic simply causes these errors to accumulate, and therefore be more likely to occur in a result. For example, this number looks exact, but actually, it's an infinitely repeating fraction in binary: 0.1 This is true for many "exact" values. Therefore, you will lose accuracy simply by referencing many decimal numbers in floating point. > I had to massage my floating point math in C/C++ a lot many years ago, > but I always assumed it was a flaw in the MS compiler, and once I got > in the habit of doing it, I forgot about it. You have a basic misunderstanding of floating point math if you consider its rounding and truncation characteristics to be a compiler bug. As other people have mentioned, there is a BigDecimal class in Ruby that behaves closer to the way that you want. Also, consider this: if you always want the computer to give you exact results, what should these exact results be for each of the following arithmetic evaluations? ... a = 1/3 b = Math.atan2(1.0, 1.0) c = Math.sqrt(5) How many decimal points should they go to. Where should they round? > Thanks for the info. I'm far less bitter now about having to round the > numbers for comparison. =) > > Sean O'Dell -- Lloyd Zusman ljz / asfast.com God bless you.