您好、欢迎来到现金彩票网!
当前位置:至尊彩票 > 浮点数 >

对浮点数的一些理解

发布时间:2019-04-24 04:08 来源:未知 编辑:admin

  相比int等整型,float等浮点类型的表示和存储较为复杂,但它又是一个无法回避的话题,那么就有必要对浮点一探究竟了。在计算机中,一般用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位。

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

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

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

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

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

  有了前面了基础,我们就可以来计算浮点数的数值范围了。以单精度(float)为例,我们知道它的指数范围(即E)为-126~+127,而M的范围为1≤M2,实际上,对于单精度,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位的结论,这里不再赘述。

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

http://steveouch.com/fudianshu/79.html
锟斤拷锟斤拷锟斤拷QQ微锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷微锟斤拷
关于我们|联系我们|版权声明|网站地图|
Copyright © 2002-2019 现金彩票 版权所有