Python : Convert IEEE to IBM Floating Point

Python : Convert IEEE to IBM Floating Point

When creating code to read a SEG-Y file, I get the IEEE and IBM Floating Point format data. IBM floating point numbers are represented by one bit for the sign (S), 7 bits for the exponent, and 24 bits for the fraction.  The exponent is to the base 16 (not 2), and has a bias of 64.  Because of the base 16, the fraction may have up to three leading zeros.  In this manner, some of the exponential value may be assumed by the fraction, increasing its range, at the cost of some precision.  Normalization to the leading bit is not possible.   Floating point numbers have no complement (neither one’s nor two’s complement).  They are in sign-magnitude format (the sign being bit 31). You get the more information with the table below :

IBM 32-Bit Floating Point Format
S Exponent Fraction (Note: the most significant three bits
[23, 22, and 21] might all be zero).
31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0

With this information and searching in internet, I am create a Python to Convert IEEE to IBM Floating Point. You can copy this Python Convert IEEE to IBM Floating Point at below :

'''
Created on July 11, 2012

@author: toto
'''

import string
import sys
import struct
import numpy as np
import math

# convert floating point to ibm
def ieee2ibm(x, endian):
	# check input data
	if(x > 7.236998675585915e+75):
		return(0x7ffffff0)

	if(x < -7.236998675585915e+75):
		return(0xfffffff0)

	if(x == 0):
		return 0

	if(x == np.NAN):  #check input if NAN number
		return (0x7fffffff)

	#conversion log2 from matlab
	F, E = math.frexp(abs(x))

	e = float (E/4.0);              # exponent of base 16
	ec = math.ceil(e);            # adjust upwards to integer
	p = ec + 64;                  # offset exponent

	f = F * pow(2,(-4*(ec-e)));   #  correct mantissa for fractional part of exponent
	# convert to integer. Roundoff here can be as large as
	# 0.5/2^20 when mantissa is close to 1/16 so that
	# 3 bits of signifance are lost.
	f1 = round(f * 0x1000000);

	# format hex
	# put exponent in first byte of psi.
	tmpi = p * 0x1000000;
	if(tmpi<=0):
		psi = 0
	elif(tmpi>=0xFFFFFFFF):
		psi = 0xFFFFFFFF
	else:
		psi = tmpi

	# put mantissa into last 3 bytes of phi
	if(f1<=0):
		phi = 0
	elif(f1>=0xFFFFFFFF):
		phi = 0xFFFFFFFF
	else:
		phi = f1

	# make bit representation
	# exponent and mantissa
	b = int(psi) | int(phi)
	# sign bit
	if(x<0):
		b = b + 0x80000000

	#print b
	b = np.uint32(b)
	if(endian):      #big endian
		cval = struct.pack(">i",b)
	else:            #litte endian
		cval = struct.pack("<i",b)

	return (cval)

#MAIN PROGRAM
x = 100.3
fibm = ieee2ibm(x, 1)
strinfo = 'x=%i' %x + '   -->  IBM Value = %f' %fibm
print(strinfo)

Save this Python to Convert IEEE to IBM Floating Point source code as ieee2ibm.py. Try to running this Python to Convert IEEE to IBM Floating Point with command :

python ieee2ibm.py

This is a Python to Convert IEEE to IBM Floating Point source code, are you have other method to convert IEEE to IBM Floating Point ? Please share at here

Source :
http://nssdc.gsfc.nasa.gov/nssdc/formats/IBM_32-Bit.html

Add a Comment

Your email address will not be published. Required fields are marked *

 

This site uses Akismet to reduce spam. Learn how your comment data is processed.