我正在使用python2数学模块来计算fsum的总和.据我所知,0.1通常不能存储二进制.据我所知math.fsum应该以某种方式解决这个问题.
import math math.fsum([0.0, 0.1]) #0.1 math.fsum([0.1, 0.1]) #0.2 math.fsum([0.2, 0.1]) #0.30000000000000004 math.fsum([0.3, 0.1]) #0.4 math.fsum([0.4, 0.1]) #0.5
所以math.fsum([0.2,0.1])== 0.3将为False.这应该是这样的吗?难道我做错了什么?
我怎样才能得到0.2 + 0.1 == 0.3为真?
你误解了什么math.fsum
.它计算给定输入的最准确可能总和(即,与输入的精确数学和最接近的精确可表示值).它并没有用你原先想到的数字神奇地取代它的输入.
在上面的第三行中,输入to math.fsum
是一个包含值的列表,0.1000000000000000055511151231257827021181583404541015625
并且0.200000000000000011102230246251565404236316680908203125
(请记住,使用二进制浮点,所见即所得;这里我显示了Python使用的确切值).这两个值的确切总和是0.3000000000000000166533453693773481063544750213623046875
,最接近可表示的IEEE 754 binary64浮动到那个精确的总和0.3000000000000000444089209850062616169452667236328125
,这就是你得到的.
你问math.fsum
的行为,就好像是给定的精确值0.1
和0.2
,但它无法知道这是你想要的方式:它只能在你给它的输入操作.
请注意,在大多数机器上,添加两个浮点数已经正确舍入,因此使用没有任何优势math.fsum
.math.fsum
旨在除去四舍五入参与求和误差的累积更多于两个浮动.