From fateman@peoplesparc.Berkeley.EDU Thu Feb 21 17:13:08 1991
Received: from peoplesparc.Berkeley.EDU by centralsparc.Berkeley.EDU (4.1/1.42)
id AA06449; Thu, 21 Feb 91 17:13:05 PST
Received: by peoplesparc.Berkeley.EDU (4.1/1.42)
id AA00428; Thu, 21 Feb 91 17:09:13 PST
Date: Thu, 21 Feb 91 17:09:13 PST
From: fateman@peoplesparc.Berkeley.EDU (Richard Fateman)
Message-Id: <9102220109.AA00428@peoplesparc.Berkeley.EDU>
To: cox@franz.com, jkf@franz.com, smh@franz.com, gls@think.com
Cc: fateman@peoplesparc.Berkeley.EDU
Subject: extended rational numbers in CL
Status: R
How hard would it be to change a CL system to
make (/ 1 0) return the ratio 1/0 (a short-hand for infinity)?
and to make (/ 0 0) return the ratio 0/0 (a short-hand for indeterminate)?
These are, in some sense, already "in" CL as IEEE values. Perhaps an
alternative would be to make these into IEEE Not-a-Numbers.
Has anyone broached this subject in CL standardization?
Is any of this stuff accessible at a level in Allegro CL that can be
changed?
There are addition, multiplication and division tables for the quantities
1/0, -1/0, 0/0 combining with r (a positive rational or integer).
e.g. (I haven't proofread this stuff carefully but...)
* r 1/0 -1/0 0/0
---------------------
r r^2 1/0 -1/0 0/0
-r -r^2 -1/0 1/0 0/0
1/0 1/0 1/0 -1/0 0/0
-1/0 -1/0 -1/0 1/0 0/0
0/0 0/0 0/0 0/0 0/0
+ r 1/0 -1/0 0/0
----------------------
r 2r 1/0 -1/0 0/0
1/0 1/0 1/0 0/0 0/0
-1/0 -1/0 0/0 0/0 0/0
0/0 0/0 0/0 0/0 0/0
/ r -r 0 1/0 -1/0 0/0 (numerator)
------------------------
r 1 -1 0 1/0 -1/0 0/0
-r -1 1 0 -1/0 1/0 0/0
0 1/0 -1/0 0/0 1/0 -1/0 0/0
1/0 0 0 0 0/0 0/0 0/0
-1/0 0 0 0 0/0 0/0 0/0
0/0 0/0 0/0 0/0 0/0 0/0 0/0
also, -0/0 -> 0/0 ;; -(1/0) -> -1/0
Additional rules gcd(0,0)=0,
gcd(0/0, anythingbutzero) = 0/0
gcd(1/0,r) is 1 ?
gcd(-1/0,r) is -1 ?
1/0 -1/0 0/0
rationalp t t t
plusp t nil nil
minusp nil t nil
zerop nil nil nil
comparisons
all comparisons return nil if an argument is 0/0.
otherwise -1/0 is less than any finite number or 1/0
and 1/0 is greater than any finite number or -1/0.
(I wrote all these above in Franz Lisp many years ago... surprisingly,
the code is in many places SMALLER than would otherwise be the
case if you were checking for division by zero).
We also need to define
exp log isqrt sin cos tan cis asin acos atan
sinh cosh tanh asinh acosh atanh
signum ceiling floor truncate round numerator denominator mod.
(The reason I raise this issue again, is that I would like to
use a system with these semantics, and I would prefer not to
shadow everything in CL's number system.)
Thanks,
RJF