[oct-cvs] Oct commit: oct qd.lisp
rtoy
rtoy at common-lisp.net
Thu Oct 18 14:38:12 UTC 2007
Update of /project/oct/cvsroot/oct
In directory clnet:/tmp/cvs-serv27776
Modified Files:
qd.lisp
Log Message:
MAKE-QD-DD is only defined for CMUCL, so don't unconditionally inline
it.
--- /project/oct/cvsroot/oct/qd.lisp 2007/10/16 17:05:13 1.59
+++ /project/oct/cvsroot/oct/qd.lisp 2007/10/18 14:38:11 1.60
@@ -136,6 +136,7 @@
sub-qd-dd
sub-qd-d
sub-d-qd
+ #+cmu
make-qd-dd
abs-qd
qd->
@@ -833,6 +834,32 @@
(renorm-4 q0 q1 q2 q3)
(%make-qd-d q0 q1 q2 q3)))))))
+(declaim (inline invert-qd))
+
+(defun invert-qd(v) ;; a quartic newton iteration for 1/v
+ ;; to invert v, start with a good guess, x.
+ ;; let h= 1-v*x ;; h is small
+ ;; return x+ x*(h+h^2+h^3) . compute h3 in double-float
+ ;; enough accuracy.
+
+ (let*
+ ((x (%make-qd-d (cl:/ (qd-0 v)) 0d0 0d0 0d0))
+ (h (add-qd-d (neg-qd (mul-qd v x))
+ 1.0d0))
+ (h2 (mul-qd h h)) ;also use h2 for target
+ (h3 (* (qd-0 h) (qd-0 h2))))
+ (declare (type %quad-double v h h2)
+ (double-float h3))
+ (add-qd x
+ (mul-qd x
+ (add-qd h (add-qd-d h2 h3))))))
+
+(defun div-qd-i (a b)
+ (declare (type %quad-double a b)
+ (optimize (speed 3)
+ (space 0)))
+ (mul-qd a (invert-qd b)))
+
;; Non-sloppy divide
#+(or)
(defun div-qd (a b)
More information about the oct-cvs
mailing list