flonum-arith.scm 1.1 KB

123456789101112131415161718192021222324252627282930313233343536373839
  1. ; Part of Scheme 48 1.9. See file COPYING for notices and license.
  2. ; Authors: Richard Kelsey, Jonathan Rees, Mike Sperber
  3. (define (binary-flonum-op proc)
  4. (lambda (x y)
  5. (save-temp0! x)
  6. (save-temp1! y)
  7. (let ((key (ensure-space double-size)))
  8. (enter-double (proc (extract-double (recover-temp0!))
  9. (extract-double (recover-temp1!)))
  10. key))))
  11. (define flonum-add (binary-flonum-op fl+))
  12. (define flonum-subtract (binary-flonum-op fl-))
  13. (define flonum-multiply (binary-flonum-op fl*))
  14. (define flonum-divide (binary-flonum-op fl/))
  15. (define (flonum-comparison proc)
  16. (lambda (x y)
  17. (proc (extract-double x)
  18. (extract-double y))))
  19. (define flonum= (flonum-comparison fl=))
  20. (define flonum< (flonum-comparison fl<))
  21. (define flonum> (flonum-comparison (lambda (x y)
  22. (fl< y x))))
  23. (define flonum<= (flonum-comparison (lambda (x y)
  24. (not (fl< y x)))))
  25. (define flonum>= (flonum-comparison (lambda (x y)
  26. (not (fl< x y)))))
  27. (define (flonum-rational? n)
  28. (let ((x (extract-double n)))
  29. ;; infinities and NaNs aren't rational
  30. (and (fl= x x)
  31. (not (fl= x (fl/ 1.0 0.0)))
  32. (not (fl= x (fl/ -1.0 0.0))))))