首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Python:什么是浮动(2**53+3)

Python:什么是浮动(2**53+3)
EN

Stack Overflow用户
提问于 2013-12-11 23:21:04
回答 3查看 220关注 0票数 1

我们知道python的浮点数是64位。我做了个测试:

代码语言:javascript
运行
复制
float(2**53) is 9007199254740992.0, 

这是可以的

代码语言:javascript
运行
复制
float(2**53+1) is also 9007199254740992.0, 

这是可以的,因为最后的1不能以64位二进制表示。

代码语言:javascript
运行
复制
float(2**53+3) is equal to float(2**53+2), 

但结果是

代码语言:javascript
运行
复制
float(2**53+3) is **9007199254740996.0**

在python中,浮点数是如何工作的?

EN

回答 3

Stack Overflow用户

发布于 2013-12-12 00:06:24

我相信这是因为你处于默认的IEEE取整模式,"round to even"

也就是说,当一个值恰好在两个可表示值之间舍入一半时,选择的结果是有效位最后一位为0的结果。

在这种情况下,由于损失了一位精度,这相当于“四舍五入为4的倍数”。

因此,值9007199254740995舍入为可表示值9007199254740996.0,而不是同样接近且可表示的值9007199254740994.0

同时,值9007199254740993舍入为9007199254740992.0,也不是9007199254740994.0

票数 1
EN

Stack Overflow用户

发布于 2013-12-11 23:34:49

注意,2**53+3是一个int64,所以没有问题,如果你用Python语言计算它,它会给出正确的答案9007199254740995

但是,float64的小数部分有52位,所以当您通过执行float(2**53+3)9007199254740995转换为float64时,您会失去精度,并四舍五入为附近的数字:9007199254740996.0

票数 0
EN

Stack Overflow用户

发布于 2013-12-11 23:35:11

根据IEEEIEEEIEEE64位浮点数标准,64位浮点数的精度为52位+1符号位。

这意味着任何需要超过52个有效位的数字都将舍入为52个有效位。

在您的例子中,您有53个有效位,这意味着最后一个位被丢弃/四舍五入/某些东西。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20522941

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档