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

Why there are orders of magnitude in the evaluation of torch.sin() and numpy.sin() at integer multiples of Pi?

为什么 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])

Torch 默认为 32 位浮点数,而 NumPy 默认为 64 位。您在 Torch 中得到的舍入误差在 32 位浮点数的预期范围内。如果您想要不同的数据类型,请指定不同的数据类型。

扩展你得到的答案,但使用普通 Python:

>>> import math
>>> math.sin(2 * math.pi)
-2.4492935982947064e-16

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

这与 torch 结果非常接近。