[movitz-cvs] CVS movitz/losp/muerte
ffjeld
ffjeld at common-lisp.net
Thu Apr 17 19:35:20 UTC 2008
Update of /project/movitz/cvsroot/movitz/losp/muerte
In directory clnet:/tmp/cvs-serv14977
Modified Files:
ratios.lisp
Log Message:
More float "emulation".
--- /project/movitz/cvsroot/movitz/losp/muerte/ratios.lisp 2007/04/08 13:44:44 1.10
+++ /project/movitz/cvsroot/movitz/losp/muerte/ratios.lisp 2008/04/17 19:35:20 1.11
@@ -10,7 +10,7 @@
;;;; Author: Frode Vatvedt Fjeld <frodef at acm.org>
;;;; Created at: Tue Jul 20 00:39:59 2004
;;;;
-;;;; $Id: ratios.lisp,v 1.10 2007/04/08 13:44:44 ffjeld Exp $
+;;;; $Id: ratios.lisp,v 1.11 2008/04/17 19:35:20 ffjeld Exp $
;;;;
;;;;------------------------------------------------------------------
@@ -76,10 +76,17 @@
(integer 1)
(ratio (%ratio-denominator x))))
-(defconstant least-positive-short-float 1/1000)
-(defconstant least-positive-single-float 1/1000)
-(defconstant least-positive-double-float 1/1000)
-(defconstant least-positive-long-float 1/1000)
+;;; "Floats"
+
+(defconstant most-negative-short-float most-negative-fixnum)
+(defconstant most-negative-single-float most-negative-fixnum)
+(defconstant most-negative-long-float most-negative-fixnum)
+(defconstant most-negative-double-float most-negative-fixnum)
+
+(defconstant least-positive-short-float 1/100000)
+(defconstant least-positive-single-float 1/100000)
+(defconstant least-positive-double-float 1/100000)
+(defconstant least-positive-long-float 1/100000)
;;;
@@ -87,6 +94,40 @@
(defvar long-float-epsilon 1/10000)
+(defun float (x &optional proto)
+ (declare (ignore proto))
+ (check-type x float)
+ x)
+
+(defun float-radix (x)
+ (if (integerp x)
+ 2
+ (denominator x)))
+
+(defun integer-decode-float (x)
+ (if (integerp x)
+ (if (minusp x)
+ (values x 0 -1)
+ (values x 0 1))
+ (let ((n (numerator x)))
+ (if (minusp x)
+ (values n -1 -1)
+ (values n -1 1)))))
+
+(defun decode-float (x)
+ (multiple-value-bind (n sign)
+ (let ((n (numerator x)))
+ (if (minusp n)
+ (values (- n) -1)
+ (values n 1)))
+ (let* ((r (float-radix x))
+ (d (denominator x))
+ (e (if (= 1 d) 0 -1)))
+ (do () ((< n 1)
+ (values n e sign))
+ (setf n (/ n r))
+ (incf e)))))
+
(defun cos (x)
"http://mathworld.wolfram.com/Cosine.html"
(do* ((rad (mod x 44/7))
More information about the Movitz-cvs
mailing list