原标题:浮点数在计算机中是如何表示的

来源:编程珠玑

前言

相比int等整型,float等浮点类型的表示和存储较为复杂,但它又是一个无法回避的话题,那么就有必要对浮点一探究竟了。在计算机中,一般用IEEE浮点近似表示任意一个实数,那么它实际上又是如何表示的呢?

下面的表达式里,i的值是多少,为什么?如果你不确定答案,那么你应该好好看看本文。

floatf = 8.25f;

inti = *( int*)&f;

IEEE浮点表示

IEEE浮点标准用

的形式近似表示一个数。并且将浮点数的位表示划分为三个字段:

符号(sign)s决定这个数是负数(s=1)还是正数(s=0)。可以用一个单独的符号s直接编码符号s。

尾数(signficand)M是一个二进制小数,它的范围是1~2-ξ或者是0~1-ξ。 n位小数字段编码尾数M。

阶码(exponent)E的作用是对浮点数加权,这个权重是2的E次幂(可能是负数)。k位的阶码字段 编码阶码E。

在单精度浮点格式(c语言的float)中,s,exp和frac字段分别为1位,8位和23位,而双精度浮点格式(c语言中的double)中,s,exp和frac字段分别为1位,11位和52位。

一个浮点数的常见比特位表示如下:

单精度

s(31)

exp(30~23)

frac(22~0)

双精度

s(63)

exp(62~52)

frac(51~0)

而根据exp的值,被编码的值可以分为三大类不同的情况。下面进行一一解释。

情况1:规格化的值

即最普遍的情况,当exp,即阶码域既不为全0,也不为全1的情况。在这种情况下,阶码字段解释为以偏置(biased)形式表示有符号整数,即E=exp-Bias,exp是无符号数(1~254)。Bias是一个等于的偏置值,对于单精度来说,k=23,Bias=127,因此E的范围是-126~+127。

frac被描述为小数值,且0≤frac<1,其二进制表示为0.frac。尾数定义为 M=1+frac,则M=1.frac。那么就有1≤M<2,由于总是能够调整阶码E,使得M在范围1≤M<2,所以不需要显示的表示它,这样还能获得一个额外的精度位。也就是说,在计算机内部保存M时,默认这个数的第一位总是1,因此可以被舍去,只保存后面的frac部分,等到读取的时候,再把第一位的1加上去。

情况2:非规格化的值

当exp,即阶码域为全0时,所表示的数便为非规格化的值,该情况下的阶码值E=1-Bias(注:为从非格式化值转换到格式化值提供了一种方法)。尾数M=frac

非规格化的数有两个作用。

表示数值0。格式化数中,我们总使得M≥1,因此就无法表示0。而阶码全0时,且尾数也全0时,就可以表示0了。

表示接近0.0的数。它所表示的值分布地接近于0.0,该属性成为逐渐溢出。

情况3:特殊值

有两种

阶码全为1,小数域全为0。它得到值为 +∞(s=0)或-∞(s=1),它在计算机中可以表示溢出的结果,例如两个非常大的数相乘。

阶码全为1,小数域不全为0。它得到值为NaN(Note a Number)。它在计算机中可以表示非法的数,例如计算根号-1时的值。

浮点数的范围和有效位

对于浮点数,其能表示的数值范围和其有效位如下

类型

比特位

数值范围

有效位

float

32

-3.410^38~+3.410^38

6~7位

double

64

-1.710^-308~1.710^308

15~16位

long double

128

-1.210^-4932~1.210^4932

18~19位

可见同比特位数的整型(例如int)要比浮点数(例如float)能表示的数值范围要小很多,但是需要注意的,虽然浮点数能表示的范围大,但是 它却不能精确表示在其范围内的所有实数,也就是说,它只能保证有效位的值是精确的,当表示的数值(小数部分)超过有效位时,所表示的数是无法保证精确的,甚至可以说是错误的。

那么浮点数的数值范围和有效位是如何得到的呢?

浮点数的数值范围计算

