Python 浮动代表的差异
在中,用户提供了此短函数,该函数返回浮点值的二进制表示形式:Python 浮动代表的差异,python,floating-point,floating-accuracy,Python,Floating Point,Floating Accuracy,在中,用户提供了此短函数,该函数返回浮点值的二进制表示形式: import struct import sys def float_to_bin(f): """ Convert a float into a binary string. """ if sys.version_info >= (3,): # Python 3? ba = struct.pack('>d', f) else: ba = bytearray(str
import struct
import sys
def float_to_bin(f):
""" Convert a float into a binary string. """
if sys.version_info >= (3,): # Python 3?
ba = struct.pack('>d', f)
else:
ba = bytearray(struct.pack('>d', f)) # Convert str result.
s = ''.join('{:08b}'.format(b) for b in ba)
return s[:-1].lstrip('0') + s[0] # Strip but one leading zero.
当我在Python 3.5中使用值7/3-4/3或1.0000000000000002调用此函数时,我得到以下二进制表示:
111111100000000000000000000000000000000000000
使用相同的值,我得到以下二进制表示:
1111111000000000000000000000000000000000000000000001
为什么这两种表述之间存在差异?
为什么float\u to\u bin返回1.0000000000000002的浮点表示形式1.0?
调用struct.pack时是否会导致float\u to\u bin中的精度损失?
该函数中的逻辑是去掉一个前导零,这是完全错误的,并且正在从结果中删除有效数字 该值的正确表示既不是问题中提到的值;它是:
0011111111110000000000000000000000000000000000000000000000000001
可以通过将该函数的最后一行替换为:
return s
或者使用更简单的实现:
def float_to_bin(f):
[d] = struct.unpack(">Q", struct.pack(">d", f))
return '{:064b}'.format(d)
浮点值中的前导零和尾随零都是有效的,如果不改变值,就无法删除。该函数中的逻辑为strip,但一个前导零是完全错误的,并且正在从结果中删除有效数字 该值的正确表示既不是问题中提到的值;它是:
0011111111110000000000000000000000000000000000000000000000000001
可以通过将该函数的最后一行替换为:
return s
或者使用更简单的实现:
def float_to_bin(f):
[d] = struct.unpack(">Q", struct.pack(">d", f))
return '{:064b}'.format(d)
浮点值中的前导零和尾随零是重要的,如果不更改该值,则无法删除。1.0000000000000002不是浮点数的精确值,因此不同的实现可能会对其进行不同的解析。浮点值只有32位,其余的位是有效数字。你在网站上看到了吗?最精确的表示=1。00000000000000022204460492503E0@APorter1031Python中的浮点值是双精度64位浮点,而不是单精度。1.0000000000000002不是浮点数的精确值,因此不同的实现可能会对其进行不同的解析。浮点值只有32位,其余的位是有效数字。你在网站上看到了吗?最精确的表示=1。00000000000000022204460492503E0@APorter1031Python中的浮点值是双精度64位浮点,而不是单精度。有关详细信息,请参阅explanation@duskwuff:谢谢。这就解释了。我应该更彻底地查看所提供的代码。有关更深入的信息,请参阅explanation@duskwuff:谢谢。这就解释了。我应该更彻底地查看提供的代码。