以下是参考《IEEE754 学习总结》并结合自己学习总结

一:前言
二:预备知识

三:浮点数的表示范围
四:将浮点格式转换成十进制数

一:前言

前不久在分析一个程序的过程中遇到了浮点运算,也就顺便学习了一下浮点数的存放格式(IEEE754标准),此文仅作为总结,其中举了几个典型的例子,如果你想深入了解IEEE754标准,我想本文并不太适合您。

二:预备知识

-----------------------------------------------------------------------
值         存储为        指数偏移量(阶码)    尾数部分
real*4   1位符号位(s)、8位指数(e),23位尾数(m,共32位)  127(7FH)
real*8   1位符号位(s)、11位指数(e),52位尾数(m,共64位) 1023(3FFH)
real*10  1位符号位(s)、15位指数(e),64位尾数(m,共80位) 16383(3FFFH)
-----------------------------------------------------------------------

计算公式:
V=(-1)^s*2^E*M

当e(各位)为全'0'时,E=1-(2^(e(位数)-1)-1),;M=m。
如:real*4是8位,E=1-(2^(8-1)-1)=1-127=-126
即,
在real*4时:
V=(-1)^s*2^(-126)*m
在real*8时:
V=(-1)^s*2^(-1022)*m

当e(各位)不为全'0'且不为全'1'时,E=e(值)-(2^(e(位数)-1)-1);M=1+m。
即,
在real*4时:
V=(-1)^s*2^(e(值)-127)*(1+m)
在real*8时:
V=(-1)^s*2^(e(值)-1023)*(1+m)

三:浮点数的表示范围:

一个浮点数(Floating Point Number)由三个基本成分构成:符号(Sign)、阶码(Exponent)和尾数(Mantissa)。
  通常,可以用下面的格式来表示浮点数:

S P M
  其中S是符号位,P是阶码,M是尾数。
  根据IEEE(美国电气和电子工程师学会)754标准中的定 义,单精度(Single Precision)浮点数是32位(即4字节)的,双精度(Double Precision)浮点数是64位(即8字节)的。两者的S、P、M所占的位数以及表示方法由下表可知:
  S P M 表示公式 偏移量

单精度浮点数

1(第31位)

8(30到23位)

23(22到0位)

(-1)^S*2(P-127)*1.M

127

双精度浮点数

1(第63位)

11(62到52位)

52(51到0位)

(-1)^S*2(P-1023)*1.M

1023
  其中S是符号位,只有0和1,分别表示正负。
  P是阶码,通常使用移码表示(移码和补码只有符号位相 反,其余都一样。对于正数而言,原码、反码和补码都一样;对于负数而言,补码就是其绝对值的原码全部取反,然后加1)。阶码可以为正数,也可以为负数,为 了处理负指数的情况,实际的指数值按要求需要加上一个偏差(Bias)值作为保存在指数域中的值,单精度数的偏差值为127,双精度数的偏差值为 1023。例如,单精度的实际指数值0在指数域中将保存为127,而保存在指数域中的64则表示实际的指数值-63,偏差的引入使得对于单精度数,实际可 以表达的指数值的范围就变成-127到128之间(包含两端)。
  M为尾数,其中单精度数为23位长,双精度数为52位长。IEEE标准要求浮 点数必须是规范的。这意味着尾数的小数点左侧必须为1,因此在保存尾数的时候,可以省略小数点前面这个1,从而腾出一个二进制位来保存更多的尾数。这样实 际上用23位长的尾数域表达了24位的尾数。例如对于单精度数而言,二进制的1001.101(对应于十进制的9.625)可以表达为1.001101 × 23,所以实际保存在尾数域中的值为00110100000000000000000,即去掉小数点左侧的1,并用0在右侧补齐。
  根据标准 要求,无法精确保存的值必须向最接近的可保存的值进行舍入,即不足一半则舍,一半以上(包括一半)则进。不过对于二进制浮点数而言,还多一条规矩,就是当 需要舍入的值刚好是一半时,不是简单地进,而是在前后两个等距接近的可保存的值中,取其中最后一位有效数字为零者。
  据以上分析,IEEE 754标准中定义浮点数的表示范围为:
 

二进制(Binary)

十进制(Decimal)

单精度浮点数

± (2-2^-23) × 2127

~ ± 10^38.53

双精度浮点数

± (2-2^-52) × 21023

~ ± 10^308.25

  浮点数的表示有一定的范围,超出范围时会产生溢出(Flow),一般称大于绝对值最大的数据为上溢(Overflow),小于绝对值最小的数据为下溢(Underflow)。
