【问题标题】:How to keep the same precision in these two numpy array procedures?如何在这两个 numpy 数组过程中保持相同的精度?
【发布时间】:2013-07-29 17:14:42
【问题描述】:

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

【问题讨论】:

    标签: python arrays numpy precision multiplication


    【解决方案1】:

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

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

    【讨论】:

    • 我想我最初的问题是关于为什么 exponent1 和 exponent2 完全不同,因为我开始使用相同的 f 和 x。但我有点看到你上面的观点,他们都有相同的位数(17)并且他们同意相同的小数(3)。 '模 2*pi' 与指数函数有什么关系呢?我不明白。我不能用“取模任意数”替换它,结果仍然同意相同的小数吗?
    • exp(1jtheta) = cos(theta) + 1jsin(theta) 和 cos(theta+2*pi*n) = cos(theta),对于sin(),对于 n 一个整数。因此我们只需要 theta 模 2*pi。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-22
    • 2011-03-01
    • 1970-01-01
    • 2019-07-20
    相关资源
    最近更新 更多