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 ...
随机推荐
- 实现一个跨平台的mysock库(windows、linux)
源码下载 1.首先确定自己的操作系统为32位还是64位: root@bfq:~/mysock# uname -a Linux bfq 3.11.0-26-generic#45~precise1- ...
- 从Wolframserver获取DC comics卡通人物数据
背景知识 DC comics是美国时代华纳旗下DC娱乐下属的一个漫绘图书出版商. 超人.蝙蝠侠之类漫画的始作俑者. 在Wolfram的眼下为止3750个PopularCurves数据中(所有下载数据有 ...
- [AngularJS] New in Angular 1.3 - bindToController
If you want to use controllers, instead of a link function, you can use bindToController. <!DOCTY ...
- Android 滑动效果基础篇(四)—— Gallery + GridView
Android系统自带一个GridView和Gallery两个控件,GridView网格显示,Gallery单个浏览,两者结合起来可以真正实现Gallery浏览图片效果. 本示例通过GridView和 ...
- gradle使用小记
1.全局排除依赖: allprojects { apply plugin: 'java' apply plugin: 'eclipse' apply plugin: 'maven-p ...
- dubbo-RPC学习(一)自定义配置
在dubbo的基础上实现异步调用的时候,因为需要支持回调的“重试间隔时间”与“重试次数”等属性.因此,需要扩展dubbo.xsd,需要添加新的属性来支持这种扩展. dubbo 的xsd是基于sprin ...
- RedHat Enterprise Linux下配置yum源(尝试过的可行方案)
转自:http://bbs.51cto.com/thread-861410-1.html 一.在linux 6.1中本地yum源配置:首先编辑yum源配置文件我们可以再这个目录中新创建一个配置文件,v ...
- Helpers\Hooks
Helpers\Hooks Add modules with hooks The hooks helper allows modules to be created within the module ...
- 深入理解C语言中的指针与数组之指针篇(转载)
前言 其实很早就想要写一篇关于指针和数组的文章,毕竟可以认为这是C语言的根本所在.相信,任意一家公司如果想要考察一个人对C语言的理解,指针和数组绝对是必考的一部分. 但是之前一方面之前一直在忙各种事情 ...
- iOS开发基础知识:Core Animation(核心动画)
Core Animation,中文翻译为核心动画,它是一组非常强大的动画处理API,使用它能做出非常炫丽的动画效果,而且往往是事半功倍.也就是说,使用少量的代码就可以实现非常强大的功能. Core A ...