Python中的十进制转二进制半精度IEEE 754

5

我只能使用 struct.pack 模块将十进制数转换成单精度IEEE754格式的二进制数,或者使用 numpy.frombuffer 将浮点数(float16或float32)转换为二进制数。

但是,是否有可能使用 Numpy 将十进制数转换为半精度浮点数的二进制数呢?

我需要打印出转换后的结果,例如当我输入 "117.0" 时,应该打印出 "0101011101010000"


4
np.float16('2.3') 对我来说可以正常工作。你能否澄清你的问题?也许展示一下你尝试的例子会更好理解。 - Mark Dickinson
float16 方法不会将数值从十进制转换为二进制。例如,我想要将 100.25(十进制)转换为 IEEE754 半精度的二进制形式,而不是十进制形式。 - Kaio
2个回答

12
如果我输入“117.0”,它应该输出“0101011101010000”。
>>> import numpy as np
>>> bin(np.float16(117.0).view('H'))[2:].zfill(16)
'0101011101010000'

.view('H') 方法将占用 float16 值的内存重新解释为无符号整数。


这个解决方案可行,谢谢!我现在会尝试理解你的代码。 - Kaio
1
@Kaio:我建议使用Python REPL逐步执行代码并查看中间结果。同时使用help()命令,查看相应的docstrings,例如help(''.zfill) - jfs
@jfs,您能否稍微解释一下这里使用的视图函数,或者提供文档链接? - anirudh

3

建议按照Mark Dickinson提出的float16方法,再使用tostring()方法获取所需的二进制表示:

data = numpy.float16(2.3).tostring()

如果我运行以下代码:`import numpy as npb=np.float16(2.3).tostring() print b`,它只会打印出一个"?@",没有二进制数字。 - Kaio
我需要打印转换的结果,所以如果我输入“117.0”,它应该打印出“0101011101010000”。 - Kaio
1
@Kaio: 啊,这很有帮助,谢谢。你能否编辑你的问题并添加一个例子?听起来你想要类似于'{:016b}'.format(struct.unpack('<H', np.float16('117.0').tobytes())[0])这样的东西,尽管可能有更短的方法来实现这一点。 - Mark Dickinson
@MarkDickinson 您的解决方案值得成为(被接受的)答案。 - dlask
@MarkDickinson:是的,我正在使用NumPy 1.8.2。现在你的解决方案也可以了,非常感谢Mark! - Kaio
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接