首页 理论教育 软件工程专业导论:浮点数表达理论现成果

软件工程专业导论:浮点数表达理论现成果

时间:2023-10-23 理论教育 版权反馈
【摘要】:为计算浮点数的精度、范围等,理论上可以把浮点数抽象为·一个基,可以是二进制或十进制;·一个精度p;·一个指数,范围从emin 到emax。以32位二进制浮点数的为例,用8位作为指数,23位作为小数部分,1位做符号位。这样,浮点数计算时,指数值减去固定偏移值就是实际的指数大小。例子5 非数的表达—NaN。有些浮点运算是非法的,例如,求负数的平方根。异常情况的结果用一个特殊编码表示,称为NaN。

软件工程专业导论:浮点数表达理论现成果

浮点数,在计算机内存里是按进制方式存储,输入/输出时再转换为十进制。为计算浮点数的精度、范围等,理论上可以把浮点数抽象为

·一个基(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的情况。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