[oct-cvs] Oct commit: oct qd.lisp

rtoy rtoy at common-lisp.net
Sat Oct 13 15:34:51 UTC 2007


Update of /project/oct/cvsroot/oct
In directory clnet:/tmp/cvs-serv23423

Modified Files:
	qd.lisp 
Log Message:
Redo implementation of INTEGER-DECODE-QD.  It used to return way too
many digits if one of the components was 0.  This causes problems
because the resulting integer can't even be coerced back to a
quad-double. 


--- /project/oct/cvsroot/oct/qd.lisp	2007/09/18 11:20:16	1.54
+++ /project/oct/cvsroot/oct/qd.lisp	2007/10/13 15:34:51	1.55
@@ -1064,6 +1064,7 @@
 		  lo-exp
 		  sign)))))
 
+#+(or)
 (defun integer-decode-qd (q)
   (declare (type %quad-double q))
   ;; Integer decode each component and then create the appropriate
@@ -1093,6 +1094,63 @@
 		  q3-exp
 		  q0-sign))))))
 
+#+(or)
+(defun integer-decode-qd (q)
+  (declare (type %quad-double q))
+  ;; Integer decode each component and then create the appropriate
+  ;; integer by shifting and adding all the parts together.  If any
+  ;; component is zero, we stop.
+  (multiple-value-bind (q0-int q0-exp q0-sign)
+      (integer-decode-float (qd-0 q))
+    (if (zerop (qd-1 q))
+	(values q0-int q0-exp q0-sign)
+	(multiple-value-bind (q1-int q1-exp q1-sign)
+	    (integer-decode-float (qd-1 q))
+	  (setf q0-int (+ (ash q0-int (- q0-exp q1-exp))
+			  (* q1-sign q1-int)))
+	  (if (zerop (qd-2 q))
+	      (values q0-int q1-exp q0-sign)
+	      (multiple-value-bind (q2-int q2-exp q2-sign)
+		  (integer-decode-float (qd-2 q))
+		(setf q0-int (+ (ash q0-int (- q1-exp q2-exp))
+				(* q2-sign q2-int)))
+		(if (zerop (qd-3 q))
+		    (values q0-int q2-exp q0-sign)
+		    (multiple-value-bind (q3-int q3-exp q3-sign)
+			(integer-decode-float (qd-3 q))
+		      (values (+ (ash q0-int (- q2-exp q3-exp))
+				 (* q3-sign q3-int))
+			      q3-exp
+			      q0-sign)))))))))
+
+(defun integer-decode-qd (q)
+  (declare (type %quad-double q))
+  ;; Integer decode each component and then create the appropriate
+  ;; integer by shifting and adding all the parts together.  If any
+  ;; component is zero, we stop.
+  (multiple-value-bind (q0-int q0-exp q0-sign)
+      (integer-decode-float (qd-0 q))
+    (when (zerop (qd-1 q))
+      (return-from integer-decode-qd (values q0-int q0-exp q0-sign)))
+    (multiple-value-bind (q1-int q1-exp q1-sign)
+	(integer-decode-float (qd-1 q))
+      (setf q0-int (+ (ash q0-int (- q0-exp q1-exp))
+		      (* q1-sign q1-int)))
+      (when (zerop (qd-2 q))
+	(return-from integer-decode-qd (values q0-int q1-exp q0-sign)))
+      (multiple-value-bind (q2-int q2-exp q2-sign)
+	  (integer-decode-float (qd-2 q))
+	(setf q0-int (+ (ash q0-int (- q1-exp q2-exp))
+			(* q2-sign q2-int)))
+	(when (zerop (qd-3 q))
+	  (return-from integer-decode-qd (values q0-int q2-exp q0-sign)))
+	(multiple-value-bind (q3-int q3-exp q3-sign)
+	    (integer-decode-float (qd-3 q))
+	  (values (+ (ash q0-int (- q2-exp q3-exp))
+		     (* q3-sign q3-int))
+		  q3-exp
+		  q0-sign))))))
+
 (declaim (inline scale-float-qd))
 #+(or)
 (defun scale-float-qd (qd k)




More information about the oct-cvs mailing list