这是浮点数的通常表示形式,在IEEE754中,单精度浮点数有如下形式:

位单精度

个比特存储。

位长

至23
偏正值(实际的指数大小+127)

至0位编号(从右边开始为0)

S为符号位,Exp为指数字,Fraction为有效数字。
指数部分即使用所谓的偏正值形式表示,偏正值为实际的指数大小与一个固定值(32位的情况是127)的和。采用这种方式表示的目的是简化比较。因为,指数的值可能为正也可能为负,如果采用补码表示的话,全体符号位S和Exp自身的符号位将导致不能简单的进行大小比较。正因为如此,指数部分通常采用一个无符号的正数值存储。单精度的指数部分是−126~+127加上偏移值127,指数值的大小从1~254(0和255是特殊值)。浮点小数计算时,指数值减去偏正值将是实际的指数大小。(当指数为0的时候,用非规约数表示,这样做的理由在于,所有的非归约数都比归约数更加接近0,非规约形式的浮点数的指数值是同种情况下规约形式浮点数的指数值再加1。)

注意通常情况下,23位尾数部分前边自动省略了一个整数部分1,也就是说 num = -1^S * 2^(Exp+127) * (1.xxxxxxx……)    其中xxxx表示尾数部分。

此外有一些特别的约定:

单精度浮点数各种极值情况:

或1 .

这里边比较值得一提的,一个是NaN的设置,还有一个是指数为0情况下几种数字的关系。

1. 在NaN中,尾数必须要非零。

2. 中间大小的非归约数的二倍正好是最小的归约数,同时也是最大的非规约数;因此,在对浮点数进行乘二操作时,可以依照如下代码:

  1. unsigned float_twice(unsigned uf) {  
  2.     unsigned expn = (uf >> 23) & 0xFF;  
  3.     unsigned sign = uf & 0x80000000;  
  4.     unsigned frac = uf & 0x007FFFFF;  
  5.     if (expn == 255 || (expn == 0 && frac == 0)) return uf;  
  6.     if (expn) {  
  7.         expn++;  
  8.     } else 
  9.         frac <<= 1;  
  10.     return (sign) | (expn << 23) | (frac);  
  11. }  

    首先检测是否为-0;然后看如果不是特殊数字的话,就将指数自增;如果是特殊数字(需要考虑的特殊数字只有指数是0的情况下需要单独进行考虑),对于最大的非规约数,则要增加指数并改变自身(因为此时由非归约数转化为了归约数),对于其他情形,则只需要左移一位,如果发生了进位,则此时正好变为规约表示,前面省略了一个1;如果没发生进位,则代表尾数部分放大二倍,而整个数字就只有尾数部分。

    在需要进行舍尾操作时,采取四舍六入五六双的Bankers' Round规则。

