博客
关于我
浮点数在内存中的存储
阅读量:334 次
发布时间:2019-03-04

本文共 1004 字,大约阅读时间需要 3 分钟。

正数在内存的存储是以最高位为符号位,其余为数值的二进制序列,那么浮点数在内存中是怎么进行存储的呢,接下来我们一起看一看;

假设一个数为1154,那么用科学记数法可以表示为1.154*10^3,同理在计算机中也可以用科学计数法进行存储,那么他是怎么进行的呢?

比如:10在计算机中是以二进制储存的,即1010,转化为科学技术法为 (-1)^s* 1.01*2^3;
规定有,s为符号位,0代表正数,1代表正数,M=1.01代表有效数字,E=3, 2^E代表指数位;
对于32位浮点数,最高的一位比特位是符号s位,接下来的8位是指数E,剩下的32位为有效数字M,如图所示:
在这里插入图片描述

1.M的存储:在上述中,可以清晰的认知到1<=M<2,即M的首位永远都是1,那么进行存储时就被不在对1进行存储,只存1后面的数字,如此一来M可以保存24位有效数字;
M的存储是在图中M位处的最左端开始,多余的比特位补0处理;

2.E的存储:很显然E是一个无符号整数,8个bit取值范围为0-255,又可知科学计数法中指数是可以出现负数的,那么就有了规定,当存储E的时候需要加上127,即存储的是 E=10+127;

3.E的读取:第2点讲到,E存储的时候是加上127的,当然读取的时候也要减去127,可是有如下2种特殊情况:
3.1.当E为全0时,很显然读取E的时候减去127为-127,那么很容易理解这样一来2^E会非常小近乎于0,计算机就将此时的浮点数表示为0,并且这个0值不是唯一的;
在这里插入图片描述
如图,当E取值靠近0时,E-127的值都非常小,整个浮点数的值也会趋近于0,在这个区间内有无数个E值使得浮点数的值表示为0,因此在进行浮点数的判断的时候不能直接如下所示
if(floa==0),而应该表示为一个区间,例如if(floa<-10^-9 && floa>-10^-9),因为浮点数的0值是一个区间;

3.2当E为全1时,这是2^E就会非常的大,即达到了浮点点数极值,S位决定了浮点数的取值区间;

附:64位双精度浮点数中,E的比特位为11位,M为52位,E进行存取时加减1023,其余同理;

深度理解,图文解析

在这里插入图片描述

注意:float用printf输出的时候,是需要先转换成double再进行输出,这就不难理解,很多float类型的数据用整形输出都是0,因为float转换成64位后,很多时候前面32位都是0,而整形输出只能截取32位的值;

转载地址:http://xose.baihongyu.com/

你可能感兴趣的文章
微信小程序云开发手机商城项目源码+数据库+云后台+部署 (毕业生福利!)
查看>>
Maven的配置
查看>>
如何在bilibili上下载学习视频?
查看>>
Python爬虫利器之Beautiful Soup的全世界最强用法 五百行文章!
查看>>
09-Vue之本地应用v-for指令
查看>>
03-selenium元素定位
查看>>
19-selenium操作已启动的浏览器
查看>>
2020.2.13普及C组 罗密欧与朱丽叶的约会【纪中】【前缀和】
查看>>
纪中2020.3.18普及C组模拟赛总结
查看>>
YbtOJ 递推算法课堂过关 例5 平铺方案【递推(简单DP)】
查看>>
YbtOJ hash和hash表课堂过关 例1 字符串哈希【hash】
查看>>
CSUST 2021 周赛 2 题解
查看>>
前后端数据交互之表单
查看>>
剑指offer JZ15 反转链表
查看>>
剑指offer JZ21 栈的压入弹出序列
查看>>
剑指offer JZ31 整数中1出现的次数
查看>>
实现基于scrapy框架的天气预报爬虫hengYangSpaider @572311文
查看>>
maven打包指定名称并去除jar-with-dependencies后缀
查看>>
Netty4服务端入门代码示例
查看>>
java连接mysql,jdbc驱动
查看>>