我正在将matlab代码转换为python。我发现matlab和python的总和有一个奇怪的区别。我想在python中得到和在matlab中相同的输出。有可能吗?在matlab中
x = [-200:200]/200; % 401 values from -200 to 200 y =sum(x) y = 9.9920e-16
但在使用不同模块的python中,我得到了答案
x = np.arange(-200,201)/200 # 401 values from -200 to 200 y = np.sum(x) y = 1.4210854715202004e-14 z = sum(x) z = -8.43769498715119e-15 zmath = math.fsum(x) zmath = 0.0
区别不在于数字表示,而在于求和的顺序。你可以在Matlab:中看到这一点
>> sum(x(randperm(401)))
ans =
2.7756e-16
>> sum(x(randperm(401)))
ans =
5.8842e-15
>> sum(x(randperm(401)))
ans =
-2.2204e-15
求和的顺序将取决于实现细节,例如,数组操作是否利用了CPU的矢量寄存器。如果必须得到完全相同的结果,则必须编写一个显式循环。(根据您得到的答案,Python中的z = sum(x)
在内部这样做。(有关发生这种情况的更多理解,请参阅为什么更改和顺序会返回不同的结果?