有了前面了基础,我们就可以来计算浮点数的数值范围了。以单精度(float)为例,我们知道它的指数范围(即E)为-126~+127,而M的范围为1≤M<2,实际上,对于单精度,1≤M≤2-2^(-23)(注:23为frac字段所占的比特位)。那么我们就可以得到单精度的最大值为:

同理,我们可以得到单精度的最小值为:

我们仅仅以单精度为例,用同样的方法可以计算其他精度的浮点数数值范围,在此不再赘述。

浮点数的有效位

有效位也可以理解为我们常说的精度。浮点数的精度是由尾数的位数来决定的。

对于单精度(float),它的尾数为23位,而2^23=8388608,共7位,也就是说最多能有7位有效数字,但至少能保证6位,因此其有效位为6~7位。当然我们可以通过下面的内容进一步理解。以下计算结果保留10位小数。

观察a和b的结果可以发现,0.0000001和0.0000002之间的其他数是没有办法通过单精度浮点数来精确表示的,也就是说,只有到小数点后面7位的值才是精确的,同理,观察b和c的结果,0.0000002到0.0000004之间的其他数也是不能通过单精度浮点数精确表示的,更不幸地是,这之间的数,甚至只能精确到第6位。

这也就有了单精度浮点数的有效位为6~7位的结论。根据相似的方法,我们同样可以得到双精度浮点数的有效位为15~16位的结论,这里不再赘述。

浮点数在内存中的存储

了解了这么多,我们来看一下一个小数究竟是如何在内存中存储的。以float f = 8.5f为例。其二进制表示为,可见指数实际值为3,则根据E=exp-Bias,可知exp=E+Bias=3+127=130,根据M=1+frac,可知,frac=M-1=0.0001(二进制)而

因此不难得到,8.5的在内存中的存储情况为:

s

exp

frac

0

1000 0010

0001 0000 0000 0000 0000 000

如果这个时候把这个值作为整型使用,是多少呢?没错,是1091043328

#include

intmain(intargc,char*argv[])

