专题、浮点数的存储及取值范围

本文详细探讨了浮点数在计算机中的存储方式,以32位二进制为例,通过100.1的转换过程解析了存储结构。内容包括浮点数的存储格式,如何将其转化为标准化指数形式,并分析了32位浮点数的取值范围,包括最大值、最小值和绝对值最小的一般浮点数。
摘要由CSDN通过智能技术生成

浮点数的存储及表达范围

参考资料:
1. 浮点数进制转换, Mr.Rico个人博客
2. 浮点存储和取值范围,CSDN treasurew 博客
3.【学习记录】正数乘以正数等于负数?| 整数和浮点数在计算机中的存储,B站Up 笨手笨脚oO

一、存储

符号位 指数位 有效数字位
表达这个数字的正负,二进制1表示负,0表示正 存放规范化指数形式的指数位 存放有效数字

32位二进制(4个字节)

符号位 指数位 有效数字位
1bit 8bit 23bit

64位二进制(8字节)

符号位 指数位 有效数字位
1bit 11bit 52bit

别问为什么是这样的!

问就是规定!!!

二、存储举例(以100.1为例)

1. 先变成这个10进制数字的二进制形式

十进制小数转二进制
方法:乘二取整,顺序排列,加上小数点。
案例:

十进制的0.8125转换成二进制:

来源:网络图片来源:参考资料1:浮点数进制转换, Mr.Rico个人博客

十进制的10.8125转换成二进制:  
整数位和小数位分开转换,整数位简单,小数位同上,再用小数点连接。  
10转换成二进制为01010  
所以10.8125转换成二进制为: 01010.1101  

番外:小数二进制转换成十进制

方法: 加权系数展开

来源网络
图片来源:参考资料1:浮点数进制转换, Mr.Rico个人博客

所以本例中的 100.1 转化成二进制为:
整数位:100 —— 二进制:01100100
小数位:0.1 —— 二进制:0.000110011001100…

最终结果:01100100.0001 1001 1001 1001…

2. 把这个二进制转化成标准化指数形式(2为底数)

还是上边的这个数100.1
转化为二进制表达的标准化指数形式:小数点向左移动6位
最终结果约为:1.100100 e-6

PS:  
① 十进制也可以先转换成以2为底数的标准化指数形式,再转换成二进制。     
② 十进制先转化二进制,再转化成标准指数化形式,直接移动位数就行。(为啥是这样的?以我们熟悉的十进制为例: 3.89*10^4,就是小数点向右移动4位,38900)

3. 按照存储结构存储(以32bit为例)

32位二进制(4个字节)

符号位 指数位 有效数字位
1bit 8bit 23bit

① 100.1是正数,所以第一位是0
1.100100 e-6
② 左移6位,表达成e-6,这个指数位存的就是-6;在8位二进制条件下存储。指数是以阶码的形式存储的。

两种方式看他是怎么存储的:

第一种:
① 先求移码:移码是补码的符号位取反,(-6)的补码是:1111 1010 所以移码结果应该是:0111 1010   
④ 再求阶码(浮点数指数位存储形式): 阶码=阶数的移码-1   0111 1001
第二种:
这个指数位存储的二进制用十进制表示恰好是等于:偏置数(8位偏置127;11位偏置1023)+阶数   
127+(-6)= 121  
转换成二进制:0111 1001   
可以看到第二种和第一种方法得出的结果一样  
所以直接用第二种计算简单一点。  

问题又来了???  
偏置值是个什么鬼?  
因为存指数位的那个数据是一个无符号的整数形式的数据,8位无符号的整数形式取值范围为:0~255;但是事实上,指数有负数的情况,例如这道题,指数就是-6.那该如何用一个无符号的整数表达负数呢?   
干脆把0~255劈一半,0~127;-127~-1;那么只要把是负数的数字加上127就变成了一个无符号整数可以表达的形式了。  
所以8位二进制指数偏置值为127;  
64位二进制偏置值为1023  
计算方法:[2^(位数)]/2-1  

③ 有效数字位
1.1001 0000 01100……
由于最高位肯定是1,所以存储时可以把1甩掉,取出来的时候再补上。
所以存到计算机里的是:
1001 0000 0110 0110 0110 011(23位)

最终结果:
【0】【0111 1001】【1001 000 0110 0110 0110 011】

4. 浮点数存取数字范围分析(以32位为例)

根据指数位在内存中存储的数字(e)的大小一共有4种情况 ,其中E表示实际阶数, Bias为偏置值(127或1023);M为小数部分存放的数字

1 ≤ e ≤ 254 1 \le e\le 254 1e254
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值