使用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/