Python 使用sum、np.sum和fsum对数组列表求和时是否会得到不同的结果?
我试图从nparry表格中的直方图列表中得到一个平均直方图。我使用了不同的方法,得到了非常不同的sum、np.sum和fsum结果。我不确定为什么或者哪一个是“正确的”。Python 使用sum、np.sum和fsum对数组列表求和时是否会得到不同的结果?,python,arrays,numpy,Python,Arrays,Numpy,我试图从nparry表格中的直方图列表中得到一个平均直方图。我使用了不同的方法,得到了非常不同的sum、np.sum和fsum结果。我不确定为什么或者哪一个是“正确的”。 双精度求和的问题在于,双精度的精度有限,特别是如果对大小差异很大的值求和,可能会得到不同的结果。如果你真的感兴趣的话,维基百科上的这篇文章值得一读 math.fsum可能是对双倍求和时最正确的结果。但它比其他方法慢 numpy.sum不是很好。它目前使用的是比简单的实现要好一点的,而且速度相当快。然而,结果可能并不完全准确
双精度求和的问题在于,双精度的精度有限,特别是如果对大小差异很大的值求和,可能会得到不同的结果。如果你真的感兴趣的话,维基百科上的这篇文章值得一读
可能是对双倍求和时最正确的结果。但它比其他方法慢math.fsum
不是很好。它目前使用的是比简单的实现要好一点的,而且速度相当快。然而,结果可能并不完全准确numpy.sum
只是一个简单的求和。它通常比fsum快,但在精度方面,它是三种方法中最差的sum
浮点数的精度有限,在很多情况下,浮点数都不适用于完全精确的结果(如果需要完全精确的结果,则需要使用
十进制
或分数
)
然而,中间结果的有限精度是另一个误差源,它会完全扭曲(原始)求和的结果:
>>> 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
只是一个简单的求和。它通常比fsum快,但在精度方面,它是三种方法中最差的sum
浮点数的精度有限,在很多情况下,浮点数都不适用于完全精确的结果(如果需要完全精确的结果,则需要使用
十进制
或分数
)
然而,中间结果的有限精度是另一个误差源,它会完全扭曲(原始)求和的结果:
>>> 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。请不要张贴代码的图片,代码的副本(包括输入,但尽量减少代码-请参阅)使回答者更容易给出准确答案。