python - float 在python中是如何存储的

标签 python floating-point

过去几天我一直在使用 python 来完成我的作业。我注意到一件奇怪的事——

  1. 当我将字符串转换为 float 时 - 它给出的数字位数与字符串中的数字位数完全相同。
  2. 当我使用带有 4 个字节 float 的 struct.pack() 将这个数字放入文件中并使用 struct.unpack() 读回它时,它给出了一个不完全相同的数字,但我希望它是一些更长的字符串每浮点存储

    例。 - 字符串 - 0.931973

    float - 0.931973

    来自文件 - 0.931972980499(在结构打包和解压为 4 个字节之后)

所以当我从字符串中读取它时,我无法理解 python 实际上是如何存储我的数字的。

编辑 编写 float (我认为在 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    

我不明白为什么会这样

最佳答案

float 在 Python 中实际上是 C 程序员所说的 double,即它是 64 位(或者在某些平台上可能更宽)。因此,当您将其存储为 4 个字节(32 位)时,您会失去精度。

如果您使用 d 格式而不是 f,您应该会看到预期的结果:

>>> struct.unpack('d', struct.pack('d', float('0.931973')))
(0.931973,)

关于python - float 在python中是如何存储的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28403024/

相关文章:

Python - 从字典中分配和更改列表

Swift Float80 数据类型在 Xcode 8 beta 中不可用

c - 这个 C 函数是不是写得很糟糕?

来自集合的 Python 双端队列不是确定性的;重复执行给出不同的结果

python - 我可以使用 ENV 变量关闭 Python (PiP) SSL 证书验证吗?

Python 排序问题

python - scipy因式分解错误

r - 为什么 (e^x-1)/x 不能正常工作,但 (e^x-1)/log(e^x) 可以?

java - 如何检查 double 的小数部分是否包含特定数字?

python: `int`和 `float`的组合