math.fsum 的结果与 python 中的简单循环和不同

问题描述 投票:0回答:1

我想了解为什么对浮点数列表求和的两种方法相差正好 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 arrays math sum
1个回答
0
投票

我从未使用过这种方法,但我认为关键的区别在于算法在这两种情况下的工作方式。对于数学本身,算法往往会产生精确且更好的结果,而 Python 中使用循环和计算的标准计算会截断结果,降低精度。

更不用说与 math.fsum() 相比,处理循环需要更多时间。内置的 sum() 函数可以代替循环,可以执行相同的操作。如果您想了解有关 sum 和 math.fsum() 的更多信息
参考这篇文章:Python 3.12 中内置的 sum() 和 math.fsum() 有什么区别?

© www.soinside.com 2019 - 2024. All rights reserved.