Форум сайта python.su
![[RSS Feed] [RSS Feed]](/static/djangobb_forum/img/feed-icon-small.png) 
			 
							 0
  0   
								
								Есть файл, строгой структуры, в котором записан, в том числе массив данных в формате 4-byte IBM floating point. При помощи модуля struct я получаю значения, но они отличаются от действительных. При визуализации получается график такого же вида, как правильный, но амплитуды другие. Подскажите, в чём может быть проблема.
фрагмент кода
fname = sys.argv
sgy = open(fname,  ‘rb’)
sgy.seek(3212)
traces = struct.unpack('>h', sgy.read(2))
sgy.seek(3220)
samples = struct.unpack('>h',sgy.read(2))
data = np.zeros(samples*traces)
data = data.reshape(120,5000)
sgy.seek(3600)
for x in range(traces):
    sgy.seek(sgy.tell()+240)
    for y in range(samples):
        data = struct.unpack('>f',sgy.read(4))
sgy.close()
Офлайн
 
							 14
  14   
								
								Насколько я смог понять, IBM floating point несколько отличается от IEEE-754 floating point (последняя используется сопроцессором вообще и Питоном в частности).
Для 32 битного числа имеем:
IEEE-754: Sign bit: 1 bit, Exponent width: 8 bits, Significand precision: 24 (23 explicitly stored)
IBM: Sign - 1bit, exponent: 6 bits, mantissa: 25 bit
Экспонента на 2 бита короче, а мантиса соответственно длиннее.
Модуль struct вам не поможет - ищите или пишите преобразование специально для IBM формата.
Офлайн
 
							 0
  0   
								
								печально(( спасибо за разъяснение!
Офлайн
 
							 14
  14   
								
								Не очень-то и печально. 
Смотрите:
 - ibm формат http://en.wikipedia.org/wiki/IBM_Floating_Point_Architecture
 - аналогичный IEEE-754 http://en.wikipedia.org/wiki/Single_precision_floating-point_format
Питон работает с double (процессор, грубо говоря, тоже). Т.е. можно развернуть IBM-32 в IEEE double без потери точности
Это - наш стандарт: http://en.wikipedia.org/wiki/Double_precision_floating-point_format
берем и побитово переносим из ibm в ieee. Экспонента дополняется старшим битом слева, а мантисса нулем справа.
Когда все заработает - можно быстро перенести код на Cython для более или менее приличной производительности.
Вот кусок на С, который делает то же самое судя по описанию.
http://bytes.com/topic/c/answers/221981-c-code-converting-ibm-370-floating-point-ieee-754-a
Отредактировано (Янв. 7, 2010 05:12:53)
Офлайн
 
							 0
  0   
								
								Да, Вы правы) Погуглил на эту тему и всё получилось. Надо бы действительно на Си перенести.
Офлайн
 
							 14
  14   
								
								Будут проблемы с созданием C extension - спрашивайте. На этом вопросе собаку съел
Офлайн
 
							 0
  0   
								
								ок, спасибо!
Офлайн
![[RSS Feed] [RSS Feed]](/static/djangobb_forum/img/feed-icon-small.png)