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