Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.144.187.103] |
|
Сообщ.
#1
,
|
|
|
Есть число 0x471b4ac2 представленное в IEEE-754, которое необходимо преобразовать в число с плавающей точкой (float).
В сети нашёл конвертер, который выполняет данную операцию и преобразует 0x471b4ac2 в 39754.758. Прошу помочь с алгоритмом для Python Нашёл преобразование float -> bin: import struct getBin = lambda x: x > 0 and str(bin(x))[2:] or "-" + str(bin(x))[3:] def float2bin32(value): # val = struct.unpack('Q', struct.pack('d', value))[0] # 64 val = struct.unpack('I', struct.pack('f', value))[0] # 32 return getBin(val) Мне же требуется обратное преобразование, то есть bin -> float С преобразованием bin -> hex и обратно затруднений не имеется |
Сообщ.
#2
,
|
|
|
знаний математики хватило, чтобы разобраться в алгоритме самостоятельно. Очень помог параграф 4 отсюда.
Ниже моя реализация. Сделал как умею, так что за изящность кода прошу не пинать. def hex2bin(hx): # IEEE-754 32 -> bin bn = bin(int(hx, 16))[2:] return bn def bin2dec(bn): # IEEE-754 32 -> float if len(bn) == 31: s = 0 e = bn[0:8] m = bn[8:] else: s = 1 e = bn[1:8] m = bn[9:] f = (-1)**s*2**(int(e,2)-127)*(1+int(m,2)/2**23) return f |
Сообщ.
#3
,
|
|
|
Можно было воспользоваться тем же модулем struct. Там наряду с unpack есть функция с противоположным действием - pack.
|
Сообщ.
#4
,
|
|
|
Цитата amk @ Можно было воспользоваться тем же модулем struct. Там наряду с unpack есть функция с противоположным действием - pack. пример, пожалуйста! |
Сообщ.
#5
,
|
|
|
Цитата bur80 @ Английский не понимаешь? В справке всё написано.пример, пожалуйста! struct.pack('f', 39754.758) преобразует число с плавающей точкой в последовательность байт b'\xc2J\x1bG' == bytes(194, 74, 27, 71) int.from_bytes(b'\xc2J\x1bG', byteorder='little') преобразует полученную последовательность в целое число 1192970946 == 0x471b4ac2 Последнее преобразование можно выполнить с использованием модуля struct struct.unpack('i', b'\xc2J\x1bG')[0] Или в одну строку int.from_bytes(struct.pack('f', 39754.758), byteorder='little') struct.unpack('i', struct.pack('f', 39754.758))[0] Последняя строка отличается от строки в твоём первом посте только расположением форматов 'i' и 'f' (!). |
Сообщ.
#6
,
|
|
|
import struct print(struct.unpack('!f', bytes.fromhex('{:x}'.format(orig)))[0]) |