过去几天我一直在使用python进行分配。我注意到一件奇怪的事情 -
当我使用带有4个字节浮点数的struct.pack()将此数字放入文件中并使用struct.unpack()将其读回时,它给出了一个不完全相同的数字但是我想要的更长的字符串根据浮点存储
实施例。 - 字符串 - 0.931973
Float num - 0.931973
来自文件 - 0.931972980499(在struct pack之后并解压缩为4个字节)
因此,当我从字符串中读取数字时,我无法理解python如何实际存储我的数字。
修改 编写浮点数(我认为在ubuntu的python 2.7中反过来,d- double和f-float)
buf = struct.pack("f", float(self.dataArray[i]))
fout.write(buf)
查询 -
buf = struct.pack("f", dataPoint)
dataPoint = struct.unpack("f", buf)[0]
node = root
while(node.isBPlusNodeLeaf()) == False:
node = node.findNextNode(dataPoint)
findNextNode -
def findNextNode(self, num):
i = 0
for d in self.dataArray:
if float(num) > float(d):
i = i + 1
continue
else:
break
ptr = self.pointerArray[i]
#open the node before passing on the pointer to it
out, tptr = self.isNodeAlive(ptr)
if out == False:
node = BPlusNode(name = ptr)
node.readBPlusNode(ptr)
return node
else:
return BPlusNode.allNodes[tptr]
一旦我到达叶子,它会读取叶子并检查那里是否存在数据点。
for data in node.dataArray:
if data == dataPoint:
return True
return False
所以在这种情况下,它返回不成功的数据点搜索 - 0.931972980499,尽管如此。
虽然以下代码可以正常工作 -
for data in node.dataArray:
if round(float(data), 6) == dataPoint:
return True
return False
我无法理解为什么会发生这种情况
答案 0 :(得分:3)
float
实际上是C程序员所称的double
,即它是64位(或者在某些平台上甚至更宽)。因此,当您将其存储为4个字节(32位)时,您将失去精确度。
如果您使用d
格式代替f
,您应该会看到预期的结果:
>>> struct.unpack('d', struct.pack('d', float('0.931973')))
(0.931973,)