This site is a static rendering of the Trac instance that was used by R7RS-WG1 for its work on R7RS-small (PDF), which was ratified in 2013. For more information, see Home. For a version of this page that may be more recent, see RationalizeDefinition in WG2's repo for R7RS-large.


2012-04-19 08:39:12

This implementation of rationalize is taken from the IEEE Scheme standard, which is not freely available. The code is by Alan Bawden, and the theory is from Hardy and Wright's Introduction to the Theory of Numbers, 5th edition (1979).

(define (rationalize x e) (simplest-rational (- x e) (+ x e))) (define (simplest-rational x y) (define (simplest-rational-internal x y) ;; assumes 0 < X < Y (let ((fx (floor x)) (fy (floor y))) (cond ((not (< fx x)) fx) ((= fx fy) (+ fx (/ (simplest-rational-internal (/ (- y fy)) (/ (- x fx)))))) (else (+ 1 fx))))) ;; do some juggling to satisfy preconditions ;; of simplest-rational-internal. (cond ((< y x) (simplest-rational y x)) ((not (< x y)) (if (rational? x) x (error))) ((positive? x) (simplest-rational-internal x y)) ((negative? y) (- (simplest-rational-internal (- y) (- x)))) (else (if (and (exact? x) (exact? y)) 0 0.0))))