有人可以帮我解释这段将小数转换为二进制的代码吗?

Can someone help me explain this code that is converting decimal fractions into a binary?

谁能帮我解释一下这段将小数转换为二进制的代码?

将十进制小数转换为二进制形式:

x = float(raw_input('Enter a decimal number between 0 and 1: '))

p = 0
while ((2**p)*x)%1 != 0:
    print('Remainder = ' + str((2**p)*x - int((2**p)*x)))
    p += 1

num = int(x*(2**p))

result = ''
if num == 0:
    result = '0'
while num > 0:
    result = str(num%2) + result
    num = num/2

for i in range(p - len(result)):
    result = '0' + result

result = result[0:-p] + '.' + result[-p:]
print('The binary representation of the decimal ' + str(x) + ' is ' + str(result))

我不认为这段代码写得很好,但这是一个粗略的想法。第一个 while 循环:

while ((2**p)*x)%1 != 0: ...

正在计算结果在二进制中小数点右边有多少位。使用一个熟悉的类比,让我们以 10 为底数进行操作。如果数字是 1.234,并且我想转换为以 10 为底数(很简单),答案中小数点右边显然有 3 位。但是我怎么知道呢?好吧,我乘以 10、100、1000 等等,直到我得到一个没有小数部分的数字。 (...)%1 给出 (...) 的小数部分,当 ... 为整数时它为零。

现在我知道将输入值变成整数的最小 2 次方,我们乘以它得到一个整数。该值在程序中称为 num。就像你在进行数学运算时使用小数一样,你可以忽略小数点并在计算完成后将其放入。从技术上讲,这是执行这些步骤

  • 乘以 10 的幂,
  • 处理号码
  • 完成后除以 10 的次方。

对于 2 的幂也是如此。数学上:

  conversion(x) == conversion(x*2**p)/2**p

从这里使用 num,我们计算输出中从最低有效位到最高有效位的位。这是开始的部分:

  while num > 0:

如果这个数是奇数,那么显然这个数转换成二进制后的最后一位也是奇数。否则最后一位将为 0。找出最低有效位后,我们将移动到下一个最高有效位,依此类推。

这是一个例子。假设数字是 5。这很奇数,所以我们现在知道二进制的最后一位将是 1。现在考虑剩余的部分 4(因为 4 = 5-1)将它移到右边的一个位置,以便能够考虑它的最小值-重要的一点。不要担心右移一位,因为在答案中我们将在将其插入最终结果之前将其左移一位。

4 移动一位是 2。即使是 '0'。在我们之前的“1”的左边,我们现在放置那个“0”。 2 仍然存在 (2 = 2 - 0),因此我们再次将 2 向右移动一位,考虑剩余的部分,现在是 1。这很奇怪,因此在 '01' 的左侧添加另一个 '1'。现在 ins 剩下的是 0 (1-1=0) 所以我们停止。总而言之,我们得到了“101”。

前面我们计算了小数点右边多少位,p。所以开始的部分:

 for i in range(p - len(result)):
    result = '0' + result

在超过 p 的数字的开头加 0。然后在小数点后加上最右边的 p 个字符:

  result = result[0:-p] + '.' + result[-p:]