``` Subject: Re: Scheme and Rational Numbers From: rpw3@rigden.engr.sgi.com (Rob Warnock) Date: 2 Feb 2001 13:50:38 GMT Newsgroups: comp.lang.scheme Message-ID: <95edve\$158f2\$1@fido.engr.sgi.com> ```
```David Rush  <kumo@bellsouth.net> wrote:
+---------------
| As far as I know, Scheme is the *only* computer language that has taken
| this bull by its horns and developed a fairly sensible approach to it.
+---------------

One of the few, perhaps, but certainly not the "only". Common Lisp's
numeric class/type hierarchy treats rationals much like Scheme's numeric
tower, and in fact the ANSI standard explores the subtleties somewhat
more than the Scheme report(s).

Where Common Lisp & Scheme mainly differ is that Scheme's numeric types
form a strict "tower" with a (nearly) orthogonal notion of "exactness",
whereas Common Lisp has a somewhat richer tree-structured hierarchy of
numeric types with some kinds of numbers being disjoint types, rather than
sub-/super-types of each other, and exactness (or not) being defined in rules
for arithmetic of and on various types. See <URL:http://www.xanalys.com/
software_tools/reference/HyperSpec/Body/chap-12.html> "Numbers". I didn't
see a single overall type/class diagram anywhere, but the following
(extracted from various sections) implicitly defines the tree:

- The type number contains objects which represent mathematical
numbers. The types real and complex are disjoint subtypes of number.
- The type real includes all numbers that represent mathematical
real numbers, though there are mathematical real numbers (e.g.,
irrational numbers) that do not have an exact representation in
Common Lisp.
- The types rational and float are disjoint subtypes of type real.
- The types integer and ratio are disjoint subtypes of type rational.
The canonical representation of a rational is as an integer if its
value is integral, and otherwise as a ratio.
- The types fixnum and bignum form an exhaustive partition of type
integer.
- A fixnum is an integer whose value is between most-negative-fixnum
and most-positive-fixnum inclusive. The type fixnum is required
to be a supertype of (signed-byte 16).
- A ratio is a number representing the mathematical ratio of two
non-zero integers, the numerator and denominator, whose greatest
common divisor is one, and of which the denominator is positive
and greater than one.
- A float is a mathematical rational (but not a Common Lisp rational)
of the form s*f*b^e-p, where [details omitted]...
- The types short-float, single-float, double-float, and long-float
are subtypes of type float. Any two of them must be either disjoint
types or the same type; if the same type, then any other types
between them in the above ordering must also be the same type.
- The type complex includes all mathematical complex numbers other
than those included in the type rational. Complexes are expressed
in Cartesian form with a real part and an imaginary part, each of
which is a real. The real part and imaginary part are either both
rational or both of the same float type. The imaginary part can be
a float zero, but can never be a rational zero, for such a number
is always represented by Common Lisp as a rational rather than a
complex.

Common Lisp also has the types signed-byte, unsigned-byte, and bit, with
the type hierarchy for the latter being:

bit, unsigned-byte, signed-byte, integer, rational, real, number, t

It also has interval types [such as "(integer 0 1)", which is how "bit"
is actually defined].

-Rob

-----
Rob Warnock, 31-2-510		rpw3@sgi.com
SGI Network Engineering		http://reality.sgi.com/rpw3/
1600 Amphitheatre Pkwy.		Phone: 650-933-1673
Mountain View, CA  94043	PP-ASEL-IA

```