有人可以帮我解释这段将小数转换为二进制的代码吗?
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:]
谁能帮我解释一下这段将小数转换为二进制的代码?
将十进制小数转换为二进制形式:
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:]