原文网址:http://blog.chinaunix.net/uid-24118190-id-75212.html

单双精度浮点数的IEEE标准格式

关键字:浮点数 IEEE标准

大多数高级语言按照IEEE-754标准来规定浮点数的存储格式。
IEEE-754规定 单精度浮点数用4字节存储,双精度浮点数用8字节存储,表示为三部分:符号位、阶和尾数。

S+E+M
S 符号位,尾数的符号位;
E 阶,即指数;
M 尾数,即有效小数位数;

单精度格式
符号位 1位, bit31
阶     8位,bit30~23
尾数   24位,bit22~0

双精度
符号位 1位,bit63
阶     11位,bit62~52
尾数   53位,bit51~0

省略位
二进制数的规格化表示中,小数点前的数(即二进制表示的最高位)为1,故省略之。
所以 float的M 用23位可以表示24位的值,double的M 用52位可以表示53位的值。

阶码
以移码的形式存储。对于float偏移量为127(7FH),对于double偏移量为1023(3FFH)。
存储浮点数的阶码之前,偏移量要先加到阶码上。原因如下:
float的值的二进制科学计数法表示中 阶的范围 ±127, 当一个数“无限”趋近于0,即为 浮点0.
为了保证 浮点0 与 机器0 的存储表示一样,阶在存储时加上偏移 127

eg
2^3,移码的结果 在单精度中为82H(130=3+127),在双精度中为402H(1026=3+1023)。

浮点数有两个例外
0.0存储为全零;
无限大数的阶码存储为全1,尾数部分全零,符号位指示正无穷或者负无穷。

例子:
float  十进制   规格化(S+E+M)
-12    -1.1x23  1 10000010 1000000  00000000  00000000  
0.25   1.0x2-2  0 01111101 0000000  00000000  00000000

所有字节在内存中的排列顺序
intel的cpu按little endian顺序
motorola的cpu按big endian顺序排列。


常用的浮点数存储格式:32-bit IEEE-754 floating-point format

对于大小为32-bit的浮点数(32-bit为单精度,64-bit浮点数为双精度,80-bit为扩展精度浮点数), 
1、其第31 bit为符号位,为0则表示正数,反之为复数,其读数值用s表示; 
2、第30~23 bit为幂数,其读数值用e表示; 
3、第22~0 bit共23 bit作为系数,视为二进制纯小数,假定该小数的十进制值为x; 
十进制转浮点数的计算方法:则按照规定,十进制的值用浮点数表示为: 
如果十进制为正,则s = 0,否则s = 1;将十进制数表示成二进制,然后将小数点向左移动,直到这个数变为1.x的形式即尾数,移动的个数即位指数。为了保证指数为正,将移动的个数都加上127,由于尾数的整数位始终为1,故舍去不做记忆。

对3.141592654来说,
1、正数,s = 0;
2、3.141592654的二进制形式为正数部分计算方法是除以二取整,即得11,小数部分的计算方法是乘以二取其整数,得0.0010 0100 0011 1111 0110 1010 1000,那么它的二进制数表示为11.0010 0100 0011 1111 0110 1010 1;
3、将小数点向左移一位,那么它就变为1.1001 0010 0001 1111 1011 0101 01,所以指数为1+127=128,e = 128 = 1000 0000;
4、舍掉尾数的整数部分1,尾数写成0.1001 0010 0001 1111 1011 0101 01,x = 921FB6
5、最后它的浮点是表示为0 1000 0000 1001 0010 0001 1111 1011 0101 = 40490FDA 
浮点数转十进制的计算方法:

则按照规定,浮点数的值用十进制表示为: 
= (-1)^s  * (1 + x) * 2^(e - 127)

对于49E48E68来说, 
1、其第31 bit为0,即s = 0 
2、第30~23 bit依次为100 1001 1,读成十进制就是147,即e = 147。 
3、第22~0 bit依次为110 0100 1000 1110 0110 1000,也就是二进制的纯小数0.110 0100 1000 1110 0110 1000,其十进制形式为(0.110 0100 1000 1110 0110 1000 * 2^23) / (2^23) = (0x49E48E68 & 0x007FFFFF) / (2^23) = (0x648E68) / (2^23) = 0.78559589385986328125,即x = 0.78559589385986328125。

这样,该浮点数的十进制表示 
= (-1)^s  * (1 + x) * 2^(e - 127) 
= (-1)^0  * (1+ 0.78559589385986328125) * 2^(147-127) 
=    1872333

http://discuz.liulc.com/dnt2/showtopic.aspx?topicid=59&page=end

