【问题标题】:How floats are stored in python浮点数如何存储在python中
【发布时间】:2015-02-09 13:18:02
【问题描述】:

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

  1. 当我将字符串转换为浮点数时 - 它给出的位数与字符串中的位数完全相同。
  2. 当我使用带有 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 floating-point


【解决方案1】:

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

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

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

【讨论】:

  • 但是 John 实际上返回的 float(str) 并不是一个双精度值。
  • 您现在的问题似乎是您正在直接比较浮点值。这是包括 Python 在内的大多数语言的一大罪过。有关如何处理它,请参阅此问题:stackoverflow.com/questions/5595425/…
猜你喜欢
  • 1970-01-01
  • 2018-09-06
  • 1970-01-01
  • 2014-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多