资讯专栏INFORMATION COLUMN

python疑问2:2.25-2.2!=0.05?

lucas / 1109人阅读

摘要:为了表示这两种状态,便引入和为了表示更多状态,便增加和的对数。浮点数存储方式由于计算机不识别十进制,所以十进制数据都要转换为二进制保存。

对于标题疑问,2.25-2.2!=0.05,那正确答案是什么呢?

print(2.25-2.2) //0.04999999999999982

事实证明,的确不等于0.05.那0.04999999999999982是怎么得来的呢?
Google:因为误差
误差是怎么产生的,为什么整数就能精确表示,而浮点数不能精确表示?
Google:因为整数和浮点数在计算机的存储方式不同
那浮点数跟整数相比,浮点数在计算机如何存储的呢?
Google:说来话长......

1.计算机的本质
追根究底,计算机工作的实质便是电压的高低切换,像电灯,高电位,电灯亮,低电位,电灯灭。为了表示这两种状态,便引入0和1.为了表示更多状态,便增加0和1的对数。32bit和64bit的计算机就是这样来的,代表了计算机内存存放待处理数据的大小。32bit的计算机内存大概在4G左右,64bit更多。

//32bit
00000000000000000000000000000000-11111111111111111111111111111111

2.浮点数存储方式
由于计算机不识别十进制,所以十进制数据都要转换为二进制保存。并且是以二进制的科学记数法进行保存

2.25 = 10.01(二进制) = 1.001*2^1(二进制科学计数法)
// 2.25整数部分转换:2=10(除2取余法)
// 小数部分转换过程:0.25*2 = 0.5 取整数部分0 (乘2取整法)
//                  0.5*2 = 1 取整数部分1
// 故小数部分0.25 = .01

浮点数转换为二进制科学计数法,由三部分组成符号位,指数位,尾数部分

这三部分在计算机中是怎么存储的呢?
以单精度float为例,float根据IEEE R32.24标准数据占32位,每部分存放规则如下:

说明:1.对于符号位,若值为正,则为0,若值为负,则为1
2.对于指数位,由于指数存在正指数和负指数,占一位,其余7位表示值的大小,故范围为-127~128.指数位采用移位存储方式,即元指数+127(00000000=>-127)~(11111111=>128)
3.对于尾数部分,由于第一位恒为1,所以实际表示并未考虑第一位,所以有效位为24位


那么2.25(即1.001*2^1)在计算机中存储方式为:

0(正) 10000000(1+127) 00100000000000000000000(.001)

2.2呢?
利用十进制转二进制得:

//2.2小数本分0.2采用乘2取整法过程:
//0.2*2=0.4    0
//0.4*2=0.8    0
//0.8*2=1.6    1
//0.6*2=1.2    1
//0.2*2=0.4    0
//......
//不可能乘2恰好得到1.0
2.2=10.00110011001100110011001100110011001100110011001101...(无限不循环)
=1.00011001100110011001100*2^1(尾数部分超过23位都被截去了) !=2.2

0(正) 10000000(1+127) 00011001100110011001100

可见,2.2的小数部分通过乘二取整法,永远无法恰好达到1,所以二进制尾数部分成无限不循环,超过23位的数据会直接被丢弃,导致与原十进制数据不相等。这也就是误差产生的根源。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/41332.html

相关文章

  • Python学习笔记

    入坑 Python自从进入公司,到现在也有半年的时间。这半年的时间从 python 到入门到开发了几个小项目,类型涵盖了web应用 程序、爬虫程序 (scrapy),python脚本工具,自动化工具。对 python 语言也越来越熟悉,当然也有所感悟和总结。首先 Python 真的让语言成 了一个工具,入门代价很小,上手能够开发出小工具,可以更快体验到编程的乐趣。但是做到pythonic需要更多的...

    社区管理员 评论0 收藏0
  • 世界这么大,你的那一个他肯定会出现,Python表白代码大集合(附上源码)

    摘要:本文将利用画多种不同的表白图,附上源码,表白代码看这一篇文章就够啦,总有你喜欢的,喜欢的话别忘记三连了。 本文将利用Python画多种不同的表白图,附上源码,表白代...

    JellyBool 评论0 收藏0
  • python大数据可视化制作火山图实例

      本文关键给大家介绍了python大数据可视化制作火山图实例详细说明,感兴趣的小伙伴可以参考借鉴一下,希望可以有一定的帮助,祝愿大家多多的发展,尽早涨薪  导进控制模块  importnumpyasnp   importpandasaspd  1.载入测试报告  data=pd.read_csv(r'E:ZYHR.projectrna-seqlianxi1exon_leveldf.csv...

    89542767 评论0 收藏0
  • Golang什么时候该使用指针

    Golang 什么时候使用指针(Pointer)?什么时候使用值(Value)?对于go开发者来说是一件头疼的事情, 而且这个问题似乎没有绝对的答案,那是否代表我们可以随意使用呢?答案当然是否定的。本文我将试图总结什么场景使用指针更合理。 在开始阅读前,建议读者先能够清晰理解 Golang 指针、类型和值等概念。本文并不是标准更不是唯一答案,而是自己根据使用经验和社区的一些讨论而总结的实践有下几种...

    社区管理员 评论0 收藏0

发表评论

0条评论

lucas

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<