为什么numpy的正弦函数在某些点上如此不准确?

时间:2016-09-07 18:31:38

标签: python numpy floating-point

我刚检查了numpy的{​​{1}}函数。显然,它会在pi周围产生非常不准确的结果。

sine

预期结果为0.为什么In [26]: import numpy as np In [27]: np.sin(np.pi) Out[27]: 1.2246467991473532e-16 在那里不准确?

在某种程度上,我不确定将计算结果视为不准确是否可以接受:它的绝对误差在一个机器epsilon(对于binary64)内,而相对误差是numpy - 我之所以如此感到有些困惑。有什么想法吗?

[编辑]我完全理解浮点计算可能不准确。但是大多数浮点库可以设法在一小部分误差范围内提供结果。这里,相对误差是+ inf,这似乎是不可接受的。想象一下,我们想要计算

+inf

如果我们使用numpy的实现,结果将是灾难性的错误。

2 个答案:

答案 0 :(得分:7)

这里的主要问题是np.pi不完全是π,它是一个有限的二进制浮点数,它接近真正的无理实数π但仍然偏离~1e-16。 np.sin(np.pi)实际上返回的值更接近sin(np.pi)的真实无限精度结果(即理想的数学sin()函数被赋予近似np.pi值)而不是0

答案 1 :(得分:-1)

该值取决于用于计算它的算法。典型的实现将使用一些快速收敛的无限级数,直到它在一个机器epsilon内收敛为止。许多现代芯片(我认为从Intel 960开始)在指令集中都有这样的功能。

要为此返回0,我们需要一个明显更精确的算法,一个运行超精确算术以保证最接近匹配结果的算法,或者需要识别特殊情况的东西:检测PI的倍数并返回确切的价值。