为什么在 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
结果非常接近。
为什么 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
结果非常接近。