Numpy exp() 函数无缘无故地给我错误的值
Numpy exp() function gives me wrong value for no reason
import matplotlib.pyplot as plt
#from numpy.fft import fft as numpyfft
#from scipy.fftpack import fft as scipyfft
import numpy as np
print(np.exp([-2j*np.pi]))
print(np.exp([-2.j*np.pi]))
print(np.exp(-2j*np.pi))
print(np.exp(-2.j*np.pi))
[1.+2.4492936e-16j]
[1.+2.4492936e-16j]
(1+2.4492935982947064e-16j)
(1+2.4492935982947064e-16j)
所以前几天我做了一个关于 FFT 主题的演讲。因此,我用 python 制作了一本 jupyternoebook。我直接从这里获取代码示例:
https://pythonnumericalmethods.berkeley.edu/notebooks/chapter24.04-FFT-in-Python.html
显示了所描述的 FFT 算法的简短实现。重要的是,他们使用我的代码中显示的 numpy.exp 函数。
我想写一些关于算法中使用的函数的解释,并做了一些比较直接 numpyfft、scipyfft 和从 link 实现的 FFT 的打印。存在巨大的类似舍入的错误。所以我深入研究了一下,发现在我的 jupyternotebook 上,exp(-2j*PI) = 错误值。应该是
所以它不是关于 FFT 算法,而是我得到的错误值,请参见上面的代码打印。我搜索了一下,但 none 的线程似乎有所帮助。有人建议在划分时转换为浮动,但在 -2j*PI 中我们不划分并且不需要转换?!
所以,是的,我完全一无所知。抱歉,如果这是我的基本错误,但我现在被困了几个小时,希望能够用正确的结果正确地解释它。
(numpy 和 scipy 的 FFT 算法产生正确的结果,但 link 的 FFT 显然不是)
这是正确答案。与所有以二进制计算的计算机一样,Numpy 的误差范围很小。您可以通过四舍五入到 14 位数字(对于 32 位浮点数)来规避此问题:
print(np.round(np.exp(-2j*np.pi),14))
# (1+0j)
import matplotlib.pyplot as plt
#from numpy.fft import fft as numpyfft
#from scipy.fftpack import fft as scipyfft
import numpy as np
print(np.exp([-2j*np.pi]))
print(np.exp([-2.j*np.pi]))
print(np.exp(-2j*np.pi))
print(np.exp(-2.j*np.pi))
[1.+2.4492936e-16j]
[1.+2.4492936e-16j]
(1+2.4492935982947064e-16j)
(1+2.4492935982947064e-16j)
所以前几天我做了一个关于 FFT 主题的演讲。因此,我用 python 制作了一本 jupyternoebook。我直接从这里获取代码示例:
https://pythonnumericalmethods.berkeley.edu/notebooks/chapter24.04-FFT-in-Python.html
显示了所描述的 FFT 算法的简短实现。重要的是,他们使用我的代码中显示的 numpy.exp 函数。
我想写一些关于算法中使用的函数的解释,并做了一些比较直接 numpyfft、scipyfft 和从 link 实现的 FFT 的打印。存在巨大的类似舍入的错误。所以我深入研究了一下,发现在我的 jupyternotebook 上,exp(-2j*PI) = 错误值。应该是
所以它不是关于 FFT 算法,而是我得到的错误值,请参见上面的代码打印。我搜索了一下,但 none 的线程似乎有所帮助。有人建议在划分时转换为浮动,但在 -2j*PI 中我们不划分并且不需要转换?!
所以,是的,我完全一无所知。抱歉,如果这是我的基本错误,但我现在被困了几个小时,希望能够用正确的结果正确地解释它。
(numpy 和 scipy 的 FFT 算法产生正确的结果,但 link 的 FFT 显然不是)
这是正确答案。与所有以二进制计算的计算机一样,Numpy 的误差范围很小。您可以通过四舍五入到 14 位数字(对于 32 位浮点数)来规避此问题:
print(np.round(np.exp(-2j*np.pi),14))
# (1+0j)