我想知道如何转换返回的结果float.hex()
到二进制,例如,从0x1.a000000000000p+2
to 110.1
.
有人可以帮忙吗?谢谢。
def float_to_binary(num):
exponent=0
shifted_num=num
while shifted_num != int(shifted_num):
shifted_num*=2
exponent+=1
if exponent==0:
return '{0:0b}'.format(int(shifted_num))
binary='{0:0{1}b}'.format(int(shifted_num),exponent+1)
integer_part=binary[:-exponent]
fractional_part=binary[-exponent:].rstrip('0')
return '{0}.{1}'.format(integer_part,fractional_part)
def floathex_to_binary(floathex):
num = float.fromhex(floathex)
return float_to_binary(num)
print(floathex_to_binary('0x1.a000000000000p+2'))
# 110.1
print(floathex_to_binary('0x1.b5c2000000000p+1'))
# 11.01101011100001
解释:
float.fromhex
返回一个浮点数num
。我们想要它的二进制表示形式。
{0:b}.format(...)
返回整数的二进制表示形式,但不返回浮点数。
但是如果我们将浮点数乘以足够多的 2 次方,即将二进制表示向左移动足够多的位置,我们最终会得到一个整数,shifted_num
.
一旦我们有了这个整数,我们就可以回家了,因为现在我们可以使用{0:b}.format(...)
.
我们可以根据我们向左移动的位数使用一些字符串切片来重新插入小数点(呃,二进制点?)(exponent
).
技术要点:二进制表示的位数shifted_num
可能小于exponent
。在这种情况下,我们需要在二进制表示的左侧填充更多 0,因此二进制切片binary[:-exponent]
不会为空。我们通过以下方式进行管理:'{0:0{1}b}'.format(...)
. The 0{1}
在格式字符串中将格式化字符串的宽度设置为{1}
,在左侧用零填充。 (这{1}
被数字取代exponent
.)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)