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 ...
随机推荐
- Cocos2d-x多语言支持解决方式
很多其它相关内容请查看本人博客:http://www.bokeyi.com/ll/category/cocos2d-x/ 利用.plist文件让Cocos2d-x轻松支持多语言. .plist文件类似 ...
- 使用代码修改camera.cullingMask
通过查找http://docs.unity3d.com/Documentation/ScriptReference/Camera-cullingMask.html只是能够指定某个层,但要指定多个层却不 ...
- Python学习 之 内建函数
1.常用函数:abs().max().min().len().divmod().pow().round() 例1:abs返回数字绝对值 abs(10) #结果10 abs(-10) #结果10 例2: ...
- Oralce_语法
Oracle内建数据类型 一. 字符数据 1. char(size) 2. varchar2(size) 最常用,最大长度4000字节 3. nvhar(size).nvarchar(size) 4. ...
- java_文件类
例一:创建文件 package java文件类; import java.io.File; import java.io.IOException; public class aasd { public ...
- Windows下用Eclipse搭建C/C++开发环境
本文假定你已经熟悉Java,Eclipse的安装,并能顺利启动和运行Eclipse.此外因为各软件版本在不断更新,有些地方可能不准确,以最新的.原文资料为准. 距上一次写和调C++程序,已经5.6年了 ...
- Linux 学习笔记 文件权限
* Linux系统会为各种各样的功能创建不同的用户账户,而这些账户并不是真的用户.这些账户称作系统账户,是系统上运行的各种服务进程访问资源用的特殊账户. 所有运行在后台的服务都需要用一个系统用户账户登 ...
- Node.js module.exports和exports的区别
require 用来加载代码,而 exports 和 module.exports 则用来导出代码,从接触node.js就不会它们两陌生,上代码: foo.js exports.a = functio ...
- memcached linux / win32 1.4.13
memcached-win32-1.4.13 点击下载 http://pan.baidu.com/s/1kTMABaf memcached -d install (安装为windows service ...
- 【Android Studio 小技巧】一键查看文件方法结构目录File Structure
看源代码的时候,如果可以查看class中的所有方法,可以提高效率.Android Studio 中可以使用快捷键一键显示所有方法的目录. Mac: command + fn + F12 (在mac中的 ...