PyTorch张量转换精度丢失:除法高位异常值问题问询
为何PyTorch在除法运算的高位会出现如此奇怪的精度错误?
问题背景
在Python 3.12.4、Torch 2.3.0.post100环境下运行以下代码:
a = torch.tensor(1.0/10.0) print("{:.10f}, {:.10f}, {:.10f}".format(1.0/10.0, torch.tensor(1.0/10.0), a))
得到输出:
0.1000000000, **0.1000000015**, **0.1000000015**
以下是该精度差异的原因解析:
精度差异的本质原因
这并非PyTorch的运算错误,核心是浮点数的二进制表示局限性,以及Python与PyTorch默认浮点数精度不同导致的:
- 十进制的0.1无法被二进制浮点数精确表示,它是一个无限循环的二进制小数,任何浮点数类型都只能存储它的近似值。
- Python中的
1.0/10.0默认是64位双精度浮点数(float64),有效位数更多,对0.1的近似精度更高,用{:.10f}格式化时刚好显示为0.1000000000。 - PyTorch默认创建的张量是32位单精度浮点数(
float32),有效位数更少,对0.1的近似值和双精度版本存在细微差异,同样格式化后就会显示出0.1000000015的区别。
验证与解决
如果让PyTorch使用双精度浮点数,结果会和Python原生浮点数完全一致:
a = torch.tensor(1.0/10.0, dtype=torch.float64) print("{:.10f}, {:.10f}, {:.10f}".format(1.0/10.0, torch.tensor(1.0/10.0, dtype=torch.float64), a))
输出:
0.1000000000, 0.1000000000, 0.1000000000
总结
这种精度差异是浮点数本身的特性导致的近似表示区别,而非PyTorch的除法运算存在错误。在需要高精度的场景下,可通过指定dtype=torch.float64让PyTorch使用双精度浮点数来避免此类差异。
内容的提问来源于stack exchange,提问作者Arash Fahim
相关产品推荐
相关产品推荐

