【问题标题】:Decimal to binary Half-Precision IEEE 754 in PythonPython中的十进制到二进制半精度IEEE 754
【发布时间】:2016-01-31 19:29:48
【问题描述】:

我只能使用 struct.pack 模块将十进制转换为二进制单精度 IEEE754,或者使用 numpy.frombuffer 执行相反的操作(float16 或 float32)

是否可以使用 Numpy 将十进制转换为二进制半精度浮点数?

我需要打印转换结果,所以如果我输入"117.0",它应该打印"0101011101010000"

【问题讨论】:

  • np.float16('2.3') 适合我。你能澄清你在问什么吗?也许展示一个你正在尝试的例子。
  • float16 方法不会从基数 10 转换为基数 2。例如,我希望 100.25(基数 10)到 IEEE754 基数 2 的半精度,而不是基数 10

标签: python numpy floating-point precision ieee-754


【解决方案1】:

Mark Dickinson 建议的float16 方法后面必须跟tostring() 方法才能获得所需的二进制表示:

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

【讨论】:

  • 如果我运行:import numpy as np b=np.float16(2.3).tostring() print b,它只会打印一个“?@”,没有以 2 为基数的数字
  • 建议的解决方案提供与struct.pack 相同类型的结果:字节序列。如果你需要不同的输出,你必须在你的问题中明确说明,最好用例子。
  • 我需要打印转换结果,所以如果我输入“117.0”,它应该会打印“0101011101010000”
  • @Kaio:啊,这很有帮助;谢谢。请您编辑您的问题以添加示例吗?听起来好像您想要'{:016b}'.format(struct.unpack('<H', np.float16('117.0').tobytes())[0]) 之类的东西,尽管可能有更短的方法。
  • @MarkDickinson 您的解决方案应该成为(接受的)答案。
【解决方案2】:

如果我输入“117.0”,它应该打印“0101011101010000”

>>> import numpy as np
>>> bin(np.float16(117.0).view('H'))[2:].zfill(16)
'0101011101010000'

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

【讨论】:

  • 此解决方案有效,谢谢!我现在将尝试理解您的代码
  • @Kaio:我推荐使用Python REPL,一步一步执行代码,看看中间结果。也可以使用help(),查看相应的文档字符串,例如help(''.zfill)
  • @jfs 你能解释一下这里使用的视图函数,或者可能是文档的链接
猜你喜欢
  • 1970-01-01
  • 2013-10-04
  • 1970-01-01
  • 2017-10-08
  • 1970-01-01
  • 2019-12-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多