我刚检查了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的实现,结果将是灾难性的错误。
答案 0 :(得分:7)
这里的主要问题是np.pi
不完全是π,它是一个有限的二进制浮点数,它接近真正的无理实数π但仍然偏离~1e-16。 np.sin(np.pi)
实际上返回的值更接近sin(np.pi)
的真实无限精度结果(即理想的数学sin()
函数被赋予近似np.pi
值)而不是0
答案 1 :(得分:-1)
该值取决于用于计算它的算法。典型的实现将使用一些快速收敛的无限级数,直到它在一个机器epsilon内收敛为止。许多现代芯片(我认为从Intel 960开始)在指令集中都有这样的功能。
要为此返回0,我们需要一个明显更精确的算法,一个运行超精确算术以保证最接近匹配结果的算法,或者需要识别特殊情况的东西:检测PI的倍数并返回确切的价值。