Update of /project/oct/cvsroot/oct In directory clnet:/tmp/cvs-serv23811
Modified Files: qd-io.lisp Log Message: Use more bits (265 instead of 212) when converting a rational to a quad-double. This fixes the issue that converting 10^100 to a quad-double isn't as accurate as it could be.
--- /project/oct/cvsroot/oct/qd-io.lisp 2007/09/12 02:31:14 1.15 +++ /project/oct/cvsroot/oct/qd-io.lisp 2007/09/24 02:37:31 1.16 @@ -340,29 +340,25 @@ (neg-qd (mul-qd xx yy)) (mul-qd xx yy)))) (t - (let* #+nil - ((hi (ldb (byte 106 (cl:- len 106)) int)) - (lo (ldb (byte 106 (cl:- len 212)) int)) - (xx (make-qd-dd (cl:* sign (scale-float (float hi 1w0) - (cl:- len 106))) - (cl:* sign (scale-float (float lo 1w0) - (cl:- len 106 106))))) - (yy (npow (make-qd-d 10d0) - power))) - ((q0 (ldb (byte 53 (cl:- len 53)) int)) - (q1 (ldb (byte 53 (cl:- len (* 2 53))) int)) - (q2 (ldb (byte 53 (cl:- len (* 3 53))) int)) - (q3 (ldb (byte 53 (cl:- len (* 4 53))) int)) - (xx (make-qd-d (scale-float (float q0 1d0) - (cl:- len 53)) - (scale-float (float q1 1d0) - (cl:- len (* 2 53))) - (scale-float (float q2 1d0) - (cl:- len (* 3 53))) - (scale-float (float q3 1d0) - (cl:- len (* 4 53))))) - (yy (npow (make-qd-d 10d0) - power))) + (let* + ((q0 (ldb (byte 53 (cl:- len 53)) int)) + (q1 (ldb (byte 53 (cl:- len (* 2 53))) int)) + (q2 (ldb (byte 53 (cl:- len (* 3 53))) int)) + (q3 (ldb (byte 53 (cl:- len (* 4 53))) int)) + (q4 (ldb (byte 53 (cl:- len (* 5 53))) int)) + (xx (multiple-value-call #'%make-qd-d + (renorm-5 (scale-float (float q0 1d0) + (cl:- len 53)) + (scale-float (float q1 1d0) + (cl:- len (* 2 53))) + (scale-float (float q2 1d0) + (cl:- len (* 3 53))) + (scale-float (float q3 1d0) + (cl:- len (* 4 53))) + (scale-float (float q4 1d0) + (cl:- len (* 5 53)))))) + (yy (npow (make-qd-d 10d0) + power))) #+(or) (progn (format t "xx = ~A~%" xx)