Преобразование Float в IEEE754 - PullRequest
       36

Преобразование Float в IEEE754

0 голосов
/ 02 октября 2018

У меня есть программа, которая читает в двоичном файле числа с плавающей запятой 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 голосов
/ 02 октября 2018

In floatToBinary64, val = struct.unpack('Q', struct.pack('d', value))[0] преобразует C double представление value в unsigned long long.(Типы Python не указаны строго; реализация Python обычно полагается на реализацию C и наследует многие из ее свойств.) Во многих распространенных реализациях C double является базовым 64-битным двоичным форматом IEEE-754, а floatявляется базовым 32-разрядным двоичным форматом IEEE-754.

Чтобы изменить это значение на 32-разрядное, измените его на val = struct.unpack('I', struct.pack('f', value))[0].Чтобы соответствовать этому, переименуйте подпрограмму в floatToBinary32.

...