将Float转换为IEEE754

时间:2018-10-02 01:43:31

标签: python floating-point bit-manipulation ieee-754 ieee

我有一个程序,可以读取单精度IBM浮点数的二进制文件。目标是将这些转换为IEEE754浮点(二进制格式)。当前,我正在读取二进制IBM数字,将其转换为浮点数,然后将其转换为其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)

如何修改此代码以获得所需的输出?

1 个答案:

答案 0 :(得分:1)

floatToBinary64中,val = struct.unpack('Q', struct.pack('d', value))[0]double的C value表示形式转换为unsigned long long。 (未严格指定Python类型; Python实现通常依赖于C实现并继承其许多属性。)在许多常见的C实现中,double是IEEE-754基本的64位二进制格式,而{ {1}}是IEEE-754基本的32位二进制格式。

要将其更改为32位,请将其更改为float。为此,请将例程重命名为val = struct.unpack('I', struct.pack('f', value))[0]