IEEE754标准浮点格式
- 两种基本浮点格式:单精度和双精度。IEEE单精度格式具有24位有效数字,并总共占用32 位。IEEE双精度格式具有53位有效数字精度,并总共占用64位
- 两种扩展浮点格式:单精度扩展和双精度扩展。此标准并未规定扩展格式的精度和大小,但它指定了最小精度和大小。例如,IEEE 双精度扩展格式必须至少具有64位有效数字,并总共占用至少79 位
- 浮点运算的准确度要求:加、减、乘、除、平方根、余数、将浮点格式的数舍入为整数值、在不同浮点格式之间转换、在浮点和整数格式之间转换以及比较。求余和比较运算必须精确无误。其他的每种运算必须向其目标提供精确的结果,除非没有此类结果,或者该结果不满足目标格式。对于后一种情况,运算必须按照下面介绍的规定舍入模式的规则对精确结果进行最低限度的修改,并将经过此类修改的结果提供给运算的目标
- 在十进制字符串和两种基本浮点格式之一的二进制浮点数之间进行转换的准确度、单一性和一致性要求。对于在指定范围内的操作数,这些转换必须生成精确的结果(如果可能的话),或者按照规定舍入模式的规则,对此类精确结果进行最低限度的修改。对于不在指定范围内的操作数,这些转换生成的结果与精确结果之间的差值不得超过取决于舍入模式的指定误差
- 五种类型的IEEE 浮点异常,以及用于向用户指示发生这些类型异常的条件。五种类型的浮点异常是:无效运算、被零除、上溢、下溢和不精确
- 四种舍入方向:向最接近的可表示的值;当有两个最接近的可表示的值时首选“偶数”值;向负无穷大(向下);向正无穷大(向上)以及向0(截断)
在计算机中,浮点数一般由三部分组成:数值的符号位、阶码和尾数。
即:浮点数=符号位.尾数×基数(底)阶码
该标准规定基数为2(浮点数=符号位.尾数×2阶码。) ,阶码E用移码(非标准移码,标准移码与补码的符号位相反,而非标准移码要再减一)[1] 表示,尾数M用原码表示,根据二进制的规格化方法,数值的最高位总是1,该标准将这个1缺省存储,使得尾数表示范围比实际存储的多一位。按IEEE754标准,常用的浮点数的格式如下图所示:

IEEE754标准中有三种形式的浮点数:短浮点数(又称单精度浮点数)、长浮点数(又称双精度浮点数)、临时浮点数(又称扩展精度浮点数,这种浮点数没有隐含位),它们的具体格式如下表:

对于阶码为0或255的情况,IEEE754标准有特别的规定:
如果 E 是0 并且 M 是0,则这个数的真值为±0(正负号和数符位有关)
如果 E = 255 并且 M 是0,则这个数的真值为±∞(同样和符号位有关)
如果 E = 255 并且 M 不是0,则这不是一个数(NaN)。
根据IEEE 754标准,符号位也是“0”代表正数;“1”代表负数.
阶码用移码表示,尾数规格化形式,但格式如下:1.XXX…X。由于最高位总是1,因此省略,称隐藏位(临时实数则不隐藏).隐含的“1”是一位整数(即权位为 )。在浮点格式中表示出来的23位尾数是纯小数,用原码表示。例如: (15)10 =(1111)2 ,将它规格化后结果为1.111×23 ,其中整数部分的“1”将不存储在23位尾数内。
尾数比规格化表示大一倍(因为省去整数部分的“1”),而阶码部分则比一般小1,即[E]移=2n+E-1=127+E
这样,尾数与通常意义的尾数的含义不一致,为了区别,754 中的尾数称为有效数.
IEEE754对阶码作如下规定:

对上溢和下溢的处理:
当运算结果小于规格化浮点数所能表示的最小值时,以前硬件处理策略,或者结果置0或者产生一个下溢陷阱,这两种方案均不能令人满意。 IEEE754处理方法是使用非规格化数。这时阶码为0(即移码-127),尾数没有隐含位,最高位是0。 这样的结果是降低精度,扩大表示范围。
如原来规格化单精度最小值是1.0x2-126,而非规格化单精度最小值是2-23 x2-126=2-149(只有1位有效位)
对上溢用无穷大表示,同时规定:
无穷大+任何数=无穷大
任何有限数÷0=无穷大
任何有限数÷无穷大=0
无穷大÷无穷大=NaN
NaN(Not A Number)
几个特殊数据的存储规则:
正0: 所有的数据位都是0;
负0: 最高位为1,其它的数据位是0;
正/负无穷: 符号位为0/1,阶码位全为1,有效数字全为0;
NAN: 非法的浮点数,阶码位全为1,有效数字不全为0;
这样IEEE754有5种类型浮点数据,如下表:

