2015-02-09 7 views
2

Я использовал python для своих заданий в течение последних нескольких дней. Я заметил одну странную вещь:Как float хранятся в python

  1. Когда я конвертирую строку в float - она ​​дает точно такое же количество цифр, что и в строке.
  2. Когда я помещал это число в файл с помощью struct.pack() с 4 байтами и читал его с помощью struct.unpack(), он дает число не точно такое же, но некоторую более длинную строку, которую я ожидаю, если в соответствии с хранение с плавающей запятой

    Ex. - String - 0.931973

    Float Num - 0.931973

    из файла - 0.931972980499 (после того, как структура пакета и распаковать в 4 байта)

Так что я не могу понять, как питон на самом деле хранится мой номер ранее когда я прочитал его из строки.

EDIT Дать поплавок (я думаю, что в Python 2.7 на убунту другой свой путь вокруг, d- двойной и е-поплавок)

buf = struct.pack("f", float(self.dataArray[i])) 
fout.write(buf) 

Query -

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

Возможно зависит от реализации питона, а также. – Marcin

+0

Возможный дубликат [Упаковка и распаковка двоичного float в python] (http://stackoverflow.com/questions/16165488/packing-and-unpacking-binary-float-in-python) – alfasin

+0

Привет, Альфасин, я уже проверил этот вопрос в то время как я был кодированием, Его разные, coz Я не могу понять, почему последний снипп работает, а 1-й не работает – codeomnitrix

ответ

3

float в Python на самом деле то, что C программисты называют double, т.е. 64 бита (или, возможно, еще шире на некоторых платформах). Поэтому, когда вы храните его в 4 байта (32 бита), вы теряете точность.

Если используется формат вместо fd, вы должны увидеть результаты, которые вы ожидаете:

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

Но Джон, который фактически возвращал float (str), на самом деле не был двойным значением. – codeomnitrix

+0

@codeomnitrix: да, это было. –

+0

Привет, Джон, я думаю, что это наоборот в ubuntu. Но я все еще не могу это понять, можете ли вы проверить отредактированный вопрос.Спасибо – codeomnitrix