有什么建议可以纠正这个问题吗? 例子; 输入浮点数:-34.5 二进制:1101 1110.1#-33.5 输出不正确, 因为: 1 1 0 1 1 1 1 0 1 -128+64+0+16+8+4+2+0+0.5=-33.5
输出应该是: 1101 1101.1#-34.5
因为: 1 1 0 1 1 1 0 1.1 -128+64+0+16+8+4+0+1+.5 = -34.5
def twos_complement(binary):
complement = ''.join('1' if bit == '0' else '0' if bit == '1' else bit for bit in binary)
carry = 1
result = ''
for bit in complement[::-1]:
if bit == '1' and carry == 1:
result += '0'
elif bit == '0' and carry == 1:
result += '1'
carry = 0
else:
result += bit
return result[::-1]
def integer_to_binary(integer):
num_bits = integer.bit_length()
num_bits = max(num_bits, 8)
if integer >= 0:
binary_value = bin(integer)[2:].zfill(num_bits)
binary_value = ('0' * 4) + binary_value
binary_value = ' '.join(binary_value[max(0, i - 4):i][::-1] for i in range(len(binary_value), 0, -4))
return binary_value[::-1]
elif 0 > integer >= -128:
binary_value = bin((1 << num_bits) + integer & ((1 << num_bits) - 1))[2:].zfill(num_bits)
binary_value = ('1' * 4) + binary_value
binary_value = ' '.join(binary_value[max(0, i - 4):i][::-1] for i in range(len(binary_value), 0, -4))
return binary_value[::-1]
elif integer <= -129:
binary_value = bin(integer)[3:].zfill(num_bits)
binary_value = ('1' * 4) + twos_complement(binary_value)
binary_value = ' '.join(binary_value[max(0, i - 4):i][::-1] for i in range(len(binary_value), 0, -4))
return binary_value[::-1]
def float_to_binary(mixed):
integer_part, decimal_part = str(mixed).split('.')
binary_integer_part = integer_to_binary(int(integer_part))
binary_decimal_part = ''
if decimal_part != '0':
decimal_part = '0.' + decimal_part
decimal = float(decimal_part)
while decimal != 0:
decimal *= 2
binary_decimal_part += str(int(decimal))
decimal -= int(decimal)
result = binary_integer_part + '.' + binary_decimal_part
return result
input = float(input("Enter a float number: "))
result = float_to_binary(input)
print("Binary:", result)
我将整数和小数分开,然后将整数部分用作integer_to_binary函数的参数,将其转换为二进制。 但小数部分通过重复乘以 2 并取结果的整数部分来转换为二进制。
如果预期输出是整数(负或正)和浮点数(仅限正),我的代码没有不正确的问题。 仅当预期输出为浮点数且为负数时,才会出现问题。
我想要的是,如果输入是负浮点数。输出应该是正确的。
好吧,首先,我尝试调试你的代码,老实说,对于像
(binary_value[max(0, i - 4):i][::-1] for i in range(len(binary_value), 0, -4))
这样的生成器表达式或像这个令人讨厌的表达式 bin((1 << num_bits) + integer & ((1 << num_bits) - 1))
twos_complement(binary_value)
的时候是 integer <= -129
并且传递的参数是一个只有 0 和 1 的字符串,所以定义中的第一个生成器表达式 def twos_complement(binary)
可能是 complement = ''.join('1' if bit == '0' else '0' if bit == '1' for bit in binary)
而且我仍然认为这种方法要困难得多,毕竟有一种更优雅的方法来获取 2 的补码,而不是进行 1 的补码并添加 1,你可以检查一下这里input = -34.5
)然后得到它的 binary_integer_part
然后取 小数部分 = 0.5 并得到它的binary_decimal_part
,但最终你连接两个字符串并返回结果,在这种情况下,如果转换为十进制,则结果将等于=integerpart+decimal_part=-34+0.5=-33.5。因此,使用您提供的代码,您可以以您正在寻找的格式获得 -34.5 if input = -35.5
因为结果将是 = -35 + 0.5 = -34.5 我尝试并给出了所需的输出。希望我回答了您的担忧:)