使用f
和x
,
In [173]: f
Out[173]: array(1387)
In [174]: x
Out[174]: array([ 20404266.1330007])
计算并比较
exponent1
和exponent2
。exponent1
计算如下:In [183]: exponent1 = 1j * 2 * np.pi * f[..., np.newaxis, np.newaxis] * x
exponent2
计算如下:In [186]: exponent2 = np.array([[[ 1.+0.j]]])
In [187]: exponent2 *= x[np.newaxis, ...]
In [188]: exponent2 *= f[..., np.newaxis, np.newaxis]
In [192]: exponent2 *= 1j * 2 * np.pi
exponent1
和exponent2
接近:In [195]: np.allclose(exponent1, exponent2)
Out[195]: True
但是它们的指数不是:
In [196]: np.allclose(np.exp(exponent1), np.exp(exponent2))
Out[196]: False
有没有办法使它们的指数也接近?我希望后者更接近前者,因为
In [198]: np.allclose(np.exp(exponent1), np.exp(1j * 2 * np.pi * 1387 * 20404266.1330007))
Out[198]: True
最佳答案
您的问题是有限的精度,并且如前所述,您对此无能为力。
在您的问题中,您正在计算2 * pi * f * x。因为这出现在周期为2 * pi(复指数)的函数中,所以f * x的唯一有效部分是小数点后的数字。换句话说,f * x中的信息仅包含在间隔[0,1)中的值中,因此我们可以认为确实需要计算f * x模1.0。
如果我们查看您提供的值,就会发现
f * x = 28300717126.4719(73)
我在括号中的第15个数字之后加上了“多余”的数字。 (大约可以看到15位数字的精度,如果您愿意的话,您可以更加小心,但这足以使您明白这一点。)因此,我们看到我们只计算f * x到4位有效数字。
如果现在比较您在问题中计算出的值,我们会发现
exponent1 = 177818650031.694(37)
exponent2 = 177818650031.694(4)
在这里我再次使用括号来表示多余的数字。我们看到这些价值观完全符合我们的预期。对于指数版本,我们对这些值取模2 * pi感兴趣,
exponent1%(2*pi) = 2.965(4796216371864)
exponent2%(2*pi) = 2.965(5101392153114)
现在,括号中的数字是我们期望的4个有效数字以外的数字。同样,完全符合我们所期望的水平。除非x和f的计算方式不能使所有这些多余的不必要的数字“浪费”我们的精度,否则我们无法做得更好。
关于python - 如何在这两个numpy数组过程中保持相同的精度?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17930148/