# 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