为何调用t.item()时PyTorch浮点数出现精度异常?1.3无法准确表示
问题解析:PyTorch中1.3浮点数显示差异的原因
这不是PyTorch的bug,而是单精度浮点数的二进制存储特性导致的,和PyTorch本身无关:
- 十进制的1.3无法被二进制浮点数精确表示:1.3转换成二进制是无限循环的小数(类似十进制里的1/3=0.333...),而
torch.FloatTensor(包括默认的torch.Tensor)使用的是32位单精度浮点数,存储位数有限,只能存储1.3的近似值,实际存储的数值就是1.2999999523162842。 - PyTorch打印张量时会自动做四舍五入处理,所以
tensor([[1.3000]])是简化后的显示结果,而item()方法会直接返回张量存储的原始精确值,所以两者输出不同。 - 1.5能正常精确表示是因为它的二进制是有限位数的:1.5的二进制是
1.1,可以被32位浮点数完全存储,所以不管是打印张量还是用item()获取,结果都是1.5。
你可以用以下代码验证这个特性:
# 验证Python原生float的近似性(Python float是64位双精度) print(float(1.3)) # 输出: 1.3000000000000001 # 用双精度张量对比误差 t_double = torch.DoubleTensor([[1.3]]) print(t_double) # 输出: tensor([[1.3000]], dtype=torch.float64) print(t_double.item()) # 输出: 1.3000000000000001
内容的提问来源于stack exchange,提问作者username_entity
相关产品推荐
相关产品推荐

