Как преобразовать 16-битные шестнадцатеричные и двоичные представления в десятичное число с плавающей запятой (и наоборот) в Python? - PullRequest
1 голос
/ 29 мая 2019

Я работаю над проблемой, которая требует от меня преобразования шестнадцатеричного и двоичного представлений FP16 чисел с плавающей точкой в ​​десятичное с плавающей точкой. Мне также нужно преобразовать десятичные числа с плавающей запятой в шестнадцатеричное и двоичное представления FP16.

Существует множество решений для преобразования чисел FP32. Но я специально требую FP16 представления .

Я уже нашел решение для двоичного кода FP16 в десятичное число с плавающей запятой:

a = struct.pack("H",int("0010100011110101",2))

float = np.frombuffer(a, dtype =np.float16)[0]

В основном я хочу:

двоичный код FP16 -> десятичное число с плавающей запятой (0010100011110101 -> 0,0387268066)

FP16 hex -> десятичное число с плавающей запятой (28f5 -> 0.0387268066)

десятичное число с плавающей запятой -> двоичный код FP16 (0.0387268066 -> 0010100011110101)

десятичное число с плавающей запятой -> гекс FP16 (0.0387268066 -> 28f5)

1 Ответ

0 голосов
/ 30 мая 2019

Итак, я нашел решение после небольшого исследования и выкладываю его здесь для всех, кому это может понадобиться.

import struct
import numpy as np
bin = "0010100011110101"
hex = "28f5"
dec_float = 0.03872680

FP16 двоичное в десятичное число с плавающей запятой

y = struct.pack("H",int(bin,2))
float = np.frombuffer(y, dtype =np.float16)[0]

FP16 от шестнадцатеричного до десятичного числа с плавающей запятой

y = struct.pack("H",int(hex,16))
float = np.frombuffer(y, dtype =np.float16)[0]

Десятичное число с плавающей точкой в ​​двоичном коде FP16

binary = struct.unpack('H',struct.pack('e',dec_float))[0]
binary = bin(binary)
binary = binary[2:]
binary = "0"*2 + binary

Десятичное число с плавающей точкой в ​​шестнадцатеричном формате FP16

hexa = struct.unpack('H',struct.pack('e',dec_float))[0]
hexa = hex(hexa)
hexa = hexa[2:]
...