C/C++中浮点数格式学习——以IEEE75432位单精度为例的更多相关文章

  1. C++学习笔记1(扩充:C++中的格式控制)

    前一章,我们了解了再C++中的标准的输入输出问题,那么肯能就有人会问了再C语言中我们可以灵活的控制输出和显示,那么再再C++中可以实现吗?我的回答是当然可以的,只不过再C++中的控制可能相比较而言要比 ...

  2. Linux学习笔记之如何设置vim中的格式如行号等

    在我们编写代码程序时,我们时常想追求更好的格式,下面写一下我认为挺实用的格式命令以及如何更改 如果我们打开vim在其命令模式中输入格式命令时,下一次重新打开vim还是会和原先一样,所以我们需更改其配置 ...

  3. C#中浮点数依IEEE-754标准转二进制串 (MODBUS 浮点数转换)

    因工作需要,把再串口通信中浮点数与字节流的数据转换函数放在这,转发的,谢谢原作者. 今天花了一天的时间搜罗资料,为了解决一个串口编程的进制转化问题.因为串口传送的浮点数据格式与IEEE-754标准(3 ...

  4. c 中打印格式%g

    C语言中打印float或double类型最常用的是%f格式,最近看书时看到有使用%g格式打印. %f  表示按浮点数的格式打印. 小数点后固定6位 %e 表示以指数形式的浮点数格式输出. %g 表示自 ...

  5. python中confIgparser模块学习

    python中configparser模块学习 ConfigParser模块在python中用来读取配置文件,配置文件的格式跟windows下的ini配置文件相似,可以包含一个或多个节(section ...

  6. Python中字符串的学习

    Python中字符串的学习 一.字符串的格式化输出 % 占位符 %s 字符串 %d integer %x 十六进制 integer %f float 指定长度 %5d 右对齐,不足左边补空格 %-5d ...

  7. SpringBoot中JPA的学习

    SpringBoot中JPA的学习 准备环境和项目配置 写一下学习JPA的过程,主要是结合之前SpringBoot + Vue的项目和网上的博客学习一下. 首先,需要配置一下maven文件,有这么两个 ...

  8. 解决IIS7、IIS7.5中时间格式显示的问题

    今天在用IIS7的时候发现一个关于时间格式的问题,当我在ASP中使用now()时间函数的时候,日期是以"/"来分隔,而不是以"-"来分隔的,使得我在运行程序的时 ...

  9. PHP中的Libevent学习

    wangbin@2012,1,3 目录 Libevent在php中的应用学习 1.      Libevent介绍 2.      为什么要学习libevent 3.      Php libeven ...

随机推荐

  1. [Ramada] Build a Functional Pipeline with Ramda.js

    We'll learn how to take advantage of Ramda's automatic function currying and data-last argument orde ...

  2. 数据库插入某些数据会变成?,或则select无法读出数据库中的某些数据

    如果你想在数据库中插入“uɷ”,这个字符,直接插入 insert into table value (‘uɷ’),是不行的,这样插入的后果是打开数据后会显示为u?.当你面对这个问题的时候是不是第一个想 ...

  3. C#动态引用DLL的方法

    C#编程中,使用dll调用是经常的事,这样做的好处是非常多的,比如把某些功能封装到一个dll中,然后主程序动态调用这个dll. 废话不多说,举例说明如下. 首先,我们需要封装一个dll,vs2008下 ...

  4. PHP中使用kindeditor

    KindEditor是一套开源的HTML可视化编辑器,主要用于让用户在网站上获得所见即所得编辑效果,兼容IE.Firefox.Chrome. Safari.Opera等主流浏览器.KindEditor ...

  5. linux下获取ip

    如果打开虚拟机 没有ip置灰显示了 lo 可以使用dhclient自动获取ip 如果想开机就自动获取ip: vim /etc/rc.d/rc.local 在这里插入dhclient命令

  6. coherence初识

    近期,发现在预发布环境上的项目有些冲突,本着治病救人的原则,不得已要一步步剖析,苦逼的就是我们可爱可敬的程序员. 先介绍下大体情况,应用项目都是velocity+spring+mybatis,没什么好 ...

  7. ip 子网掩码 网关 DNS

    这一篇文章也很好: 原文引用于:  http://www.cnblogs.com/jiqing9006/p/3365939.html 内外网ip: IP地址: IPv4地址分为A.B.C.D.E五类, ...

  8. 【阔别许久的博】【我要开始攻数学和几何啦】【高精度取模+同余模定理,*】POJ 2365 The Embarrassed Cryptographer

    题意:给出一大数K(4 <= K <= 10^100)与一整数L(2 <= L <= 106),K为两个素数的乘积(The cryptographic keys are cre ...

  9. centos6.4搭建lnmp服务(转载)

    1.配置防火墙,开启80端口.3306端口vi /etc/sysconfig/iptables-A INPUT -m state --state NEW -m tcp -p tcp --dport 8 ...

  10. Delphi7使用ADO直接连接Excel读取数据

    我之前是连接成功的,现在不知道为什么怎样连都失败.最后才知道是Office版本的问题,office2007已经是基于xml的.和以前的不一样. Excel2003的连接字符串: 'Provider=M ...