我正在尝试用 python 编写一个基于 FP16 的基本计算器来帮助我调试一些硬件。似乎无法找到如何将 16b 十六进制值转换为浮点值,我可以在代码中使用它来进行数学运算。我看到很多对 numpy 的在线引用,但我认为 float16 构造函数需要一个像 float16("1.2345") 这样的字符串。我想我正在寻找类似 float16("0xabcd") 的东西。
谢谢!
numpy.float16
确实是一种有符号浮点格式,具有 5 位指数和 10 位尾数。
要获取示例的结果:
import numpy as np
np.frombuffer(b'\xab\xcd', dtype=np.float16, count=1)
结果:
array([-22.67], dtype=float16)
或者,展示如何编码和解码另一个示例
1.2345
:
import numpy as np
a = np.array([1.2345], numpy.float16)
b = a.tobytes()
print(b)
c = np.frombuffer(b, dtype=np.float16, count=1)
print(c)
结果:
b'\xf0<'
[1.234]
如果您确实需要将提供的字符串转换为 FP16:
import numpy as np
s = "0xabcd"
b = int("0xabcd", base=16).to_bytes(2, 'big')
print(b)
c = np.frombuffer(b, dtype=np.float16, count=1)
print(c)
输出:
b'\xab\xcd'
[-22.67]
如果有人想知道,上面的答案是不正确的。 我使用它并与 2 个不同的在线工具进行对抗来计算 FP16,并且两者都有相同的不同答案。
我会将任何人发送到此帖子以获取正确答案:
如何在Python中将16位十六进制和二进制表示转换为十进制浮点数(反之亦然)?
如果您有任何疑问,这些是我用来检查答案的工具:
我使用值 0x1C00 和 0x9E00 进行测试。 我希望有人会觉得这有帮助!