浮动代表的差异
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
- 为什么这两种表示法有区别?
- 为什么
float_to_bin
为 1.0000000000000002
返回 1.0
的浮动表示?
float_to_bin
中是否有一些精度损失(可能在调用 struct.pack
时)?
"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)
浮点值中的前导零和尾随零很重要,在不更改值的情况下无法删除。
在 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
- 为什么这两种表示法有区别?
- 为什么
float_to_bin
为1.0000000000000002
返回1.0
的浮动表示? float_to_bin
中是否有一些精度损失(可能在调用struct.pack
时)?
"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)
浮点值中的前导零和尾随零很重要,在不更改值的情况下无法删除。