C/C++中浮点数格式学习——以IEEE75432位单精度为例

这是浮点数的通常表示形式,在IEEE754中,单精度浮点数有如下形式:
位单精度
个比特存储。
|
位长 |
||
|
至23 |
至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. 中间大小的非归约数的二倍正好是最小的归约数,同时也是最大的非规约数;因此,在对浮点数进行乘二操作时,可以依照如下代码:
- unsigned float_twice(unsigned uf) {
- unsigned expn = (uf >> 23) & 0xFF;
- unsigned sign = uf & 0x80000000;
- unsigned frac = uf & 0x007FFFFF;
- if (expn == 255 || (expn == 0 && frac == 0)) return uf;
- if (expn) {
- expn++;
- } else
- frac <<= 1;
- return (sign) | (expn << 23) | (frac);
- }
首先检测是否为-0;然后看如果不是特殊数字的话,就将指数自增;如果是特殊数字(需要考虑的特殊数字只有指数是0的情况下需要单独进行考虑),对于最大的非规约数,则要增加指数并改变自身(因为此时由非归约数转化为了归约数),对于其他情形,则只需要左移一位,如果发生了进位,则此时正好变为规约表示,前面省略了一个1;如果没发生进位,则代表尾数部分放大二倍,而整个数字就只有尾数部分。
在需要进行舍尾操作时,采取四舍六入五六双的Bankers' Round规则。
C/C++中浮点数格式学习——以IEEE75432位单精度为例的更多相关文章
- C++学习笔记1(扩充:C++中的格式控制)
前一章,我们了解了再C++中的标准的输入输出问题,那么肯能就有人会问了再C语言中我们可以灵活的控制输出和显示,那么再再C++中可以实现吗?我的回答是当然可以的,只不过再C++中的控制可能相比较而言要比 ...
- Linux学习笔记之如何设置vim中的格式如行号等
在我们编写代码程序时,我们时常想追求更好的格式,下面写一下我认为挺实用的格式命令以及如何更改 如果我们打开vim在其命令模式中输入格式命令时,下一次重新打开vim还是会和原先一样,所以我们需更改其配置 ...
- C#中浮点数依IEEE-754标准转二进制串 (MODBUS 浮点数转换)
因工作需要,把再串口通信中浮点数与字节流的数据转换函数放在这,转发的,谢谢原作者. 今天花了一天的时间搜罗资料,为了解决一个串口编程的进制转化问题.因为串口传送的浮点数据格式与IEEE-754标准(3 ...
- c 中打印格式%g
C语言中打印float或double类型最常用的是%f格式,最近看书时看到有使用%g格式打印. %f 表示按浮点数的格式打印. 小数点后固定6位 %e 表示以指数形式的浮点数格式输出. %g 表示自 ...
- python中confIgparser模块学习
python中configparser模块学习 ConfigParser模块在python中用来读取配置文件,配置文件的格式跟windows下的ini配置文件相似,可以包含一个或多个节(section ...
- Python中字符串的学习
Python中字符串的学习 一.字符串的格式化输出 % 占位符 %s 字符串 %d integer %x 十六进制 integer %f float 指定长度 %5d 右对齐,不足左边补空格 %-5d ...
- SpringBoot中JPA的学习
SpringBoot中JPA的学习 准备环境和项目配置 写一下学习JPA的过程,主要是结合之前SpringBoot + Vue的项目和网上的博客学习一下. 首先,需要配置一下maven文件,有这么两个 ...
- 解决IIS7、IIS7.5中时间格式显示的问题
今天在用IIS7的时候发现一个关于时间格式的问题,当我在ASP中使用now()时间函数的时候,日期是以"/"来分隔,而不是以"-"来分隔的,使得我在运行程序的时 ...
- PHP中的Libevent学习
wangbin@2012,1,3 目录 Libevent在php中的应用学习 1. Libevent介绍 2. 为什么要学习libevent 3. Php libeven ...
随机推荐
- osg 笔记一 (转)
场景图形采用一种自顶向下的,分层的树状数据结构来组织空间数据集,以提高渲染的效率 场景图形树结构的顶部是一个根节点,从根节点向下延伸,各个组节点中均包含了几何信息和用于控制其外观的渲染状态信息.根节点 ...
- Android开发 MMS支持 创建和编辑MMS
Composing and editing MMS在Android Mms 应用里面的具体实现形式,或数据结构是SlideshowModel,它是一个每个节点为SlideModel的 ArrayLis ...
- Java I/O输入输出流详解
一.文件的编码 开发时一定要注意项目默认的编码!!!!!!!! 文件操作的时候一定要记得关闭!!!!!!!! ASCII:美国标准 ...
- Dia Diagram Mac OSX Yosemite Fix 闪退 xterm
[转]http://navkirats.blogspot.hk/2014/10/dia-diagram-mac-osx-yosemite-fix-i-use.html I use the Dia to ...
- 进程间通信之XSI IPC
XSI IPC源自于系统V的IPC功能. 有三种IPC我们称作XSI IPC,即消息队列.信号量以及共享存储器,它们之间有很多相似之处. 1.标识符和键 每个内核中的IPC结构(消息队列.信号量或共享 ...
- yum服务器设置
转自:http://blog.chinaunix.net/uid-22141042-id-1789605.html 不得不说,RedHat的确很邪恶,如果我们直接用他自带的系统碟做YUM源的话,总是会 ...
- 使用Areas(区域)分离ASP.NET MVC 项目
在使用Areas区域时,如果使用默认路由表,将造成路由表冲突,这种情况需要修改一下区域内<区域名称>AreaRegistration.cs和/App_Start/RouteConfig.a ...
- 实例源码--Android自定义Gallery动画效果
相关文档与源码: 下载源码 技术要点: 1.自定义控件的使用 2.Gallery控件的使用实例 3.详细的源码注释 ...... 详细介绍: 1.自定义控件的使用 本套源码通过自定义控件的方式,继 ...
- Eclipse launch failed.Binary not found解决方案
配置完成后建立工程测试,发现建立Hello World c++ Project类型的项目后可以运行测试,直接建立空项目写个测试类无法运行,提示"launch failed.Binary no ...
- Integer的缓存和自动拆装箱
先看一个简单的例子: public class TestInteger { public static void main(String[] args) { System.out.println(&q ...