为何PyTorch的tensor.item()对.0/.5结尾的数输出精确,其他实数则不精确?
PyTorch tensor.item() 精度差异问题解析
问题现象
当执行以下代码时:
x = torch.tensor([3.5]) print(x) print(x.item()) print(float(x))
输出为:(tensor([3.5000]), 3.5, 3.5),tensor.item()和float()均返回精确值3.5。
但将张量参数改为3.1这类非.0/.5结尾的实数时:
x = torch.tensor([3.1]) print(x) print(x.item()) print(float(x))
输出变为:(tensor([3.1000]), 3.0999999046325684, 3.0999999046325684),tensor.item()返回了不精确的数值。
核心疑问:为什么PyTorch的tensor.item()对.0或.5结尾的实数输出精确,对其他实数存在精度问题?
原因解析
这和PyTorch本身无关,核心是二进制浮点数的存储逻辑:
- 计算机用二进制存储浮点数,只有当十进制数能写成
m/(2^n)(m、n为整数)的形式时,才能被二进制浮点数精确存储。.0(整数)、.5(即1/2)都满足这个条件,比如3.5就是7/2,自然能被精确存储。 - 而像3.1这样的数,转换成二进制后是无限循环的小数,有限位的二进制浮点数(比如PyTorch默认的
float32)根本存不下它的精确值,只能存一个最接近的近似值。当你用item()或者float()把张量值转成Python的浮点数时,这个底层的近似值就会被直接输出,所以看起来“不精确”。 - 至于打印张量时显示
3.1000,那是PyTorch做了格式化输出,自动截断了多余的小数位,并不是张量实际存储的真实值。
内容的提问来源于stack exchange,提问作者gabriel-pimentel
相关产品推荐
相关产品推荐

