添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
首发于 浮点数制
Python实现浮点数制(IEEE-754)的转换——struct

Python实现浮点数制(IEEE-754)的转换——struct

AI芯片中计算模块关于浮点数制debug过程中,经常需要手动进行数制转换,搜了一下Python没有专门的库,通过struct这个库进行转换,学习记录一下~

tips:struct这个库还真的明确支持IEEE-754的binary-64/32/16的转换,nice~


struct库介绍

这个库是为了提供与C程序的接口,进行bytes转换和对齐。包含的函数比较少,可以help(struct)查看一下。

这个python doc介绍的非常详细,供大家参考。

这个site可以查所有python的说明文档,无意中发现,good~

格式

字节顺序

字节顺序

struct可以通过上表规定转换的顺序,只介绍常用的<和>

举两个例子:

struc.pack('<f',3.5),这个意思是将3.5这个浮点数(f是float的意思)按照小端模式转换

struct.pack('>I',5),将5这个整数(I是unsigned int的意思)按照大端模式转换。

默认不加<>是按照当前机器的大小端转换。可以通过sys.byteorder查看当前机器的是大端还是小端模式。

格式字符

这里的格式字符都是按照与C语言对应的,见下表

比较常用的是前三个,与IEEE-754相关。

tips:格式字符之前可以带有整数重复计数。 例如,格式字符串 '4f' 的含义与 'ffff' 完全相同;


浮点数制的转换


IEEE-754 浮点数转为10进制float

通常IEEE-754的浮点数都是16进制表示的,需要经过如下步骤

  • 将16进制转为无符号10进制
  • 将无符号10进制数pack输出
  • 将pack之后的数unpack为d,f或者e,分别对应binary-64/binary-32/binary-16

例如:binary-32 的 0xbfad50转换为十进制浮点数

import struct
x='bfad50'
y=int(x,16)
z=struct.unpack('<f',struct.pack('<I',y))
print(z[0])
# 1.7602752576441485e-38 

下面是IEEE在线工具的结果

例如:binary-16 的 0xbfad转换为十进制浮点数

import struct
x='bfad'
y=int(x,16)
z=struct.unpack('<e',struct.pack('<H',y)) # 这里需要使用H,2bytes
print(z[0])
# -1.9189453125 


10进制float转为 IEEE-754 浮点数

通常将转换后的数用16进制表示,步骤如下:

  • 将10进制浮点数,按照d,f,e(binary-64, binary-32,binary-16) pack
  • 将pack的结果按照无符号数unpack
  • 将无符号数用16进制表示

例如:将10进制浮点数3.5转换为IEEE-754 binary-16

import struct
x=3.5
y=struct.unpack('<h',struct.pack('<e',x)) # 将浮点数按照2byte float转换
z=hex(y[0])
print(z)
# 输出结果
# 0x4300


将10进制浮点数35.8转换为IEEE-754 binary-32

import struct