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:谢谢。这就解释了。我应该更彻底地查看提供的代码。