1

使用fx,

In [173]: f
Out[173]: array(1387)

In [174]: x
Out[174]: array([ 20404266.1330007])

exponent1exponent2进行计算和比较。

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
4

1 回答 1

4

您的问题是有限精度,并且如前所述,您无能为力。

在您的问题中,您正在计算 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 的计算方式不会让所有这些额外的、不必要的数字“浪费”我们的精度,否则我们无法做得更好。

于 2013-07-29T19:51:10.983 回答