(declaim (optimize (speed 3) (space 0) (safety 0) (debug 0)))

(defmacro bench (&body code)
	 (let ((start-time (gensym)) (end-time (gensym)))
	   `(let ((,start-time (get-internal-real-time)))
	      ,@code
	      (let ((,end-time (get-internal-real-time)))
		(/ (- ,end-time ,start-time) internal-time-units-per-second)))))

(defun ulps (&optional (iterations 10000000))
  (/ iterations (bench (loop for i fixnum from iterations downto 1))))

(format t "~A megaulps~%" (round (/ (ulps) 1000000)))
