在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
时)是否有精确损失?答案 0 :(得分:4)
该功能中的逻辑用于剥离但是一个前导零"完全错误,并从结果中删除有效数字。
值的正确表示既不你问题中提到的值;它是:
interval 'P1M-1D';
可以通过将该函数的最后一行替换为:
来检索0011111111110000000000000000000000000000000000000000000000000001
或使用更简单的实现:
return s
浮点值中的前导和尾随零是重要的,如果不更改值,则无法删除。