You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Python中将fp16数组转换为float?含C联合数据解析场景

把FP16调试数据转换为Float类型的解决方案

没问题,我来帮你搞定这个转换问题。首先咱们先理清楚背景:你的C语言union里__fp16 half[]对应的是16字节的内存块,也就是8个FP16值(每个FP16占2字节),你已经用Python的struct把它解析成了16个uint8的元组,现在需要把这些FP16值逐个转成标准的float类型。

最简便的方法:用NumPy处理

NumPy提供了直接处理FP16类型的工具,既高效又不容易出错,这是最推荐的方案:

import numpy as np

# 你解析得到的原始字节元组
raw_byte_tuple = (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 226, 196, 116, 0, 0, 0)
# 先把元组转换成bytes对象
byte_data = bytes(raw_byte_tuple)

# 从bytes中读取FP16数组,再转换为float32类型
float_values = np.frombuffer(byte_data, dtype=np.float16).astype(np.float32)

# 打印结果,这里会输出8个float值
print(float_values)

代码解释

  1. bytes(raw_byte_tuple):把struct解析出来的uint8元组转换成连续的字节流,方便NumPy读取。
  2. np.frombuffer(byte_data, dtype=np.float16):告诉NumPy把字节流按FP16格式(每个元素2字节)解析成数组,这样就得到了8个FP16值。
  3. .astype(np.float32):把每个FP16值转换成标准的32位float,也就是Python里的float类型。

关于字节序的注意事项

要确保字节序和你的C程序一致:

  • 如果你的C代码运行在小端系统(比如x86/x86_64架构的电脑),NumPy默认会用系统的字节序,不需要额外设置。
  • 如果是大端系统,需要指定dtype为'>f2'(比如np.frombuffer(byte_data, dtype='>f2')),表示大端模式的FP16。

手动转换方案(不推荐,仅作参考)

如果不想依赖NumPy,你可以手动实现FP16到float的转换逻辑(基于IEEE 754标准),但这个方法容易出错,适合需要深入理解转换原理的场景:

def fp16_to_float(fp16):
    # 解析FP16的符号位、指数位、尾数位
    sign = (fp16 >> 15) & 0x1
    exponent = (fp16 >> 10) & 0x1F
    mantissa = fp16 & 0x3FF

    # 处理特殊情况:零、无穷大、NaN
    if exponent == 0:
        if mantissa == 0:
            return 0.0 * (-1)**sign
        else:
            # 非规格化数
            return (-1)**sign * (mantissa / 2**10) * 2**(-14)
    elif exponent == 31:
        if mantissa == 0:
            return float('inf') * (-1)**sign
        else:
            return float('nan')
    # 规格化数
    else:
        return (-1)**sign * (1 + mantissa / 2**10) * 2**(exponent - 15)

# 处理你的原始数据
raw_byte_tuple = (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 226, 196, 116, 0, 0, 0)
float_values = []
# 两两分组,每个FP16占2字节(小端模式)
for i in range(0, len(raw_byte_tuple), 2):
    # 小端:低字节在前,高字节在后
    fp16_val = (raw_byte_tuple[i+1] << 8) | raw_byte_tuple[i]
    float_val = fp16_to_float(fp16_val)
    float_values.append(float_val)

print(float_values)

运行这段代码,你会得到和NumPy方案一样的结果。

内容的提问来源于stack exchange,提问作者DarkZeros

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 03:32:11