cod*_*rix 4 python floating-point
过去几天我一直在使用 python 来做作业。我注意到一件奇怪的事情——
当我使用带有 4 个字节浮点数的 struct.pack() 将此数字放入文件中并使用 struct.unpack() 读回它时,它给出的数字不完全相同,但给出了一些更长的字符串,如果按照浮点存储,我期望该数字
前任。- 字符串 - 0.931973
浮点数 - 0.931973
来自文件 - 0.931972980499(在结构打包并解包为 4 个字节之后)
所以当我从字符串读取它时,我无法理解Python实际上是如何存储我的号码的。
编辑 编写浮点数(我认为在ubuntu上的python 2.7中它是另一种方式,d-double和f-float)
buf = struct.pack("f", float(self.dataArray[i]))
fout.write(buf)
Run Code Online (Sandbox Code Playgroud)
询问 -
buf = struct.pack("f", dataPoint)
dataPoint = struct.unpack("f", buf)[0]
node = root
while(node.isBPlusNodeLeaf()) == False:
node = node.findNextNode(dataPoint)
Run Code Online (Sandbox Code Playgroud)
查找下一个节点 -
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]
Run Code Online (Sandbox Code Playgroud)
一旦我到达叶子,它就会读取叶子并检查数据点是否存在。
for data in node.dataArray:
if data == dataPoint:
return True
return False
Run Code Online (Sandbox Code Playgroud)
因此,在这种情况下,它会返回对数据点的搜索失败 - 0.931972980499,但该数据点确实存在。
虽然以下代码工作正常 -
for data in node.dataArray:
if round(float(data), 6) == dataPoint:
return True
return False
Run Code Online (Sandbox Code Playgroud)
我无法理解为什么会发生这种情况
floatPython 中的 64 位实际上是 C 程序员所说的double64 位(或者在某些平台上可能更宽)。因此,当您将其存储为 4 个字节(32 位)时,就会失去精度。
如果您使用d格式而不是f,您应该看到您期望的结果:
>>> struct.unpack('d', struct.pack('d', float('0.931973')))
(0.931973,)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3975 次 |
| 最近记录: |