{

floatf= 8.5f;

int*i = ( int*)&f;

printf( "%d

",*i);

return0;

}

再说几句

关于浮点数,需要再说几句:

在二进制,第一个有效数字必定是“1”,因此这个“1”并不会存储。

浮点数不能精确表示其范围内的所有数。

可精确表示的数不是均匀分布的,越靠近0越稠密。

默认舍入方式为向偶舍入,也被称为最接近的值舍入。

不遵守普遍的算术属性,比如结合律。

●调剂过程中如何更有效地利用师兄师姐的资源?

责任编辑:

计算机浮点数格式化表示方法,浮点数在计算机中是如何表示的相关推荐

  1. 计算机维护与维修方法,浅谈计算机维护与维修方法

    题目:浅谈计算机维护与维修方法 作者:周旺红手机:159******** 单位:江苏省徐州机电工程高等职业学校 地址:江苏省徐州市云龙区东店子徐州机电工程高等职业学校云龙校区 邮编:221000 [摘 ...

  2. 运用计算机优化教学的方法,浅谈计算机基础课程教学模式的优化对策论文

    计算机的应用在中国越来越普遍,改革开放以后,中国计算机用户的数量不断攀升,应用水平不断提高,特别是互联网.通信.多媒体等领域的应用取得了不错的成绩.1996年至2009 年,计算机用户数量从原来的63 ...

  3. 计算机论文的写作方法有哪些,计算机专业论文的写作方法.ppt

    计算机专业论文的写作方法 计算机专业毕业论文的写作方法 杨平华 论文要求应该有如下两点: 较好地掌握本学科的基础理论.专门知识和基本技能: 具有从事科学研究或专门技术工作的初步能力. 本讲座分四个部分 ...

  4. 计算机关机时间设置方法,如何设置计算机的预定关机时间,教您如何设置计算机的预定关机时间...

    如何设置计算机的预定关机时间?计划关闭功能由文件夹中的Shutdown.exe程序控制,然后我们可以向他添加一系列命令以实现计划关闭. 有时在哪里设置定时关机,您下载了一个东西,但是您必须关闭计算机并 ...

  5. 运用计算机优化教学的方法,浅谈计算机教学中多种教学方法优化运用.doc

    浅谈计算机教学中多种教学方法优化运用 浅谈计算机教学中多种教学方法优化运用 摘 要:每一种教学方法各有其优越性,也各有其局限性,正如一把钥匙不能打开所有的锁一样,所以对于不同特点的学生群体,不同特点的 ...

  6. 计算机维修与护理论文,计算机维修与维护方面论文选题 计算机维修与维护论文题目怎样定...

    [100道]计算机维修与维护方面论文选题,每一个论文题目都是精选出来的,看了后定能知晓计算机维修与维护论文题目怎样定等相关写作技巧,让计算机维修与维护论文写作轻松起来! 一.比较好写的计算机维修与维护 ...

  7. IEEE 754——计算机中浮点数的表示方法

    楔子 #include <iostream> int main(int, char**) {std::cout.precision(20);float a = 123.4567890123 ...

  8. 用计算机浮点数表示法计算,计算机组成原理第4章浮点数运算方法ppt课件

    PPT内容 这是计算机组成原理第4章浮点数运算方法ppt课件下载,主要介绍了浮点数的表示:浮点加减运算:浮点加减运算的步骤:浮点数加减运算流程图:浮点加减法运算:浮点运算所需的硬件配置,欢迎点击下载. ...

  9. 计算机中浮点数表示方法,浮点数的表示方法

    <浮点数的表示方法>由会员分享,可在线阅读,更多相关<浮点数的表示方法(2页珍藏版)>请在人人文库网上搜索. 1.浮点数的表示方法 一.浮点数表示 一个数的浮点形式(设基数是2 ...

最新文章

  1. 好理解的Java内存虚假共享(False Sharing)性能损耗以及解决方案
  2. Windows系统运维转linux系统运维的经历
  3. python学习笔记(IO模型)
  4. linux shell审计--snoopy的注意事项
  5. dbms_xplan.display_cursor 获取执行过的sql的执行计划
  6. sql server获取表的所有字段
  7. [蓝桥杯][2016年第七届真题]密码脱落(记忆化搜索)
  8. jenv java_mac 上使用jenv 管理的多个java 版本
  9. python安卓开发实例_python服务器与android客户端socket通信实例
  10. echarts 获取点击的y轴数值_有机磷酸催化对醌的不对称直接加成反应合成轴手性芳基醌类化合物...
  11. 拼多多、腾讯 C++开发工程师面试题
  12. mysql show db_mysql show操作
  13. Eclipse中的m2e不支持如何修复maven-dependency-plugin(目标为“ copy-dependencies”,“ unpack”)
  14. EmEditor中正则表达式
  15. 如何用计算机判断直角三角形,三角形角度(直角三角形懒人计算器)
  16. 常用命令大全(网络命令+关机重启命令)
  17. 通信基站中AAU与RRU的功能和区别是什么?
  18. 57之最,来找找你的之最吧
  19. 构建更安全、更智能、更健康的数字化世界——中新赛克2021全国渠道大会成功举办
  20. 作为大数据技术面试官,我喜欢什么样的应届毕业生?

热门文章

  1. Matlab/Simulink 自动代码生成 基于模型设计学习教程(2)---- 闪烁灯实验
  2. 单频点单输入功率只含基波X模型的提取与验证
  3. hazelcast 搭建_hazelcast Management Center 源码分析
  4. 外包公司派遣到网易,上班地点网易大厦,转正后工资8k-10k,13薪,包三餐,值得去吗?
  5. android 动画卡顿分析工具
  6. 前端项目:基于Nodejs+vue开发实现高校学院网站系统
  7. MLX90640开发笔记(十)成果展示-红眼睛相机
  8. Windows系统使用命令行整理磁盘碎片
  9. win10 获取超级管理员权限,administrator不是最高权限解决办法
  10. c# Stack源码解析