implementation categories, exact rationals Aubrey Jaffer (14 Oct 2005 18:29 UTC)
Re: implementation categories, exact rationals John.Cowan (14 Oct 2005 19:26 UTC)
Re: implementation categories, exact rationals Aubrey Jaffer (14 Oct 2005 19:38 UTC)
Re: implementation categories, exact rationals John.Cowan (14 Oct 2005 20:16 UTC)
Re: implementation categories, exact rationals bear (16 Oct 2005 18:08 UTC)
Re: implementation categories, exact rationals Michael Sperber (17 Oct 2005 07:44 UTC)
Re: implementation categories, exact rationals Aubrey Jaffer (17 Oct 2005 21:59 UTC)
Re: implementation categories, exact rationals Bradley Lucier (17 Oct 2005 22:07 UTC)

Re: implementation categories, exact rationals bear 16 Oct 2005 18:08 UTC


On Fri, 14 Oct 2005, Aubrey Jaffer wrote:

> What is the rationale for mandating exact rationals?  Over 15 years I
> have written numerical Scheme code for everything from symbolic
> algebra to Galois fields to linear systems to optics simulations
> without needing exact rationals.

Unlimited-precision rationals are absolutely irreplaceable  - when
they are exactly what a given application requires.  But that's mostly
number-theory and related domains, which isn't very common in practice.

In practice, what I've found is that unlimited-precision rationals
cause straightforward calculations to explode and take unlimited
memory space and time, unless you are careful to throw the appropriate
exact->inexact call in a critical place or remember to type a point
with the arguments that need to be inexact.

And, code written to *avoid* the use of unlimited-precision, which
is usually necessary, is (however trivially) more complicated than
code that uses it (or winds up using it even though it contributes
little, or negatively, to the code's utility).

I see newbies fall into the trap, too often; they write something
that should do a simple series expansion, and watch aghast as it
mysteriously consumes all available resources.  Or code that worked
fine on one scheme implementation explodes on a different one that
provides unlimited rationals, creating an unnecessary porting issue.

So I see it as having conflicting design principles:

    "Optimize the common or most useful case" generally means avoiding
    unlimited-precision calculations really shouldn't be something you
    have to think about.  Representation and operation times that
    expand toward infinity are anathema when you are optimizing -
    optimization forces you to regard numbers as representations on
    a (finite) physical computer with bounded processing power.

    "Numbers are independent of their representation and exact whenever
    possible" on the other hand says that rationals should be used
    by default, whenever possible. The fact that representation and
    time used quickly expand toward infinity in many common calculations
    is irrelevant to this principle which regards numbers as abstractions
    and code as merely a means for *expression* of algorithms.

Finding an appropriate compromise between these principles is at
best a ticklish business.  We don't want to cripple scheme for people
who actually need unlimited-precision rationals, but at the same time
we'd like to optimize the common case, meaning that in the course of
ordinary programming we shouldn't have to think about *avoiding*
unlimited-precision rationals.

				Bear