浮动表示的差异

时间:2018-06-08 18:46:43

标签: python floating-point floating-accuracy

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

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

  • 为什么这两种表示有区别?
  • 为什么float_to_bin会为1.0返回1.0000000000000002的浮动表示?
  • float_to_bin在某处(可能在调用struct.pack时)是否有精确损失?

1 个答案:

答案 0 :(得分:4)

该功能中的逻辑用于剥离但是一个前导零"完全错误,并从结果中删除有效数字。

值的正确表示既不你问题中提到的值;它是:

interval 'P1M-1D';

可以通过将该函数的最后一行替换为:

来检索
0011111111110000000000000000000000000000000000000000000000000001

或使用更简单的实现:

return s

浮点值中的前导和尾随零是重要的,如果不更改值,则无法删除。