1、浮点数的表示约定
  单精度浮点数和双精度浮点数都是用IEEE 754标准定义的,其中有一些特殊约定,例如:
  1、当P=0,M=0时,表示0。
  2、当P=255,M=0时,表示无穷大,用符号位来确定是正无穷大还是负无穷大。
  3、当P=255,M≠0时,表示NaN(Not a Number,不是一个数)。
2、非规范浮点数
  
当 两个绝对值极小的浮点数相减后,其差值的指数可能超出允许范围,最终只能近似为0。为了解决此类问题,IEEE标准中引入了非规范 (Denormalized)浮点数,规定当浮点数的指数为允许的最小指数值时,尾数不必是规范化(Normalized)的。有了非规范浮点数,去掉了 隐含的尾数位的制约,可以保存绝对值更小的浮点数。而且,由于不再受到隐含尾数域的制约,上述关于极小差值的问题也不存在了,因为所有可以保存的浮点数之 间的差值同样可以保存。
  根据IEEE 754标准中的定义,规范和非规范浮点数的表示范围可归纳为下表:
 

规范浮点数

非规范浮点数

十进制近似范围

单精度浮点数

± 2^-149 至 (1-2^-23)*2^-126

± 2^-126 至 (2-2^-23)*2^127

± ~10^-44.85 至 ~10^38.53

双精度浮点数

± 2^-1074 至 (1-2^-52)*2^-1022

± 2^-1022 至 (2-2^-52)*2^1023

± ~10^-323.3 至 ~10^308.3

3、与IEEE 754相关的标准
  本文的结论基于IEEE 754标准,另外一个标准是IEEE 854,这个标准是关于十进制浮点数的,但没有规定具体格式,所以很少被采用。另外,从2000年开始,IEEE 754开始修订,被称为IEEE 754R,目的是融合IEEE 754和IEEE 854标准。该标准在浮点格式方面的修订有:1、加入了16位和128位的二进制浮点数格式;2、加入了十进制浮点数格式,采用了IBM公司提出的格式。

四:将浮点格式转换成十进制数

[例3.1]:
0x00280000(real*4)
转换成二进制
00000000001010000000000000000000
符号位 指数部分(8位) 尾数部分
0 00000000 01010000000000000000000
符号位=0;因指数部分=0,则:尾数部分M为m:
0.01010000000000000000000=0.3125
该浮点数的十进制为:
(-1)^0*2^(-126)*0.3125
=3.6734198463196484624023016788195e-39

[例3.2]:
0xC04E000000000000(real*8)
转换成二进制
1100000001001110000000000000000000000000000000000000000000000000
符号位 指数部分(11位) 尾数部分
1 10000000100 1110000000000000000000000000000000000000000000000000
符号位=1;指数=1028,因指数部分不为全'0'且不为全'1',则:尾数部分M为1+m:
1.1110000000000000000000000000000000000000000000000000=1.875
该浮点数的十进制为:
(-1)^1*2^(1028-1023)*1.875
=-60

四:将十进制数转换成浮点格式(real*4)

[例4.1]:
26.0
十进制26.0转换成二进制
11010.0
规格化二进制数
1.10100*2^4
计算指数
4+127=131
符号位 指数部分 尾数部分
0 10000011 10100000000000000000000
以单精度(real*4)浮点格式存储该数
0100 0001 1101 0000 0000 0000 0000 0000
0x41D0 0000

[例4.2]:
0.75
十进制0.75转换成二进制
0.11
规格化二进制数
1.1*2^-1
计算指数
-1+127=126
符号位 指数部分 尾数部分
0 01111110 10000000000000000000000
以单精度(real*4)浮点格式存储该数
0011 1111 0100 0000 0000 0000 0000 0000
0x3F40 0000

[例4.3]:
-2.5
十进制-2.5转换成二进制
-10.1
规格化二进制数
-1.01*2^1
计算指数
1+127=128
符号位 指数部分 尾数部分
1 10000000 01000000000000000000000
以单精度(real*4)浮点格式存储该数
1100 0000 0010 0000 0000 0000 0000 0000
0xC020 0000

拓展阅读:http://blog.csdn.net/fireseed/article/details/2180

