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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 07:16:11