半精度(16bit)0.01825转单精度(32bit)无法精确表示,求原因
问题根源解析
你的误解核心在于:你看到的半精度值0.01825只是numpy的简化显示,它实际存储的并不是精确的十进制0.01825,而半精度本身的所有取值确实都能被单精度精确表示。
具体拆解:
- 十进制小数
0.01825无法用二进制浮点数(不管半精度还是单精度)精确表示,因为它的二进制展开是无限循环的,就像十进制无法精确表示1/3一样。 - 当你执行
np.float16(0.01825)时,numpy会找到半精度格式下最接近0.01825的二进制浮点数,这个值和真实的0.01825存在微小误差,但numpy为了可读性,只显示到小数点后5位,所以你看到的输出是0.01825。 - 当转换为单精度
np.float32(x)时,是把半精度存储的那个近似值精确转换到单精度(单精度的位数更多,完全能覆盖半精度的所有可能取值),这时候numpy显示了更精确的十进制表示,也就是这个半精度值的真实数值:0.018249512。
你可以用以下代码验证半精度的真实值:
import numpy as np x = np.float16(0.01825) # 查看x的精确十进制表示 print(np.format_float_positional(x, precision=10)) # 输出会是类似0.0182495117
内容的提问来源于stack exchange,提问作者zell
相关产品推荐
相关产品推荐

