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

Convert fractions from decimal to binary

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

如果是,怎么做?

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