sum和np.sum之间的差异对于复数numpy

时间:2016-02-29 05:18:40

标签: python numpy scipy fft complex-numbers

我试图将dft矩阵的乘法分成实部和虚部

from scipy.linalg import dft
improt numpy as np
# x is always real
x = np.ones(4)
W = dft(4)
Wx = W.dot(x)
Wxme = np.real(W).dot(x) + np.imag(W).dot(x)*1.0j

我希望Wx和Wxme给出相同的值,但它们根本不存在。我已经把这个bug缩小了一点:

In [62]: W[1]
Out[62]: 
array([  1.00000000e+00 +0.00000000e+00j,
         6.12323400e-17 -1.00000000e+00j,
        -1.00000000e+00 -1.22464680e-16j,  -1.83697020e-16 +1.00000000e+00j])

In [63]: np.sum(W[1])
Out[63]: (-2.2204460492503131e-16-1.1102230246251565e-16j)

In [64]: sum(W[1])
Out[64]: (-1.8369701987210297e-16-2.2204460492503131e-16j)

为什么sumnp.sum会给出不同的值?添加复数不应该只是添加实部和虚部正确吗?

手工添加给我的结果是我期望的结果,而不是numy给我的结果:

In [65]: 1.00000000e+00 + 6.12323400e-17 + -1.00000000e+00 + 1.83697020e-16
Out[65]: 1.8369702e-16

我错过了什么?

1 个答案:

答案 0 :(得分:4)

直到舍入误差,这些结果是相同的。由于不同的求和顺序或用于表示中间结果的不同精度水平等因素,结果的舍入误差略有不同。