(unit/sig
  (huge tiny epsilon find-huge find-tiny find-epsilon janus add-list)
  (import plt:userspace^)

;; (find-epsilon seed)
;; hone in on a number eps such that 1.0+eps = 1.0
;;
(define find-epsilon
    (lambda (eps)
          (if (= 1. (+ 1. (/ eps 2.0)))
	      eps
	      (find-epsilon (/ eps 2.0)))))

;; (find-tiny seed)
;; find a number tiny, such that tiny/2.0 underflows
;;
(define find-tiny
    (lambda (x)
          (if (not (= x (* (/ x 2.0) 2.0)))
	      x
	      (find-tiny (/ x 2.0)))))
;; (find-huge seed)
;; find a number huge, such that huge*2.0 overflows
;;
(define find-huge
    (lambda (x)
          (if (not (= x (/ (* x 2) 2)))
	      x
	      (find-huge (* x 2.0)))))

(define huge (find-huge 1.0))
(define tiny (find-tiny 1.0))
(define epsilon (find-epsilon 1.0))

;; a list which gives very different results
;; depending on which direction it's added
;;
(define janus
  (list 31 2e34
           -1.234567890123456789012345e80
	   2749 -2939234
           -2e33
	   3.2e270
	   17
	   -2.4e270
           4.234429473844582741e+170
           1
	   -0.8e270
           0
	   99))

(define add-list
  (lambda (numList)
    (apply + numList)))
)
