3.浮点数据类型

具有整数部分和小数(尾数)部分的数称为实数或浮点数。实际上整型数是小数部分为0的实数,是实数集的一个子集。由于计算机使用固定长度位来表示一个数,因此并不能精确地表示所有实数。由于计算机表示实数时为了在固定长度位内能表示尽量精确的实数值,分配给表示小数部分的位个数并不是固定的,即小数点是可以“浮动”的,因此计算机表示的实数数据类型也称为浮点数。为了便于程序移植,目前计算机中都使用IEEE标准754指定的浮点数表示方式来表示实数。

这种实数表示方式的一般格式如图 11-3 所示。它由有效数(Significant)部分、指数(Exponent)部分和符号位(Sign)组成。80387协处理器支持三种实数类型,它们每个部分使用的位数如图11-4所示。

Linux内核完全剖析---数学协处理器1)

Linux内核完全剖析---数学协处理器1)

其中S是一个位的符号位。S=1表示是负实数;S=0表示是正实数。有效数(Significant)给出了实数数值的有效位数或尾数。当使用指数时,一个实数可以表示成多种形式。例如十进制数字10.34可以表示成1034.0×10-2、10.34×100、1.034×101或0.1034×102等。为了使计算能够得到最大精度值,我们总是对实数进行规格化(Normalize)处理,即调整实数的指数值,使得二进制最高有效数值总是1,并且小数点就位于其右侧。因此,上述例子正确的规格化处理结果就是1.034×101。对于二进制数来说就是1.XXXXX×2N(其中X是1或0)。如果我们总是使用这种形式来表示一个实数,那么小数点左边肯定是1。所以在80387的短实数(单精度)和长实数(双精度)格式中,这个“1”就没有必要明确地表示出来。因此在短实数或长实数的二进制有效数中,0x0111...010实际上就是0x1.0111...010。

格式中的指数字段含有把一个数表示成规格化形式时所需要的2的幂次值。正如前面提到的,为了便于数字大小的比较,80387使用偏置数形式来存储指数值。短实数、长实数和临时实数的偏置基量分别是127、1023和16383。因此一个短实数指数值0b10000000实际表示21(0b01111111 + 0b00000001)。

另外,临时实数是80387内部运算时表示数的格式。它的最高有效数1被明确地放置在位63处,并且无论你给出的数是什么数据类型的(例如,整型数、短实数或BCD码数等),80387都会把它转换成临时实数格式。80387这样做的目的是为了使得精度最大化并且尽量减少运算过程中的溢出异常。显式地把1表示出来是因为80387在运算过程中确实需要该位(用于表示极小的数值)。当输入到80387中的短型或长型实数被转换成临时实数格式时,就会明确地在位63处放置一个1。

4.特殊实数

与上面表中格式某些值无法表示的情况类似,使用实数格式表示的某些值也有其特殊含义。对于80位长度格式的临时实数,80387并没有使用其可表示的所有范围数值。表11-3是80387使用中的临时实数所能表示的所有可能的数值,其中有效数一栏虚线左侧1位表示临时实数位63,即明确表示数值1的位。短实数和长实数没有此位,因此也没有表中的伪非规格化类别。下面说明其中的一些特殊值:零值、无穷值、非规格化值、伪非规格化值以及信号NaN(Not a Number)和安静NaN。

Linux内核完全剖析---数学协处理器1)

零是指数和有效数均为0的值,其余指数为0的值作保留,即指数是0的值不能表示一个正常实数值。无穷值是指数值为全1、有效数值为全零的值,而且指数值为0x11...11的所有其余值也作保留使用。


相关内容