深入理解计算机内部浮点数的IEEE754格式存储
1、模块一:1.计算机中的浮点数一般都是用二进制表示的。如果在不同的计算机中,浮点数采用不同的基数、尾数和阶码的长度,则浮点数表示有较大的差别,这样不利于软件在不同的机器之间的移植。从20世纪70年代末开始,IEEE就成立了一个专门的委员会负责对浮点数进行标准化。IEEE754标准是1985年由IEEE提出的一个从系统结构角度支持浮点数表示的标准,当今流行的计算机几乎都采用这一标准。在目前常用的80X86系列微机中,通常设有支持浮点运算的部件。在这些机器中的浮点数采用IEEE754标准,按IEEE754标准,常用的浮点数的格式如图所示。
2、2.短浮点数又称为单精度浮点数,长浮点数又称为双精度浮点数,它们都采用隐含尾数最高数位的方法,这样,无形中又增加了一位尾数。临时浮点数又称为扩展精度浮点数,它没有隐含位。在IEEE754标准中阶码用移码表示,尾数用原码表示,隐含的基数为2。下表总结了短浮点数(32位)和长浮点数(64位)格式的有关参数。
3、3.以短浮点数为例,阶码最大值为127,最小值为-126,则阶码移码的表示范围为1~254。这是因为阶码为全0和全1这两种极端阶码值用于定义特殊数值:机器零和无穷大。非0规格化数的尾数的最高有效位一定为1。IEEE754标准规定规格化浮点数在小数点的左边有一隐含位(作为二进制整数的个位数)。由于该位为1,不需要存储,在运算时,自动加上该位参加运算,因此尾数实际上是24位。此时规格化浮点数的尾数为1.f(f为尾数,1为隐含位),所表示的规格化浮点数为士(1.f)×2^(E-127)。
4、4.下面以32位的短浮点数为例,讨论浮点代码与其真值之间的关系。最高位为数符位;其后是8位阶码,以2为底,用移码表示,阶码的偏置值为127;其余23位是尾数数值位。对于规格化的二进制浮点数,数值的最高位总是“1”,为了能使尾数多表示一位有效值,可将这个“1”隐含,因此尾数数值实际上是24位(1位隐含位+23位小数位)。应注意的是,隐含的1是一位整数(即位权为20)。在浮点格式中表示出来的23位尾数是纯小数,用原码表示。例如,(12)10=(1100)2,将它规格化后结果为1.1×2^3,其中整数部分的“1”将不存储在23位尾数内。阶码是以移码形式存储的。对于短浮点数,偏置值为127(3FH);对于长浮点数,偏移量为1023(3FFH)。存储浮点数阶码部分之前,偏置值要先加到阶码真值上。上述例子中,阶码真值为3,故在短浮点数中,移码表示的阶码为127+3=130(82H);长浮点数中,为1023+3=1026(402H)。
5、5.例1:将猾诮沓靥(100.25)10转换成短浮点(单精度)数格式。(1)把十进制数转换成为二进制数(100.25)10=(1100100.01)2(2)规格化二进制数1100100.01=1.10010001×2^6(3)计算出阶码的移码(公式:[X]移码=偏置值+X(真值),X(真值)=[X]移码-偏置值)1111111+110=10000101(4)以短浮点数格式存储该数因为,符号位=0阶码=10000101尾数=10010001000000000000000所以,短浮点数代码为0;10000101;10010001000000000000000表示为十六进制的代码:42C88000H。例2:把短浮点数C1C90000H转换成为十进制数。(1)将十六进制代码写成二进制形式,并分离出符号位、阶码和尾数。因为,C1C90000H=11000001110010010000000000000000所以,符号位=1阶码=10000011尾数=10010010000000000000000(2)计算出阶码真值(阶码真值+偏置值=移码 阶码真值=移码-偏置值)10000011-1111111=100(3)以规格化二进制数形式写出此数:1.1001001×2^4(4)写成非规格化二进制数形式:11001.001(5)转换成十进制数,并加上符号位(11001.001)2=(25.125)10所以,该浮点数=-25.125通常,将IEEE754短浮点数规格化的数值v表示为:v=(-1)^Sx(1.f)×2^(E-127)其中,S代表符号位,来自符号的英语单词Sign,其中S=0表示正数,S=1表示负数;E为用移码表示的阶码;f是尾数的小数部分。为了表示∞和一些特殊的数值,E的最小值0和最大值255将留作它用。因此,最小正常的E=1,最大正常的E=254,所以短浮点数的阶码真值的取值范围为-126~127。当E和m均为全0时,表示机器零;当E为全1,m为全0时,表示士∞。