How do we handle --

Richard Wackerbarth rkw@dataplex.net
Fri, 28 Jul 2000 17:15:19 -0500


On Fri, 28 Jul 2000, Jason Rennie wrote:
> So, here something from left field...
>
> All of this discussion concerning roundoff error, internal number
> representation, etc. seems to be assuming that there *is* a right answer.
> i.e. if we discuss and think hard enough, we'll be able to come up with a
> solution that will always do the right think with respect to roundoff
> error.
>
> Another approach would be to assume that we can't win, go with the
> floating point representation that we have and allow the user to fix
> roundoff "errors" by explicitly stating what a*b equals when a
> price*amount calculation doesn't match what it needs to be.

Actually, there are two problems.
1) Calculating the "right" answer.
   Here I agree with your suggestion. In effect, we "guess" at an answer
   and allow the user to correct it if we are wrong.
2) Precision of calculation.
   This is a numerical analysis problem. Even if we display the correct
   result for each entry, we will eventually end up with a "roundoff" error
   whereby the total is not equal to the sum of the displayed parts. For
   accounting purposes, this is not acceptable. As a result, we must be able
   to represent the exact number displayed, not just an approximation to it.
   We do this by counting in units of the smallest displayed change. (For
   example cents rather than dollars). Thus the sum will be exact and roundoff
   will not accumulate. After the calculation, we can convert to any desired
   units for display. (Display 123 cents as $1.23)

Some may have forgotten that it is not floating point, per se, that is the 
problem. It is that floating point dollars cannot form an exact 
representation of cents. It is also a problem that we must adjust each 
displayed quantity to be exactly the number displayed. Although this can be 
done in floating point, it is much easier to do so in integer. Also, since 
you don't waste bits for an exponent, you can represent a larger value within 
the same register size.