有谁知道为什么下面不等于0?

import numpy as np
np.sin(np.radians(180))

或者:
np.sin(np.pi)

当我将其输入python时,它的值为1.22e-16。

最佳答案

数字π不能完全表示为浮点数。因此,np.radians(180)不会给您π,它会给您3.1415926535897931

实际上,sin(3.1415926535897931)类似于1.22e-16

那么,您如何处理呢?

您必须计算出或至少猜测出适当的绝对和/或相对误差范围,然后编写以下代码而不是x == y:

abs(y - x) < abs_bounds and abs(y-x) < rel_bounds * y

(这也意味着您必须组织计算,以使相对于y的相对误差大于相对于x的相对误差。在您的情况下,因为y是常量0,所以这很简单-只需向后进行即可。)

Numpy提供了一个在整个数组 allclose 中为您执行此操作的函数:
np.allclose(x, y, rel_bounds, abs_bounds)

(这实际上检查了abs(y - x) < abs_ bounds + rel_bounds * y),但这几乎总是足够的,如果没有,您可以轻松地重新组织代码。)

在您的情况下:
np.allclose(0, np.sin(np.radians(180)), rel_bounds, abs_bounds)

那么,您如何知道正确的界限呢? SO答案无法教您足够的错误分析。 Wikipedia上的Propagation of uncertainty提供了高层次的概述。如果您真的不知道,可以使用默认值,它们是1e-5相对值和1e-8绝对值。

10-08 15:14