Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用sum、np.sum和fsum对数组列表求和时是否会得到不同的结果?_Python_Arrays_Numpy - Fatal编程技术网

Python 使用sum、np.sum和fsum对数组列表求和时是否会得到不同的结果?

Python 使用sum、np.sum和fsum对数组列表求和时是否会得到不同的结果?,python,arrays,numpy,Python,Arrays,Numpy,我试图从nparry表格中的直方图列表中得到一个平均直方图。我使用了不同的方法,得到了非常不同的sum、np.sum和fsum结果。我不确定为什么或者哪一个是“正确的”。 双精度求和的问题在于,双精度的精度有限,特别是如果对大小差异很大的值求和,可能会得到不同的结果。如果你真的感兴趣的话,维基百科上的这篇文章值得一读 math.fsum可能是对双倍求和时最正确的结果。但它比其他方法慢 numpy.sum不是很好。它目前使用的是比简单的实现要好一点的,而且速度相当快。然而,结果可能并不完全准确

我试图从nparry表格中的直方图列表中得到一个平均直方图。我使用了不同的方法,得到了非常不同的sum、np.sum和fsum结果。我不确定为什么或者哪一个是“正确的”。

双精度求和的问题在于,双精度的精度有限,特别是如果对大小差异很大的值求和,可能会得到不同的结果。如果你真的感兴趣的话,维基百科上的这篇文章值得一读

  • math.fsum
    可能是对双倍求和时最正确的结果。但它比其他方法慢
  • numpy.sum
    不是很好。它目前使用的是比简单的实现要好一点的,而且速度相当快。然而,结果可能并不完全准确
  • sum
    只是一个简单的求和。它通常比fsum快,但在精度方面,它是三种方法中最差的

浮点数的精度有限,在很多情况下,浮点数都不适用于完全精确的结果(如果需要完全精确的结果,则需要使用
十进制
分数

然而,中间结果的有限精度是另一个误差源,它会完全扭曲(原始)求和的结果:

>>> import numpy as np
>>> import math
>>> a = [1, 1e20, 1, -1e20]  # the 1e20 and -1e20 cancel each other.
>>> sum(a)
0.0
>>> np.sum(a)
0.0
>>> math.fsum(a)
2.0

在这种情况下,只有
math.fsum
给出了
2

的预期结果。双精度求和的问题在于双精度有限,特别是如果求和值的大小差异很大,则可能会得到不同的结果。如果你真的感兴趣的话,维基百科上的这篇文章值得一读

  • math.fsum
    可能是对双倍求和时最正确的结果。但它比其他方法慢
  • numpy.sum
    不是很好。它目前使用的是比简单的实现要好一点的,而且速度相当快。然而,结果可能并不完全准确
  • sum
    只是一个简单的求和。它通常比fsum快,但在精度方面,它是三种方法中最差的

浮点数的精度有限,在很多情况下,浮点数都不适用于完全精确的结果(如果需要完全精确的结果,则需要使用
十进制
分数

然而,中间结果的有限精度是另一个误差源,它会完全扭曲(原始)求和的结果:

>>> import numpy as np
>>> import math
>>> a = [1, 1e20, 1, -1e20]  # the 1e20 and -1e20 cancel each other.
>>> sum(a)
0.0
>>> np.sum(a)
0.0
>>> math.fsum(a)
2.0

在这种情况下,只有
math.fsum
给出了
2

欢迎使用StackOverflow。请不要张贴代码的图片,代码的副本(包括输入,但尽量减少代码-请参阅)使回答者更容易给出准确答案。欢迎使用StackOverflow。请不要张贴代码的图片,代码的副本(包括输入,但尽量减少代码-请参阅)使回答者更容易给出准确答案。