【转载】IEEE754 学习总结的更多相关文章

  1. 【转载】学习资料存档:jQuery的deferred对象详解

    我在以前的文章里提到promise和deferred,这两个东西其实是对回调函数的一种写法,javascript的难点之一是回调函数,但是我们要写出优秀的javascript代码又不得不灵活运用回调函 ...

  2. 转载:学习Entity Framework 中的Code First

    看完觉得不错,适合作为学习资料,就转载过来了 原文链接:http://www.cnblogs.com/Wayou/archive/2012/09/20/EF_CodeFirst.html 这是上周就写 ...

  3. 转载-python学习笔记之输入输出功能读取和写入数据

    读取.写入和 Python 在 “探索 Python” 系列以前的文章中,学习了基本的 Python 数据类型和一些容器数据类型,例如tuple.string 和 list.其他文章讨论了 Pytho ...

  4. 转载-Python学习笔记之文件读写

    Python 文件读写 Python内置了读写文件的函数,用法和C是兼容的.本节介绍内容大致有:文件的打开/关闭.文件对象.文件的读写等. 本章节仅示例介绍 TXT 类型文档的读写,也就是最基础的文件 ...

  5. 转载——JavaScript学习笔记:取数组中最大值和最小值

    转载自:http://www.w3cplus.com/javascript/calculate-the-max-min-value-from-an-array.html. 取数组中最大值 可以先把思路 ...

  6. 转载OPENCV学习随笔

    转载自 亦轩Dhc http://www.cnblogs.com/daihengchen/p/5492729.html 学习笔记:使用opencv做双目测距(相机标定+立体匹配+测距).   最近在做 ...

  7. [转载]DotNetty 学习

    [转载]http://www.cnblogs.com/littlegod/p/7699482.html DotNetty的学习是带着如下这些问题展开: 1. Socket基础框架方案: 通信模式:异步 ...

  8. [转载]AxureRP学习成长之路

    [编者按]本文作者@朱军华Ronzhu , 本文借用官网的描述定义,介绍了在学习AxureRP过程当中所要经历的各个阶段,也结合了作者自身学习AxureRP使用的经验,讲一下在各个阶段中的一些学习方法 ...

  9. [转载]JavaEE学习篇之——网络传输数据中的密码学知识以及Tomcat中配置数字证书EE

    原文链接:http://blog.csdn.net/jiangwei0910410003/article/details/21716557 今天是学习JavaWeb的第二天,我们来了解什么呢?就了解一 ...

随机推荐

  1. Windows 下安装 Python3

    可以使用两种方式安装 Python3,一种是直接去官网下载安装包,然后进行安装即可:另一种是通过安装 Anaconda 来安装 Python3, Anaconda 提供了 Python 的科学计算环境 ...

  2. json 数据分析

    /* 健一健康头条 */ try { String url = "http://www.j1health.com/j1api.php/index/getJ1healthHotLists&qu ...

  3. 多字节(一般指GBK) utf8 Unicode 编码互转

    // c:\Program Files\Microsoft SDKs\Windows\v7.0A\Include\WinNls.h #define CP_ACP 0 // default to ANS ...

  4. Runtime 运行时之一:类与对象

    Objective-C语言是一门动态语言,它将很多静态语言在编译和链接时期做的事放到了运行时来处理.这种动态语言的优势在于:我们写代码时能够更具灵活性,如我们可以把消息转发给我们想要的对象,或者随意交 ...

  5. 【七牛云】时间戳防盗链鉴权php实现

    基于时间戳防盗链的功能其实每家的CDN都是支持的.主要是通过使用约定的加密字符串来对具有访问有效期的资源链接进行一些加密计算的到一个sign值,然后访问外链里面带上这个sign和截止时间戳去访问CDN ...

  6. redis 之初体验(window)

    1 下载window版本的redis :https://github.com/MSOpenTech/redis/releases 2 解压压缩包.我的放在了E盘: E:/redis 3 程序,输入cm ...

  7. HTTP/2笔记之消息交换

    前言 无论是HTTP/1.*还是HTTP/2,HTTP的基本语义是不变的,比如方法语义(GET/PUST/PUT/DELETE),状态码(200/404/500等),Range Request,Cac ...

  8. 设计模式之抽象工厂模式(Java实现)

    “上次是我的不对,贿赂作者让我先讲来着,不过老婆大人大人有大量,不与我计较,这次还让我先把上次未讲完的应用场景部分给补充上去,有妻如此,夫复何求.”(说完,摸了摸跪的发疼的膝盖,咳咳,我发四我没笑!真 ...

  9. 布局的诡异bug合集+解决方法(更新中)

    1.元素内部子元素的margin的边界线基准点的问题 论如何生硬起名字!!我反正已经被自己总结的题目绕晕了... “演员”介绍: 外层父元素:蓝色边框: 内部子元素:绿色区域: 粉红色区域是元素内部绿 ...

  10. 如何偷懒地用 PHP 搭建一个班级网站

    版权声明:本文由李宜东原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/116 来源:腾云阁 https://www.qclo ...