【发布时间】:2015-02-09 13:18:02
【问题描述】:
过去几天我一直在使用 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)
查询 -
buf = struct.pack("f", dataPoint)
dataPoint = struct.unpack("f", buf)[0]
node = root
while(node.isBPlusNodeLeaf()) == False:
node = node.findNextNode(dataPoint)
查找下一个节点 -
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
我无法理解为什么会这样
【问题讨论】:
-
可能也依赖于python实现。
标签: python floating-point