浮点数指数域(阶码)的存储格式
浮点数公式:V=(-1)s M2E
分2种情况,非规格(-1<V<1这个区间时)和规格(V<=-1或V>=1的区间时)。
1、当表示非规格化小数时,阶码全为0。
2、当为规格化小数时,根据阶码e的计算公式:
E=e - Bias Bias=2^k-1 - 1 e=E + Bias e=E + 2^k-1 - 1
举例:(5.25)10 =(101.01)2 =1.0101 * 22
根据规格数的定义:M=1+f,f=M-1,故f=0.0101
E=2,e=2+28-1 -1 = (129)10 =(10000001)2
当然,以上是为了准确说明和引导理解。实际中,因为单精度浮点数的价码是约定好的8位,共bias也就是127,换成2进制是01111111,我们可以直接拿2的指数的二进制数和0111111相加就可以得出价码的二进制形式了。
重点:有的人说:价码就是2的指数的移码,经过验证这是错误的。移码的定义:
按照上述定义:e=27+E,而根据上面的公式可知:e=27 + E - 1
所以:正确的求法是:知道原码后,将原码从右往左数,第一个1为分界线,右边(含第一个1)求反,左边最高位求反,其余位不变。
这个方法属于二进制的速算技巧了,可以证明出来的,有机会补充上。
举例:(5.25)2 = (101.01)2 = (1.0101 * 22 ) ,由公式得知:E=2=e-127,e=2+127,2的二进制是10,根据上述速算法:e=(10000001),f=01010000000000000000000
故5.25的浮点存储为:01000000101010000000000000000000
编程检查一下:
#include <cstdio> int main(){float a=5.25;unsigned int b=*(int *)&a; //把b转为无符号整型,取二进制位for(int i=0;i<32;i++){printf("%d",(b>>(31-i))&1?1:0);}printf("\nb=%d\n",b); //看看把浮点格式转为int格式后,数字变成啥,for funreturn 0; }
输出:
vagrant@ubuntu-bionic:~$ ./t 01000000101010000000000000000000 //哈哈,激动,和我刚才推测的一样 b=1084751872 //看到没,float的5.25和unsigned int的1084751872一样的格式。
例2:(0.2)10别小看这个数,在二进制中它是一个无限循环小数(0.001100110011...)2,0011是循环节。这样的数如何解析呢?
它仍然是规格数,不要以为0和1之间,就是非规格数,非规格数用于表示0和极小的数,0.2显然不是,所以它还是规格数。
首先求f和e:把(0.00110011...)2左移3位,让它的小数点左边为1,这是规格数的要求,这样变成这样(1.1001100110011...)2*2-3,变大了23,自然要在缩小23,才保证原数不变。
根据这个:(1.1001100110011...)2*2-3 括号内对应M,后面的指数-3对应E,则f=M-1=(0.100110011...),e=E+127=124=(01111100)2,这里在重点说一下,e的快捷求法,-3的二进制为:3的补码(按位求反+1)得(11111101)2,然后,从右边第一个1为分界线,左边最高位求反,其余不变,右边(含第一个1)全部求反,得(01111100)2 ,这个数就是指数域了。
然后小数域:有f=(0.100110011...)2得出24位(多算1位,考虑舍入得问题),是:(0.100110011001100110011001)2,看到最后第24位是1,故向前进1位,得到(0.10011001100110011001101)2,这个数就是小数域的值了。
总上所述:(0.2)10 的二进制存储为:(00111110010011001100110011001101)2
把上面的验证程序改个数,验证一下输出:
vagrant@ubuntu-bionic:~$ ./t 00111110010011001100110011001101 //哈哈,激动,又对了 b=1045220557
PS,还有一个验证程序的写法,就是用printf函数也可以:不过这个输出16进制,需要自己转一下二进制:
#include <cstdio> using namespace std; int main(void) { float f = 0.2; int *df = (int *)&f; printf("%#x\n",*df); return 0; }
输出:
vagrant@ubuntu-bionic:~$ ./t1 0x3e4ccccd
有兴趣可以把a变成任一浮点数,先自己推一下,看答案。
另外,欢迎有人来查错,但不要再无脑的抄别人了,这样,才能共同进步。
转载于:https://www.cnblogs.com/litifeng/p/10487409.html
浮点数指数域(阶码)的存储格式相关推荐
- 浮点数的阶码,尾数与移码
[阶码与尾数] 十进制中通常一个浮点数可以用科学技术法来表示,举例:-306.5可以表示为-0.3065*103 其中 -是符号,指数3是阶或称阶码,0.3065是小数部分 左右段非0包起来的部分 ...
- 将0.1101101*2^(-10)表示成阶码用4位移码、尾数用8位原码(含符号位)的浮点数
0.1101101 * 2^(-10) 表示成阶码用4位移码.尾数用8位原码(含符号位)的浮点数是: 符号位:0 阶码(4位移码):0111 尾数(8位原码):11011010 所以,0.110110 ...
- 浮点数阶码的计算和表示【IEEE 754】
关于IEEE754中,一般教材提到阶码都是用移码表示,计算规则却是偏置值+阶数. 比如说IEEE 754的浮点数表示,在32位浮点寄存器中,-8.25的16进制表示是多少. 我怎么算都是C184000 ...
- 原码,反码,补码,阶码,移码
本文转载自本站大佬"不去上课",原文链接https://blog.csdn.net/ruidianbaihuo/article/details/87875178 原码,反码,补码, ...
- 原码,反码,补码,阶码,移码是什么?有什么区别(讨论机器数的表示)
原码,反码,补码,阶码,移码是什么?有什么区别(讨论机器数的表示) 本文内容参考自王达老师的<深入理解计算机网络>一书<中国水利水电出版社> 一.机器数解释: 机器数是计算机中 ...
- IEEE754标准 阶码
IEE754浮点数的格式: 阶码采用偏移量表示(某些课本会称为移码表示,但与普通移码略有差别),尾数用原码表示 注意:IEE754对阶码采用偏移量表示,单精度浮点数偏移值为127,双精度浮点数的偏移值 ...
- IEEE754阶码真值范围问题
以32为浮点数为例 为什么阶码真值范围为-126-127. 比如有人会觉得阶码真值加上偏置量127可以为255(11111111),那做个减法真值可以为128呀. 其实提出这个问题只是因为你没注意到I ...
- 为什么IEE754标准中,32位浮点数的指数转换为阶码时需要加上数值为127的偏移量?
首先阶码为啥用移码表示 为了简化浮点数的比较,故我们使用移码来表示阶码位,这样就不至于在比较时去考虑两次符号位了. 其次IEEE754中有如下规定: 1)当阶码E为全0且尾数M也为全0时,表示的真值为 ...
- 浮点数的加减运算(阶码、尾数)
浮点数尾数运算 < ---- > 原码加/减运算 原码:+|x| 或者 -|x| (正数=0+|x| 负数的=1+|x| ) 符号位和数值部分:分开处理 仅对[数值 ...
- 认识32位浮点数(分别输出符号,阶码,尾数)
按IEEE 754标准,32位浮点数的标准格式如下图所示. 例如,一个浮点数的二进制数格式为: 则该数的三个部分分解如下: 1)符号位:0 2)阶码部分:10000010 3)尾数部分:0110110 ...
最新文章
- 奥鹏南开大学18春学期计算机作业,南开18春1709、1803学期《办公自动化基础》在线作业答案.doc...
- gmail头像_Gmail与Google+进一步整合:可显示好友头像
- UVa 11121 - Base -2 负进制的转化和推广
- 吴恩达的 CS229,有人把它浓缩成 6 张中文速查表!
- 求两个整数数组乘积最小值
- sqlserver检索函数、存储过程、视图 中的关键字
- TreeView 控件帮助文件
- [CF1107E]Vasya and Binary String【区间DP】
- 光流(八)--总结篇
- 国内语料库建设一览表
- Maven安装与配置教程
- csol修改本地服务器,CSOL简单地控制台优化+显卡优化 低配也能流畅运行
- 数据结构链表(C语言实现)
- 视觉特效视觉插件包FxFactory pro 8 集各fcpx插件于一体
- 大学计算机基础知识点图文,大学计算机基础知识点分布最新版
- 深兰科技亮相2022世界人工智能大会:AI创新,共话未来城市建设
- 360应用宝上架流程及所需材料
- 生成百度网盘文件目录_艾孜尔江撰稿
- 大前端relative和absolute详解
- E-puck2机器人系列教程
热门文章
- Android Studio 控制台输出中文乱码
- 世界语言共有4种书写方向
- VC使用命令行编译很复杂
- 管理感悟:领导如何处理拍马
- 爬虫获取::after_这种反爬虫手段有点意思,看我破了它!
- centos mysql 二进制_CentOS 7.6 安装二进制Mysql
- spring mvc 实现websocket(服务器主动消息推送)
- VC++ 只运行一个程序实例
- svr测试用MATLAB,基于MATLAB的SVR回归模型的设计方案.doc
- python的序列类型包括_python基础之常用序列类型(字符串)