【转】单双精度浮点数的IEEE标准格式的更多相关文章

  1. 深入理解计算机系统(2.7)---二进制浮点数,IEEE标准(重要)

    2.6我们进行了二进制整数运算的最后一役,本次LZ将和各位一起进入浮点数的世界,这里没有无符号,没有补码,但是有各种各样的惊奇.倘若你真正的进入了浮点数的世界,一定会发现它原来是这么有意思,而不是像之 ...

  2. 【转】浮点数与IEEE 754

    http://www.cnblogs.com/kingwolfofsky/archive/2011/07/21/2112299.html 浮点数 1.   什么是浮点数 在计算机系统的发展过程中,曾经 ...

  3. IEEE Floating Point Standard (IEEE754浮点数表示法标准)

    浮点数与定点数表示法是我们在计算机中常用的表示方法 所以必须要弄懂原理,特别是在FPGA里面,由于FPGA不能像在MCU一样直接用乘除法. 定点数 首先说一下简单的定点数,定点数是克服整数表示法不能表 ...

  4. float:浮点型double:双精度实型decimal:数字型单精度浮点数(Single)双精度浮点数(double)

        单精度浮点数(Single) 双精度浮点数(double)       Decimal为SQL Server.MySql等数据库的一种数据类型,不属于浮点数类型,可以在定义时划定整数部分以及小 ...

  5. 小朋友学C语言(4):单精度浮点数与双精度浮点数

    上节课简单介绍了浮点数.计算机程序中的浮点数分为单精度浮点数和双精度浮点数. 单精度和双精度精确的范围不一样. 计算机里的最基本的存储单位用位(bit)来表示.bit只能用来存储0或1. 稍大一点的单 ...

  6. jar包目录下MANIFEST.MF标准格式

    jar包目录格式: |-- com | |-- test.class |-- META-INF | |-- MAINFEST.MF 一个正常的jar包下必有META-INF/MANIFEST.MF清单 ...

  7. 将时区格式的时间转换为易于阅读的标准格式"yyyy-MM-dd"

    Date的显示格式就是时区格式, String 标准格式 = new SimpleDateFormat("yyyy--MM--dd").format(new Date());

  8. C语言atof()函数:将字符串转换为double(双精度浮点数)

    头文件:#include <stdlib.h> 函数 atof() 用于将字符串转换为双精度浮点数(double),其原型为:double atof (const char* str); ...

  9. IEEE参考文献格式

    IEEE参考文献格式 由于国外期刊参考文献与国内参考文献的格式有很大区别,其中最常用的参考文献为会议论文.书籍.期刊文献,所以特别在此记录说明,方便以后使用. 会议论文(Published Confe ...

随机推荐

  1. SKTextureAtlas类

    继承自 NSObject 符合 NSCodingNSObject(NSObject) 框架  /System/Library/Frameworks/SpriteKit.framework 可用性 可用 ...

  2. Android 关于获取摄像头帧数据解码

    由于Android下摄像头预览数据只能  ImageFormat.NV21 格式的,所以解码时要经过一翻周折. Camera mCamera = Camera.open(); Camera.Param ...

  3. boost 相等与等价的区别

  4. 使用Intent实现Activity的隐式跳转

    相比于显式Intent,隐式Intent 则含蓄了许多,它并不明确指出我们想要启动哪一个活动,而是指定了一系列更为抽象的action 和category 等信息,然后交由系统去分析这个Intent,并 ...

  5. [转] Makefile中调用Shell

    1.在Makefile中只能在target中调用Shell脚本,其他地方是不能输出的.比如如下代码就是没有任何输出: VAR="Hello" echo "$(VAR)&q ...

  6. DataTable操作工具类DataTableHelper

    DataTable操作工具类DataTableHelper. 功能介绍: 将泛型集合填充为数据表 将泛型填充为数据表 将对象集合填充为数据表 将对象填充为数据表 将定IDictionary数据转换为D ...

  7. HBuilder开发app ajax跨域 解决XMLHttpRequest

    <div id="a1" onclick="testXHR()" style="font-size: 5em;">sss1< ...

  8. 分析器错误消息: 未能加载类型“WebApplication._Default”

    1.新建一个空白解决方案2.新闻一个Web Application项目 默认就有Default.aspx 直接调试的时候出现-------------------------------------- ...

  9. Nginx配置域名转发实例

    域名:cps.45wan.com   所在阿里云主机:123.35.9.12 45wan没有在阿里云备案 67wan已经在阿里云备案 阿里云主机(假如123.35.9.12)上原来的nginx配置: ...

  10. iptables里filter表前面几个数字的意思

    一般的linux系统iptables配置文件filter表前面都带下面三行,但是具体是什么意思呢! *filter:INPUT ACCEPT [0:0]:FORWARD ACCEPT [0:0]:OU ...