将分数从十进制转换为二进制

时间:2016-02-15 11:46:50

标签: binary lisp

我想将数字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?

如果是,怎么样?

1 个答案:

答案 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"