我想将数字8.7转换为二进制。
我知道命令
(format nil "~b" (rationalize 8.7)) ===>
1010111/1010
或
(format nil "~b" (/ 87 10))====> 1010111/1010
我们观察如果我们得到商二元1010111/1010我们得到1000.1011001100110011001100110011。
可以在Lisp中获得
(8.7)_2 ~ 1000.1011001100110011001100110011?
如果是,怎么样?
答案 0 :(得分:0)
“2.718 ...”等于2 * 10^1 + 7 * 10^-1 + 1 * 10^-2 + 8 * 10^-3
...这意味着您可以通过连接string(n / base^i)
的相反过程生成字符串,其中 i 是索引到字符串中, n 是仍需要转换为 base 的值。它本质上是一种贪婪的变革算法。
以下粗略工作,不保证它产生精确的IEEE 754分数。它应该与实现的浮点数一样准确
(defun fractional-binary (fractional &optional (place 1) (result "."))
(if (zerop fractional)
result
(let ((fraction (expt 2 (- place))))
(if (<= fraction fractional)
(fractional-binary (- fractional fraction)
(1+ place)
(concatenate 'string result "1"))
(fractional-binary fractional
(1+ place)
(concatenate 'string result "0"))))))
CL-USER> (fractional-binary .7)
".101100110011001100110011"