python - 将 float 转换为 IEEE754

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

我有一个程序可以读取单精度 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/

相关文章:

python - "New style getargs format but argument is not a tuple"枕头图片粘贴错误

c++ - 由于舍入行为导致 float 和错误结果

python - 如何在不改变python中元素位置的情况下对列表列表中的元素进行排序?

python - 如何对齐networkx中的节点和边

python 和 ctypes 访问具有嵌套结构的 C++ 类

javascript - Math.cos 不准确

c - 奇怪的 float ?指向结构中 float 的指针

java - “Type mismatch: cannot convert int to byte”

C程序设置k个低位

c - 规范化二进制浮点值