我想了解为什么对浮点数列表求和的两种方法相差正好 32.0?
import math
nums = [26015151255025000.,26015151255025000.,26015151255025000.,26015151255025000.,26015151255025000.,26015151255025000.,26015151255025000.,26015151255025000.,26015151255025000.]
math_fsum_result = math.fsum(nums)
loop_result = 0.0
for n in nums:
loop_result += n
print(format(math_fsum_result, '.1f'))
print(format(loop_result, '.1f'))
产生:
234136361295224992.0
234136361295224960.0
据了解,两者都在累积舍入误差,但恰好 32.0 的不一致似乎很奇怪。
根据记录,用小数计算的正确值为:
234136361295225000.0
我从未使用过这种方法,但我认为关键的区别在于算法在这两种情况下的工作方式。对于数学本身,算法往往会产生精确且更好的结果,而 Python 中使用循环和计算的标准计算会截断结果,降低精度。
更不用说与 math.fsum() 相比,处理循环需要更多时间。内置的 sum() 函数可以代替循环,可以执行相同的操作。如果您想了解有关 sum 和 math.fsum() 的更多信息
参考这篇文章:Python 3.12 中内置的 sum() 和 math.fsum() 有什么区别?