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

3

请问有人能帮我解释一下这段将十进制小数转换成二进制的代码吗?

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

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

2
你不明白它的哪个具体部分? - Kmeixner
1
在 p = 0 后的 while 循环以及 num > 0 的另一个 while 循环。 - Eliza
https://en.wikipedia.org/wiki/Binary_number#Decimal - Yu Hao
1个回答

0

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

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

计算二进制小数点右边有几个位置以确定结果。用一个熟悉的十进制比喻,如果数字是1.234,我想将其转换为十进制(易如反掌),答案中明显会有3个小数点后的位置。但我怎么知道呢?我将其乘以10、100、1000等,直到得到一个没有分数部分的数字。(...)%1给出了(...)的小数部分,当...为整数时它为零。

现在我知道将输入值转换为整数所需的最小2的幂,我们乘以该幂以获得整数。该值在程序中称为num。就像在十进制中执行数学运算一样,在计算完成后可以忽略小数点并将其放入其中。从技术上讲,这些步骤如下:

  • 乘以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'。现在剩下的是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:]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接