;;; -*- Mode:LISP; Package:USER; Base:8 -*- ;;; percentage of lossage goes up here as %TV-CLOCK-RATE gets smaller. ;;; (defun test-probe (name value) (let ((old (get name 'test-probe))) (cond ((null old) (setf (get name 'test-probe) value) value) ((eql old value) value) ('else (incf (get name 'test-probe-lossage)) (format t "~&Lossage at ~S, expecting ~S but got ~S~%" name old value) value)))) (defun clear-probes (&rest l) (dolist (name l) (setf (get name 'test-probe) nil) (setf (get name 'test-probe-lossage) 0))) (defun losenum (x n) (clear-probes 'f 'i2 'exp) (do ((first (sqrt x)) (j 0 (1+ j)) (losers 0) (loser)) ((= j n) (quotient (float losers) j)) (setq loser (my-sqrt x)) (unless (= first loser) (incf losers) (format t "~&Lossage at ~D ~S vs ~S~%" j first loser)))) (defun my-sqrt (number) (let ((n (float number))) (let ((f (+ n 0.0f0)) (i2 (si:%float-double 0 1)) ;cons up a new one -- gets munged (exp (- (si:%single-float-exponent n) si:single-float-exponent-offset -2))) (setf (si:%single-float-exponent f) si:single-float-exponent-offset) (setf (si:%single-float-exponent i2) (+ si:single-float-exponent-offset (if (oddp exp) (1+ (dpb (ldb #o0127 exp) #o0027 exp)) (dpb (ldb #o0127 exp) #o0027 exp)))) (test-probe 'f f) (test-probe 'i2 i2) (test-probe 'exp exp) (do ((i 0 (1+ i)) (an (* i2 (+ 0.4826004 f (if (oddp exp) -0.25 0.0))))) ((= i 4) an) (setq an (* 0.5 (+ an (// n an))))))))