如何在这两个 numpy 数组过程中保持相同的精度



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

exponent1exponent2很接近:

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

最新更新