(in-package :cl-user) (defun decimal-decode-float (x &optional (lo 61) (hi 63)) (multiple-value-bind (m k) (integer-decode-float x) (let ((j 0) (c 0) s) ;; x = m * 2^k * 10^j (loop while (< k 0) do (incf c) (loop while (< m (expt 2 hi)) do (setq m (* m 10)) (decf j)) (loop while (and (< k 0) (> m (expt 2 lo))) do (setq m (round m 2)) (incf k))) (loop while (> k 0) do (incf c) (loop while (and (> k 0) (< m (expt 2 hi))) do (setq m (* m 2)) (decf k)) (loop while (> m (expt 2 lo)) do (setq m (round m 10)) (incf j))) (setq s (format nil "~DD~D" m j)) (values m k j s (= x (read-from-string s))))))