我可以像matlab一样在python中获得完全相同的总和输出吗

Posted

技术标签:

【中文标题】我可以像matlab一样在python中获得完全相同的总和输出吗【英文标题】:can i get exactly same sum output in python like matlab 【发布时间】:2021-07-30 11:38:58 【问题描述】:

我正在将 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

【问题讨论】:

您正在使用 IEEE754 浮点数。你不能指望绝对准确:数值总是近似的。您的 Python 和 Matlab 代码 sn-ps 都返回大约为零。像这样的“奇怪”行为是完全正常的。 那么我使用哪些浮点值在 python 中获得相同的输出,,就像 matlab 一样 如果你只是运行一个 for 循环并将它们相加,那么我们可以获得相同的结果....但这就像 matlab 中的 sum (x) 【参考方案1】:

区别不是数字表示,而是求和的顺序。您可以在 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) 正在内部执行此操作。)要进一步了解为什么会发生这种情况,请参阅Why does changing the sum order returns a different result?

【讨论】:

是的,看起来 matlab 没有遵循一些已定义的求和规则

以上是关于我可以像matlab一样在python中获得完全相同的总和输出吗的主要内容,如果未能解决你的问题,请参考以下文章

在不知道输出数组大小的情况下,像 matlab 一样在 python 中连接数组

如何使用Python plt像MATLAB一样绘图

是否可以像在 Matlab 中一样在 Julia 中嵌套 tic() 和 toc() ?如果不是,那么解决方法是啥?

如何在matlab中保存不同的立方体变量?

如何像matlab一样检测opencv中的角点?

为何两个完全一样的字符串相比较却不一样