将分数从十进制转换为二进制
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"
我想将数字 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"