使用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] * xexponent2的计算方法如下:
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.piexponent1和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发布于 2013-07-30 03:51:11
你的问题是有限的精度,就像上面提到的,你对此无能为力。
在你的问题中,你正在计算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*π的值感兴趣,
exponent1%(2*pi) = 2.965(4796216371864)
exponent2%(2*pi) = 2.965(5101392153114)现在的括号是超出我们预期的4个有效数字的额外数字。再一次,完全符合我们可以预期的水平。我们不能做得更好,除非x和f的计算方式不会让所有这些额外的、不必要的数字“浪费”我们的精度。
https://stackoverflow.com/questions/17930148
复制相似问题