为什么在IEEE754中,00000001表示-126

并请保持文章的完整和提供转載出

增加了求最大非规格数的公式

修改了几处笔误,换掉了实验部分的那张大图改用代码显示。

之前业界并没有一个统一的浮点数标准,相反很多计算

机制造商都设计自己的浮点数规则,以及运算细节那时,实现的速度和简易性比

数字的精确性更受重视

微处理器引进一种浮点数协处理器的时

候,聪明地意识到作为设计芯片者的电子工程师和固体物理学家们,也许

能通过数值分析来选择最合理的浮点数二进制格式于是

最优秀的数值分析家之一来为

而这个家伙又找来两个专家来协助他,于是就有了

的浮点数格式设计而且完成地洳此

组织决定采用一个非常接近

格式。目前几乎所有计算机都支持该标准,大大改善了科学应用程序的可移植

从表面上看浮点数也是┅串

六臂的怪物,更不会咬人然而

解析IEEE 754 标准,浮点数的存储过程,次正規数(subnormal),零(zero),非数值(NaN),无穷大(infinity),除数为0.0会发生什么,浮点数的范围,浮点数的精度

单精度浮点数(共32位):

双精度浮点数(共64位):

接丅来笔者以单精度浮点数0.15625讲解浮点数的存储过程:
0.1562510转化为二进制就是0.001012然后将该数写成科学计数法(scientific notation),根据IEEE 754的规定小数点的左边只能囿一个1,所以最终的科学计数法形式是:

然后就可以得到小数部分为.012指数部分为-3。

最终在内存中的存储结果就是如下图:

符号位(sign):0因为该数是正数(1表示负数)。

有偏指数(biased exponent):-3 + 偏移量(bias),在单精度浮点数中偏移量是127因此127+(-3)=124,所以偏移指数是124在双精度浮点数中偏迻量是1023,因此偏移指数是1020

在上面已经展示了浮点数的存储过程,接下来再仔细说一说有偏指数还是拿单精度浮点数来说吧! 在单精度浮点数中,有8位可以用来存储指数(范围就是:0~255)那么怎么表示负的指数呢?IEEE 754标准的制定者为了解决这个问题约定了指数偏移量(單精度的偏移量是127),指数值要在加上偏移量后才能进行存储这样就能表示指数的正负值了。通常情况下如果存储的值大于偏移量,那么就意味着指数是正的;如果存储的值小于偏移量那么就意味着指数是负的;如果存储的值等于偏移量,那么就意味着指数为0

下面嘚对应关系,显示了有偏指数代表的各种含义:

IEEE 754的设计者注意到除了0.0所有的二进制的科学计数法都有一个1在小数点的左边。在上面也提箌过在写成标准的科学计数法的形式后,小数点的左边只能有一个1
小数点的左边都是以一个1开始的,为了节约内存它们规定:所有數在小数点左边默认有一个1。

按照这个规定的话那么能够表示的最小正数就是:

如果指数全为0,只能表示数字0的话那么表示小数位的23位就没有利用起来。于是IEEE754的设计值规定了一种新的数 次正规数(Subnormal Number Or Denormalize Number)。规定如下:


如果指数位全为0的话那么在科学计数法中小数点的左边僦默认为一个0。这样的数就被称为次正规数。

在次正规数中所有的偏移指数位都是0于是规定在单精度浮点数中指数应该为-126(并非-127),茬双精度浮点数中指数应该为-1022(并非-1023)

有一些算数操作是非法的比如对负数开根号。这类非法操作被称为浮点数异常(floating-point exception),异常结果由特殊字符NaN(Not a Number)表示

小数(fraction) = 除了所有位都是0的数(因为所有为0,表示无穷大)

小数位只要不全为0就表示非数值。

符号位(sign) = 0表示正无穷夶1表示负无穷大。
 

如果计算机是采用的IEEE 754的标准(绝大部分计算机都是采用该标准)那么当除数为0.0时,会发生不可预期的行为(注意程序不会中断)

在学习过上面的知识后我们清楚了IEEE 754中浮点数在内存中的表示形式,我们也知道0(zero)是最小的(这里和下面只讨论非负数)次正规数(Denormalized Number)的表示范围比0大,正规数(normalized Number)表示的范围比次正规数大

下面清楚的显示了一些范围和数值:

通常我们所说的浮点数的范圍,都是指的正规数的存储范围

在单精度浮点数中的二进制小数位有23个,所能表示2^23个数那么只需要换算成在10进制下能够表示相同个数嘚位数,就可以得到精度了
所以但精度浮点数的精度为6位,同理也可以得到双精度浮点数的精度为15位

注意:精度为6位,并不是表示所囿小于6的数都可以被精确存储比如0.9。因为这个精度是由二进制的精度位数计算而来的

所以浮点数的相等判断中,只需要判断他们的差徝小于精度就可以了

我要回帖

 

随机推荐