首页 > 技术文章 > 为何很大的浮点大数加一个很小的数计算结果不是预期

cxiaoln 2015-12-20 00:16 原文

通常浮点数被表示成N=S*rj S称为尾数,可正可负,j称为阶码可正可负。r是基数,在计算机中取以2的倍数。

计算机中为了提高精度,进行规格化操作:即假设N=11.0101  则规格化表示为N=0.110101*210表示,因为该规格化使得浮点数的表示精度最高。

机器中浮点数由两部分组成:阶码和尾数。基数为2

 

阶码由阶符跟阶码组成,尾数由数符跟尾数组成

其中阶码是整数,阶符和阶码的位数m合起来反映浮点数的表示范围及小数点的实际位数。尾数是小数,其位数反映了浮点数的精度。

还有机器零这个概念:即浮点数尾数为0,或者阶码小于等于所能表示的最小数。机器都把该浮点数看成0.并称该0为机器0.

 

计算机中两个浮点数加减法的运算步骤:

1、对阶,使两个数的小数点位置对齐。则需要使阶码一样。也就是咱们数学经常做的x*100+y*1000 = x*0.1*1000+y*1000  因为计算机中对阶是低阶向高阶对齐。则当两个数值相差很大的时候,在进行对阶的时候小数点需要向左移动,导致末端的数据会出现丢失的现象。一个很简单的例子,比如0.10100*2100跟0.10000*21000,则进行对阶的时候则小的这个数需要阶码需要加100,又因为精度为5位,则使得左边的数表示为0.00001*21000而导致出现精度丢失现象。

2、尾数求和。则如第一个例子的0.10100*2100跟0.10000*21000对阶相加之后的结果为0.10001*21000

3、规格化,即将小数点的最高位移到为1,因为当前最高位为1所以不用移动

4、舍入,为提高精度,考虑尾数右移时丢失的数值。

5、溢出判断。

 

这里只讲为啥相加会有精度丢失的现象。相减也是同一个道理,对阶导致的精度丢失。

推荐阅读