On Oct 28, 2009, at 3:30 PM, Marnen Laibow-Koser wrote:
> That is not the issue here -- after all, BigDecimal does precise
> arithmetic, but only with rational numbers.  The issue is rather that
> IEEE 754 does an inadequate job of representing arbitrary rational
> numbers, and the small errors are accumulated and magnified in
> calculations.

I'd like to emphasize the fact that it is a very specific
representation problem that most often leads to a thread such
as this. That problem is a misunderstanding about the nature
of converting between a base 10 literal and a base 2 internal
value.

Many people don't realize that floating point literals written
in base 10 (such as 123.6) may not have an exact finite
representation when converted to base 2 and similarly a finite
base 2 floating point value may not have a finite representation
in base 10.

In the original post the floating point subtraction in the
expression (123.6 - 123.0) is handled just fine.  The problem
is that 123.6 can't be represented exactly as a base 2 floating
point value so the subtraction that actually gets done is

123.599999999999994315658113919198513031005859375 - 123.0

and the result

0.599999999999994315658113919198513031005859375

is rounded via Ruby's Float#to_s method to

0.599999999999994

Gary Wright