[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
(rationalize x y)
Ed Ferguson and I want to clarify some issues concerning the Scheme
procedure "rationalize", which is documented in R3RS as follows:
(rationalize x y) procedure
(rationalize x) procedure
These procedures create integers and rationals. Their
results are exact if and only if their arguments are exact.
[...] With two arguments, RATIONALIZE produces the rational
number with smallest denominator differing from X by no more
than Y. With one argument, RATIONALIZE produces the best
rational approximation to X, preserving all of the precision in
(1) When Y is supplied and is non-zero, it would seem more proper to
return an inexact result (unless perhaps that result is `=' to X and X
(2) Although the notation indicates that the argument X is real, would
it be frivolous to say that (RATIONALIZE Z Y), where Z is a non-real
complex number, is defined by
(make-rectangular (rationalize (real-part z y))
(rationalize (imag-part z y))) ?
Two objections come to mind: (2a) this discriminates against an
implementation that uses polar representation, and (2b) one might want
to interpret Y as a error term for the magnitude rather than for the
real and imaginary parts separately.
(3) Do we really want an absolute error test or is a relative error
test sometimes more appropriate?
(4) The wording ``rational number with smallest denominator differing
from X by no more than Y'' seems to rule out using Euclid's algorithm
and continued fractions. That is, suppose W is the first number whose
difference from X is less than Y in the continued fraction series of
successively better approximations to X. Euclid doesn't guarantee
that there is no number within Y of X with smaller denominator than
W's. Did the author of these words have a different algorithm in mind?
As an example, consider (RATIONALIZE 11/16 1/4). The successive
convergents to 11/16 using continued fractions are 0, 1, 2/3, and
11/16. The first number in that series which is within 1/4 of 11/16
is 2/3, but the value 1/2 is also within 1/4 of 11/16 and has a