使用 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 以这样一种方式计算,否则我们不会让所有这些额外的、不必要的数字"浪费"我们的精度。