我们知道python的浮点数是64位。我做了个测试:
float(2**53) is 9007199254740992.0,
这是可以的
float(2**53+1) is also 9007199254740992.0,
这是可以的,因为最后的1不能以64位二进制表示。
float(2**53+3) is equal to float(2**53+2),
但结果是
float(2**53+3) is **9007199254740996.0**
在python中,浮点数是如何工作的?
发布于 2013-12-12 00:06:24
我相信这是因为你处于默认的IEEE取整模式,"round to even"。
也就是说,当一个值恰好在两个可表示值之间舍入一半时,选择的结果是有效位最后一位为0的结果。
在这种情况下,由于损失了一位精度,这相当于“四舍五入为4的倍数”。
因此,值9007199254740995
舍入为可表示值9007199254740996.0
,而不是同样接近且可表示的值9007199254740994.0
同时,值9007199254740993
舍入为9007199254740992.0
,也不是9007199254740994.0
。
发布于 2013-12-11 23:34:49
注意,2**53+3
是一个int64
,所以没有问题,如果你用Python语言计算它,它会给出正确的答案9007199254740995
。
但是,float64
的小数部分有52位,所以当您通过执行float(2**53+3)
将9007199254740995
转换为float64
时,您会失去精度,并四舍五入为附近的数字:9007199254740996.0
。
发布于 2013-12-11 23:35:11
根据IEEEIEEEIEEE64位浮点数标准,64位浮点数的精度为52位+1符号位。
这意味着任何需要超过52个有效位的数字都将舍入为52个有效位。
在您的例子中,您有53个有效位,这意味着最后一个位被丢弃/四舍五入/某些东西。
https://stackoverflow.com/questions/20522941
复制相似问题