我们知道python float number是64bit。我接受了测试:
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中运行?
答案 0 :(得分:1)
我相信这是因为您处于默认的IEEE舍入模式"round to even"。
也就是说,当在两个可表示的值之间精确舍入一个值时,选择的结果是有效数字的最后一位为0的结果。
在这种情况下,由于你失去了一点精度,这相当于“四舍五入到4的倍数”。
因此,值9007199254740995
向可表示的值9007199254740996.0
舍入,而不是同等值且可表示的值9007199254740994.0
同时,值9007199254740993
向9007199254740992.0
舍入,也不是9007199254740994.0
。
答案 1 :(得分:0)
请注意2**53+3
是int64
,所以没有问题,如果你在python中评估它,它会给你正确的答案9007199254740995
。
但是,float64
对于小数部分有52位,因此当您通过执行9007199254740995
将float64
转换为float(2**53+3)
时,您将失去精确度并四舍五入到附近号码:9007199254740996.0
。
答案 2 :(得分:0)
根据http://en.wikipedia.org/wiki/IEEE_floating_point IEEE标准,64位浮点数的精度为52位+ 1位符号。
这意味着任何需要超过52个有效位的数字都会四舍五入为52位有效位。
在你的情况下,你有53个有效位,这意味着最后一个被丢弃/舍入/某事。