十进制数转换成浮点数的步骤:
将十进制数转换成二进制数:整数部分用2来除,小数部分用2来乘;
规格化二进制数:改变阶码,使小数点前面仅有第一位有效数字;
计算阶码: 短型浮点数的阶码加上偏移量7FH 长型浮点数的阶码加上偏移量3FFH 扩展型浮点数的阶码加上偏移量3FFFH
以浮点数据格式存储。 把数值的符号位、阶码和尾数合在一起就得到了该数的浮点存储形式
浮点数转换成十进制数的步骤:
该步骤与前面“十进制数转换成浮点数”的步骤是互逆的,其具体步骤如下:
分割数字的符号、阶码和有效数字;
将偏移阶码减去偏移,得到真正的阶码;
把数字写成规格化的二进制数形式;
把规格化的二进制数改变成非规格化的二进制数;
把非规格化的二进制数转换成十进制数。
对于不同长度的浮点数,阶码与小数位分配的数量不一样,如下:
对于32位的单精度浮点数,数符分配是1位,阶码分配了8位,尾数分配了是23位。
IEEE754标准浮点格式的更多相关文章
- 【转】浮点格式IEEE754详解
原文网址:http://www.cnblogs.com/zjujunge/archive/2012/09/13/2682613.html Intel聘请了最好的数值分析家来为8087FPU设计浮点数格 ...
- 第二章 运算方法与运算器(浮点数的加减法,IEEE754标准32/64浮点规格化数)
这一章,主要介绍了好多种计算方法.下面,写一点自己对于有些计算(手写计算过程)的见解. 1.原码.反码.补码 原码:相信大家都会写,符号位在前二进制数值在后,凑够位数即可. 反码:原码符号位不变,其他 ...
- 十进制浮点数转换成IEEE754标准的32浮点数的二进制格式
参考: http://jimmygod.blog.163.com/blog/static/43511339200792605627411/ http://blog.csdn.net/archersab ...
- C#中浮点数依IEEE-754标准转二进制串 (MODBUS 浮点数转换)
因工作需要,把再串口通信中浮点数与字节流的数据转换函数放在这,转发的,谢谢原作者. 今天花了一天的时间搜罗资料,为了解决一个串口编程的进制转化问题.因为串口传送的浮点数据格式与IEEE-754标准(3 ...
- 【转载】JS Number类型数字位数及IEEE754标准
JS的基础类型Number,遵循 IEEE 754 规范,采用双精度存储(double precision),占用 64 bit.如图 意义 1位用来表示符号位 11位用来表示指数 52位表示尾数 浮 ...
- JS Number类型数字位数及IEEE754标准
JS的基础类型Number,遵循 IEEE 754 规范,采用双精度存储(double precision),占用 64 bit.如图 意义 1位用来表示符号位 11位用来表示指数 52位表示尾数 浮 ...
- IEEE754标准浮点数表示与舍入
原文地址:https://blog.fanscore.cn/p/26/ 友情提示:本文排版不太好,但内容简单,请耐心观看,总会搞懂的. 1. 定点数 对于一个无符号二进制小数,例如101.111,如果 ...
- IEEE754标准
以下计算按规格化规定: S:符号位 M:分数值 E:指数偏移值 单精度浮点数(32bit): NUM_single = (-1)^S * 1.M * 2^(E-127) 双精度浮点数(64b ...
- 将四个BYTE数值转换成IEEE754标准的浮点数(两种方法:用Addr函数取字节数字的首地址,或者用Absolute关键字)
在工作中,经常使用到IEEE754格式的数据.IEEE754格式的数据占四个字节,好像Motorola格式和Intel格式的还不一样. 由于工作中很少和他打交道(使用的软件内部已经处理),就没太在意. ...
随机推荐
- Java实现无向图的欧拉回路判断问题
1 问题描述 Problem Description 欧拉回路是指不令笔离开纸面,可画过图中每条边仅一次,且可以回到起点的一条回路.现给定一个图,问是否存在欧拉回路? Input 测试输入包含若干测试 ...
- 数据结构:用实例分析ArrayList与LinkedList的读写性能
目录 背景 ArrayList LinkedList 实例分析 1.增加数据 2.插入数据 3.遍历数据 3.1.LinkedList遍历改进 总结 背景 ArrayList与LinkedList是J ...
- 大顶堆与小顶堆应用---寻找前k小数
vector<int> getLeastNumber(vector<int>& arr,int k){ vector<int> vec(k,); if(== ...
- iOS-NSString常见方法
</pre><pre name="code" class="html">#import <Foundation/Foundatio ...
- 记一次@ResponseBody注解返回中文乱码的问题
Bug场景 前端AJax $.ajax({ url: '$!{request.getContextPath()}/XX/save.do', type: 'post', dataType: 'json' ...
- count(1) AND count(*) 对比
相信很多小伙伴都想知道count(1) 和 count(*) 的速度问题 ,今天我给大家做一下测试.我这里测试的是MySql数据库 声明:测试之前 我数据库表里面有100万条数据.我们先来测试coun ...
- 安装 KubeSphere DevOps 系统
1. 安装KubeSphere 安装了一夜,终于看到了期待已久的画面 第一步.硬件配置(PS:VirtualBox虚拟机): 操作系统:Ubuntu 18.04 CPU:4核 内存:8G 磁盘:60 ...
- 基于 abp vNext 和 .NET Core 开发博客项目 - Blazor 实战系列(八)
系列文章 基于 abp vNext 和 .NET Core 开发博客项目 - 使用 abp cli 搭建项目 基于 abp vNext 和 .NET Core 开发博客项目 - 给项目瘦身,让它跑起来 ...
- 阿里P7终于讲完了JDK+Spring+mybatis+Dubbo+SpringMvc+Netty源码
前言 这里普及一下,每个公司都有职别定级系统,阿里也是,技术岗以 P 定级,一般校招 P5, 社招 P6 起.其实阅读源码也是有很多诀窍的,这里分享几点心得: 首先要会用.你要知道这个库是干什么的,掌 ...
- C++入门-控制台版的通讯录管理系统
通讯录管理系统 1.系统需求 通讯录是一个可以记录亲人.好友信息的工具. 本教程主要利用C++来实现一个通讯录管理系统 系统中需要实现的功能如下: 添加联系人:向通讯录中添加新人,信息包括(姓名.性别 ...