scsh-0.5/rts/lize.scm

36 lines
1.0 KiB
Scheme

; Copyright (c) 1993, 1994 Richard Kelsey and Jonathan Rees. See file COPYING.
; Simplest rational within an interval. Copied from IEEE P1178/D4 nimpl.tex.
(define (rationalize x e)
(let ((e (abs 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
(/ 1 (simplest-rational-internal
(/ 1 (- y fy))
(/ 1 (- x fx))))))
(else
(+ 1 fx)))))
;; Do some juggling to satisfy preconditions of simplest-rational-internal.
(cond ((not (< x y))
(if (rational? x) x (error "(rationalize <irrational> 0)" x)))
((positive? x)
(simplest-rational-internal x y))
((negative? y)
(- 0 (simplest-rational-internal (- 0 y) (- 0 x))))
(else
(if (and (exact? x) (exact? y))
0
(exact->inexact 0)))))