浮动代表的差异

Discrepancy of floating representation

this SO answer 中,用户提供了这个 returns 浮点值的二进制表示形式的短函数:

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.

当我使用值 7/3-4/3(在 Python 3.5 中)或 1.0000000000000002 调用此函数时,我得到此二进制表示形式:

11111111110000000000000000000000000000000000000000000000000000

使用 this online tool,具有相同的值,我得到这个二进制表示:

11111111110000000000000000000000000000000000000000000000000001

"strip but one leading zero" 函数中的逻辑是完全错误的,并且正在从结果中删除有效数字。

该值的正确表示是 您问题中提到的值;它是:

0011111111110000000000000000000000000000000000000000000000000001

可以通过将该函数的最后一行替换为以下内容来检索:

return s

或使用更简单的实现:

def float_to_bin(f):
    [d] = struct.unpack(">Q", struct.pack(">d", f))
    return '{:064b}'.format(d)

浮点值中的前导零和尾随零很重要,在不更改值的情况下无法删除。