微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Numpy exp() 函数无缘无故地给了我错误的值

如何解决Numpy exp() 函数无缘无故地给了我错误的值

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 3 制作了一本 jupyternoebook。我直接从这里获取代码示例:

https://pythonnumericalmethods.berkeley.edu/notebooks/chapter24.04-FFT-in-Python.html

其中显示了所描述的 FFT 算法的简短实现。重要的是,他们使用 numpy.exp 函数,如我的代码所示。

我想写一些关于算法中使用的函数的解释,并做了一些打印比较直接的 numpyfft、scipyfft 和从链接实现的 FFT。存在巨大的四舍五入错误。所以我更深入地研究它,发现在我的 jupyternotebook 上,exp(-2j*PI) = 错误的值。应该是

exp(-2j*PI) = 1

所以它不是关于 FFT 算法,而是我得到的错误值,请参阅上面的代码打印。我搜索了一下,但似乎没有一个线程有帮助。有人建议在除法时强制转换为浮动,但在 -2j*PI 中我们不除法并且不需要强制转换?!

所以是的,我完全一无所知。对不起,如果这是我的一个基本错误,但我现在被困了几个小时,希望能够用正确的结果正确解释它。

(numpy 和 scipy 的 FFT 算法产生了正确的结果,但链接中的 FFT 显然不是)

解决方法

这是正确的答案。 Numpy 与所有以二进制计算的计算机一样,误差幅度很小。您可以通过四舍五入为 14 位(对于 32 位浮点数)来规避此问题:

print(np.round(np.exp(-2j*np.pi),14))
# (1+0j)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。