浮点数I-EEE规范
通常,可以用下面的格式来表示浮点数:
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 |
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 |
二、浮点数的表示约定
单精度浮点数和双精度浮点数都是用IEEE 754标准定义的,其中有一些特殊约定,例如:
1、当P=0,M=0时,表示0。
2、当P=255,M=0时,表示无穷大,用符号位来确定是正无穷大还是负无穷大。
3、当P=255,M≠0时,表示NaN(Not a Number,不是一个数)。
三、非规范浮点数
当两个绝对值极小的浮点数相减后,其差值的指数可能超出允许范围,最终只能近似为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 |
本文的结论基于IEEE 754标准,另外一个标准是IEEE 854,这个标准是关于十进制浮点数的,但没有规定具体格式,所以很少被采用。另外,从2000年开始,IEEE 754开始修订,被称为IEEE 754R,目的是融合IEEE 754和IEEE 854标准。该标准在浮点格式方面的修订有:1、加入了16位和128位的二进制浮点数格式;2、加入了十进制浮点数格式,采用了IBM公司提出的格式。
浮点数I-EEE规范相关推荐
- Java中null和浮点数相乘_jvm规范之浮点数 - 你知道吗,有个数字它和自身不相等...
原标题:jvm规范之浮点数 - 你知道吗,有个数字它和自身不相等 你知道吗,有个数字它和自身不相等,你知道吗,有两个数字他们是相等的,但是1.0除以他们得到的结果却是大相径庭.本文将为你揭开这神秘的面 ...
- 数据的表示:原码、反码、补码、移码以及浮点数的运算
前言 复习到数据表示方面相关的知识,所以在这里做一下记录,也方便大家参考. 什么是 R 进制 对于 R 机制,如果要实现与十进制的转换,则使用 按权展开法,其具体操作为: 将 R 进制数的每一位数值用 ...
- Java虚拟机规范阅读(二)IEEE754简介以及Java虚拟机中的浮点算法
什么是浮点数 在计算机系统的发展过程中,曾经提出过多种方法表达实数.典型的比如相对于浮点数的定点数(Fixed Point Number).在这种表达方式中,小数点固定的位于实数所有数字中间的某个位置 ...
- 22.25在计算机中如何储存,浮点数在计算机中存储方式
C语言和C#语言中,对于浮点类型的数据采用单精度类型(float)和双精度类型(double)来存储,float数据占用32bit,double数据占用64bit,我们在声明一个变量float f= ...
- java浮点数误差_浮点数运算的误差
浮点数运算的误差 在 JavaScript 中整数和浮点数都属于number 数据类型,所有数字都是使用64位浮点数形式储存,遵循IEEE-754双精度标准存储,即便整数也是如此. 所以我们在打印 1 ...
- 关于浮点数的原理详解
1. 什么是浮点数 在计算机系统的发展过程中,曾经提出过多种方法表达实数.典型的比如相对于浮点数的定点数(Fixed Point Number).在这种表达方式中,小数点固定的位于实数所有数字中间的某 ...
- 64位浮点数_JavaScript 浮点数运算的精度问题
问题描述 在 JavaScript 中整数和浮点数都属于 Number 数据类型,所有数字都是以 64 位浮点数形式储存,即便整数也是如此. 所以我们在打印 1.00 这样的浮点数的结果是 1 而非 ...
- 浮点数运算的精度问题:以js语言为例
在 JavaScript 中整数和浮点数都属于 Number 数据类型,所有数字都是以 64 位浮点数形式储存,即便整数也是如此. 所以我们在打印 1.00 这样的浮点数的结果是 1 而非 1.00 ...
- 与afreez一起学习DSP中浮点转定点运算--浮点数的存储格式
二:浮点数的存储格式 2.1 IEEE floating point standard 上面我们说了,浮点数的小数点是不固定的,如果每个人都按照自己的爱好存储在电脑里,那不就乱套了吗?那么怎么在计算机 ...
- 十进制浮点数的表示方法
使用十进制浮点数,可以避免二进制浮点数与我们习惯的十进制数之间的表示误差.这个在金融领域是非常重要的.但是计算机基本都只能对二进制浮点数进行计算,也就是IEEE754格式表示的浮点数.很多程序都会自己 ...
最新文章
- 杨威(为奥运冠军名字作诗)
- 基于Spring AOP的JDK动态代理和CGLIB代理
- 【论文解读】解读TRPO论文,深度强化学习结合传统优化方法
- python爬取歌曲评论_python 爬取歌曲评论的简单示例
- AA.Dapper升级了
- 逆向so_安卓逆向 | 分析调试与so调用实战
- python画椭圆形_手残党福音:用Python画出机器人Dev
- 【Flink】Flink Max 和 MaxBy的区别
- 耐人深思的总结,牛牛牛
- android清理缓存动画、天气APP、购物下单选择器、阅读APP、饿了么demo等源码
- hadoop2.4.1源码在64位系统编译过程中遇到的几个错误及解决方法
- 火影忍者 动漫 全集目录 分章节 精彩打斗剧集 思维导图整理
- 个人财务软件java_个人账务管理系统java
- 十六进制 转 二进制方法汇总
- 磁珠法RNA pull down试剂盒、蛋白质-核酸相互作用
- unity材质球发光_Unity3D中使物体自发光
- 解决uniapp编译为微信小程序以后vender.js的文件过大的问题
- C 语言编程 经典例题 猴子吃桃问题:
- JavaScript进阶篇③ — 浏览器对象、Dom对象
- 人机交互-7-交互需求定义
热门文章
- 移动硬盘插入提示需要格式化RAW_移动硬盘数据恢复
- forum.anywlan.com.php,一句话让您理解WDS和WISP的区别/多数WISP路由器的简单有效的通用设置方法...
- TV端影视APP开发搭建需要注意哪些问题?
- 商业银行的设立与组织形式-单一银行制、分支银行制、持股公司制、连锁银行制、代理银行制...
- java遍历二级城市_java8用Lambda遍历省市区三级数据
- Android进阶-NDK学习完整版
- C语言小技巧之如何求平均数
- c语言中 输入有两行:第一行是一个正整数n,第二行是n个整数,c语言问题:输入格式 输入有多组数据.每组数据两行.第一行包含一个正整数n(小于等于1000...
- 马科维兹+matlab,“马科维茨”投资组合模型实践——第三章 投资组合优化:最小方差与最大夏普比率...
- java实现http的GET/POST请求封装类-HttpRequest