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

标签 python arrays numpy precision multiplication

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

关于python - 如何在这两个 numpy 数组过程中保持相同的精度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17930148/

相关文章:

python - 如何过滤django modelformset manytomany成员的查询集

python - 获取向后写入的字符串的后半部分

python - 类型错误 : only integer scalar arrays can be converted to a scalar index

python - 规范化来自各种 "image"对象的 numpy 数组

Python + MongoDB 文档版本控制

Python Bokeh TapTool 跳转到对应DataTable行

.NET 排序列表 <> 与关联数组

python - 在保持顺序的同时找到两个 NumPy 数组的交集的最快方法是什么?

c - 如何在c中返回一个数组

python - numpy TypeError : ufunc 'invert' not supported for the input types, 和输入