From: Richard Fateman <fateman@cs...> - 2013-03-29 23:53:00
I have found it convenient to extend, in principle, the CL rational
allowing division by zero. In particular 0/0, 1/0 are
legitimate numbers representing "undefined" -- like the floating point NaN,
and an unsigned projective infinity. This project infinity makes sense
think of the rational numbers as positions on a circle where infinity and
minus infinity are the same point, opposite 0.
To do so generally requires LESS WORK, in the following senses.
1. first use a modified gcd such that gcd(x,0)=x except if x=0, then
the gcd is 1.
Right now, (gcd -4 0) is 4 rather than -4, and (gcd 0 0) =1 rather
2. computing a/b+c/d one computes the ratio(a*d+c*b, b*d). then reduces..
if a/b = 1/0, the result is ratio(d,0), divide numerator and denominator
by gcd(d,0) which is d, giving ratio(1,0).
3. computing a/b * c/d one computes the ratio(a*c/b*d).
if a/b = 0/0, the result is ratio(0,0).
divide by gcd(0,0)=1. giving ratio(0,0)
if a/b = 1/0, the result is ratio(c,0), divide by gcd to get ration(1,0).
fringe stuff: conversion to float formats: use NaN and Inf.
It is also possible to produce an AFFINE model with rationals,
allowing -1/0 to represent negative infinity. And I think this would
be more useful.
This however requires a little more checking. See the reference above
Why do I care? I would like to do interval arithmetic really neatly in
SBCL, as opposed to slightly-less neatly. Ideally one would be able to
patch the rational arithmetic in a running SBCL by reading in some file.
(Code for this using a user-defined class ERAT for extended rational
is available, but it's building a whole layer on top of the rationals.)