我有一个程序可以读取单精度 IBM float 的二进制文件。目标是将它们转换为 IEEE754 float (二进制格式)。目前我正在读取二进制 IBM 数字,将其转换为 float ,然后将其转换为其 IEEE754 格式(单精度)。出于某种原因,我没有得到我想要的输出。
我的输入:
11000010011101101010000000000000
我想要的输出:
11000010111011010100000000000000
我得到的输出:
1100000001011101101010000000000000000000000000000000000000000000
代码:
import struct
getBin = lambda x: x > 0 and str(bin(x))[2:] or "-" + str(bin(x))[3:]
def floatToBinary64(value):
val = struct.unpack('Q', struct.pack('d', value))[0]
return getBin(val)
with open("test.bin", "rb") as f:
while True:
ibm = f.read(32);
if not ibm:
break
print(ibm)
ibm = int(ibm, 2)
sign = (ibm >> 31) & 0x01
exponent = (ibm >> 24) & 0x7f
mantissa = (ibm & 0x00ffffff) / pow(2, 24)
decimal = (1 - 2 * sign) * mantissa * float(pow(16, exponent - 64))
print(decimal)
binary = floatToBinary64(decimal)
print(binary)
如何修改此代码以获得所需的输出?
最佳答案
在 floatToBinary64
中,val = struct.unpack('Q', struct.pack('d', value))[0]
转换 C
表示为value
的双unsigned long long
。 (未严格指定 Python 类型;Python 实现通常依赖于 C 实现并继承其许多属性。)在许多常见的 C 实现中,double
是 IEEE-754 基本 64 位二进制格式,而 float
是 IEEE-754 基本 32 位二进制格式。
要将其更改为 32 位,请将其更改为 val = struct.unpack('I', struct.pack('f', value))[0]
。为了匹配它,将例程重命名为 floatToBinary32
。
关于python - 将 float 转换为 IEEE754,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52600983/