[comp.lang.smalltalk] Fixed Point Arithmetic: subclass Fraction

jans@tekgvs.GVS.TEK.COM (Jan Steinman) (07/19/88)

<jfh@rpp386.UUCP (The Beach Bum):>
<<wcs@skep2.UUCP (46323-Bill.Stewart.[ho95c],2G218,x0705,):>>
<<<georg@unido.UUCP (Georg A. M. Heeg):>>>

<<<As basic technology we need decimal fixed point arithmetic.  The fiscal 
office certainly does not accept rounding errors through floating point 
arithmetic...>>>

<<Surprise!  You'll get roundoff errors just as badly in fixed decimal..>>

I think Georg's use of "rounding errors" is a misnomer.  Floating point is 
unacceptable for business applications due to "drop-off errors", where 
significant digits are actually lost in accumulation (+-) math.

<The division of two integers yields an object of class Fraction, which is 
simply a representation of the division as a "reduced" fraction...>

(Thanks for the great lead in, Bart!)  A few years ago, I implemented 
fixed-point in Smalltalk, as a subclass of Fraction.  (I'd post the code, but I 
can't find it just now.)  It worked fine for everything but #printOn: -- after 
hours of crawling through Knuth, I couldn't find a simple way to do the 
generalized case of representing fixed point numbers with arbitrary deltas, 
except for coercing the whole thing to Float.  If you are only interested in 
deltas that are powers of ten, the problem of representation is vastly 
simplified! :-)

By subclassing Fraction, the problem is essentially reduced to producing the 
proper conversion methods, such that $123.45 is stored as 12345/100, etc.  Math 
methods are all inherited, and maintain (for practical purposes) infinite 
precision.  (Well, until the damn things get so big that paging makes it 
impractical.)

Smalltalk is a language that even Carl Sagan ("billions and billions") could 
get along with! 

:::::: Software Productivity Technologies -- Experiment Manager Project ::::::
:::::: Jan Steinman N7JDB	Box 500, MS 50-383	(w)503/627-5881 ::::::
:::::: jans@tekcrl.TEK.COM	Beaverton, OR 97077	(h)503/657-7703 ::::::