;-*- Mode:     Lisp -*-
;;;; Author:   Paul Dietz
;;;; Created:  Wed Aug 20 22:05:20 2003
;;;; Contains: Tests of the EPSILON constants





(deftest epsilons.1
  (loop for e in (list short-float-epsilon single-float-epsilon
                       double-float-epsilon long-float-epsilon)
        when (= (float 1 e) (+ (float 1 e) e))
        collect e)
  nil)

(deftest epsilons.2
  (loop for e in (list short-float-negative-epsilon
                       single-float-negative-epsilon
                       double-float-negative-epsilon
                       long-float-negative-epsilon)
        when (= (float 1 e) (- (float 1 e) e))
        collect e)
  nil)

(deftest epsilons.3
  (loop for e in (list short-float-epsilon single-float-epsilon
                       double-float-epsilon long-float-epsilon)
        unless (= (float 1 e) (+ (float 1 e) (/ e 2)))
        collect e)
  nil)

(deftest epsilons.4
  (loop for e in (list short-float-negative-epsilon
                       single-float-negative-epsilon
                       double-float-negative-epsilon
                       long-float-negative-epsilon)
        unless (= (float 1 e) (- (float 1 e) (/ e 2)))
        collect e)
  nil)

(deftest epsilons.5
  (loop for (type var) in
        '(
          (short-float short-float-epsilon)
          (short-float short-float-negative-epsilon)
          (single-float single-float-epsilon)
          (single-float single-float-negative-epsilon)
          (double-float double-float-epsilon)
          (double-float double-float-negative-epsilon)
          (long-float long-float-epsilon)
          (long-float long-float-negative-epsilon))
        for val = (symbol-value var)
        unless (typep val type)
        collect (list type var val))
  nil)

(deftest epsilons.6
  (flet ((%check (x) (/= 1.0s0 (+ 1.0s0 x))))
    (let ((eps (float-binary-search #'%check 0.0s0 1.0s0)))
      (if (= eps short-float-epsilon)
          :good
        (list eps short-float-epsilon))))
  :good)

(deftest epsilons.7
  (flet ((%check (x) (/= 1.0f0 (+ 1.0f0 x))))
    (let ((eps (float-binary-search #'%check 0.0f0 1.0f0)))
      (if (= eps single-float-epsilon)
          :good
        (list eps single-float-epsilon))))
  :good)

(deftest epsilons.8
  (flet ((%check (x) (/= 1.0d0 (+ 1.0d0 x))))
    (let ((eps (float-binary-search #'%check 0.0d0 1.0d0)))
      (if (= eps double-float-epsilon)
          :good
        (list eps double-float-epsilon))))
  :good)

(deftest epsilons.9
  (flet ((%check (x) (/= 1.0l0 (+ 1.0l0 x))))
    (let ((eps (float-binary-search #'%check 0.0l0 1.0l0)))
      (if (= eps long-float-epsilon)
          :good
        (list eps long-float-epsilon))))
  :good)

(deftest epsilons.10
  (flet ((%check (x) (/= 1.0s0 (- 1.0s0 x))))
    (let ((eps (float-binary-search #'%check 0.0s0 1.0s0)))
      (if (= eps short-float-negative-epsilon)
          :good
        (list eps short-float-negative-epsilon))))
  :good)

(deftest epsilons.11
  (flet ((%check (x) (/= 1.0f0 (- 1.0f0 x))))
    (let ((eps (float-binary-search #'%check 0.0f0 1.0f0)))
      (if (= eps single-float-negative-epsilon)
          :good
        (list eps single-float-negative-epsilon))))
  :good)

(deftest epsilons.12
  (flet ((%check (x) (/= 1.0d0 (- 1.0d0 x))))
    (let ((eps (float-binary-search #'%check 0.0d0 1.0d0)))
      (if (= eps double-float-negative-epsilon)
          :good
        (list eps double-float-negative-epsilon))))
  :good)

(deftest epsilons.13
  (flet ((%check (x) (/= 1.0l0 (- 1.0l0 x))))
    (let ((eps (float-binary-search #'%check 0.0l0 1.0l0)))
      (if (= eps long-float-negative-epsilon)
          :good
        (list eps long-float-negative-epsilon))))
  :good)






