浮点数,在计算机内存里是按二进制方式存储,输入/输出时再转换为十进制。为计算浮点数的精度、范围等,理论上可以把浮点数抽象为
·一个基(base或radix),可以是二进制或十进制;
·一个精度p;
·一个指数,范围从emin 到emax。
这样,一个数可以由三个整数部分表达:S(符号位)是0或者1;c是有效位;不超过p 个位(基为b)的数(范围是0到bp-1);q表达指数部分,且:emin≤q+p-1≤emax。
·这样的有限数是(-1)S×c×bq。但会出现两个0值,一个+0和一个-0。这与整数的情况是一样的。
·两个无穷:+∞和-∞(即超出实际了表达范围)。
·两类非数(NaN,not-a-number):一个是q NaN(Quiet NaN),另一个是sNaN(Signaling Na N)。
接下来做一下深入的讨论。以32位二进制浮点数的为例,用8位作为指数,23位作为小数部分,1位做符号位。
例子1 一个正常数0.1562510(十进制)表达为如下的二进制数,如图3-2所示。
图3-2 浮点数的表达
0.1562510是二进制的0.001012(即1/8+1/32)
用科学表达法,重写这个数,即二进制小数点左面只有一个1,就需要多乘3个2,为
0.001012=1.012×2-3
这样,小数部分是.012,指数部分是-3(十进制)。
总结一下:
该数的符号位为0,因为是正数。负数为1。
小数部分为.01000…2。
理论上,指数为-3。然而,在实际存储中,如果指数部分也有符号位的话,两个数的比较运算就会很麻烦。为此,把指数部分存储为一个无符号的正数。(www.xing528.com)
8位指数的范围最多是-128 ~+127。把127作为固定偏移值,指数值的范围是1 ~254(0和255作为特殊值,参见下面的例3和例4)。因此,例1中的指数存为124=127-3=011111002(参见图3-2)。这样,浮点数计算时,指数值减去固定偏移值就是实际的指数大小。
例子2 零的表达。
指数部分=0;小数=0。
符号位=0,表示正零;符号位=1,表示负零。记住出现两个零。运算中要避免的,见例子3。
例子3 非正常无穷小数。
为了避免下溢出(下溢出指数据的绝对值小于能表达的最小数)的情况。实际表达的小数部分应当比正常想象的要少,这时小数部分接近0,而指数部分是0。
一旦指数的所有位全为0,就说明无法进行计算,例如该数不能再被大于1的数除了,如果进行运算,就会出现不可判断的情况。
为此,规定8位指数部分的最小值是-126(而不是-127或-128,参见上面的例子1),避免下溢出。
例子4 非正常的无穷大数。
与例子3相反,当指数的所有位都是1时(即十进制的255),这个数是计算机能表达的无穷大数,或一个不适合于进行计算的数(非正常数)。要避免出现这种情况。
正负无穷大的情况,分别为
指数位全部为1;小数部分全为0。
符号位=0,为正无穷大;1,为负无穷大。
例子5 非数的表达—NaN。
有些浮点运算是非法的,例如,求负数的平方根。这种情况下,获得的结果被称为运算异常(exception)。异常情况的结果用一个特殊编码表示,称为NaN(Not a Number)。这种情况下:
符号位为0或1;
指数位全为1;
小数部分不是全0,或者说,除了全0的情况。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。