为什么在 Pi 的整数倍处计算 torch.sin() 和 numpy.sin() 的数量级?

mim*_*ain 2 python precision numpy pytorch tensor

为什么 Pytorch 和 Numpy 的三角函数在以 Pi 的整数倍计算时会产生如此巨大的数量级差异?

>>> torch.sin(torch.ones(1)*2*np.pi)
tensor([1.7485e-07])
>>> np.sin(np.ones(1)*2*np.pi)
array([-2.4492936e-16])
Run Code Online (Sandbox Code Playgroud)

Tim*_*ers 5

扩展您得到的答案,但使用纯 Python:

>>> import math
>>> math.sin(2 * math.pi)
-2.4492935982947064e-16
Run Code Online (Sandbox Code Playgroud)

Python 使用 64 位浮点数,这与 numpy结果。

IEEE-754 64 位浮点数有 53 位精度,但 32 位浮点数只有 24 位。所以让我们将输入四舍五入为 24 位有效位,看看会发生什么:

>>> x = 2 * math.pi
>>> m, e = math.frexp(x)
>>> m *= 2**24
>>> m = round(m)
>>> y = math.ldexp(m, e - 24)
>>> math.sin(y)
1.7484556000744883e-07
Run Code Online (Sandbox Code Playgroud)

这与torch结果非常接近。