为什么单精度浮点数的阶码取值范围是1-254在定点数表⽰中存在的⼀个问题是,难以表⽰数值很⼤的数据和数值很⼩的数据。例如,电⼦的质量(9×10-28克)和太阳的质量
(2×1033克)相差甚远,在定点计算机中⽆法直接表⽰,因为⼩数点只能固定在某⼀个位置上,从⽽限制了数据的表⽰范围。
为了表⽰更⼤范围的数据,数学上通常采⽤科学计数法,把数据表⽰成⼀个⼩数乘以⼀个以10为底的指数。
例如,在计算机中,电⼦的质量和太阳的质量可以分别取不同的⽐例因⼦,以使其数值部分的绝对值⼩于1,即:
9×10-28= 0.9×10-27
2×1033= 0.2×1034浮点数的基数什么意思
这⾥的⽐例因⼦10-27和1034要分别存放在机器的某个单元中,以便以后对计算结果按此⽐例增⼤。显然,这要占⽤⼀定的存储空间和运算时间。
浮点表⽰法就是把⼀个数的有效数字和数的范围在计算机中分别予以表⽰。这种把数的范围和精度分别
表⽰的⽅法,相当于数的⼩数点位置随⽐例因⼦的不同⽽在⼀定范围内⾃由浮动,改变指数部分的数值相当于改变⼩数点的位置。在这种表⽰法中,⼩数点的位置是可以浮动的,因此称为浮点表⽰法。
浮点数的⼀般表⽰形式为:
⼀个⼗进制数N可以写成:N = 10e×M
⼀个⼆进制数N可以写成:N = 2e×M
其中,M称为浮点数的尾数,是⼀个纯⼩数;e是⽐例因⼦的指数,称为浮点数的指数,是⼀个整数。在计算机中表⽰⼀个浮点数时,⼀是要给出尾数M,⽤⼩数形式表⽰;⼆是要给出指数e,⽤整数形式表⽰,常称为阶码。尾数部分给出有效数字的位数,因⽽决定了浮点数的表⽰精度;阶码部分指明了⼩数点在数据中的位置,因⽽决定了浮点数的表⽰范围。浮点数也是有符号数,带符号的浮点数的表⽰如图2-2所⽰。
215.gif
其中,S为尾数的符号位,放在最⾼⼀位;E为阶码,紧跟在符号位之后,占m位;M为尾数,放在低位部分,占n位。
1. 规格化浮点数
若不对浮点数的表⽰做出明确规定,同⼀个浮点数的表⽰就不是惟⼀的。例如:
(1.75)10 = (1.11)2        = 1.11×20
= 0.111×21
= 0.0111×22
= 0.00111×23
为了提⾼数据的表⽰精度,需要充分利⽤尾数的有效位数。当尾数的值不为0时,尾数域的最⾼有效位应为1,否则就要⽤修改阶码同时左右移动⼩数点的办法,使其变成符合这⼀要求的表⽰形式,这称为浮点数的规格化。
2. IEEE-754标准浮点格式
在IEEE-754标准出现之前,业界并没有⼀个统⼀的浮点数标准,相反,很多计算机制造商都在设计⾃⼰的浮点数规则以及运算细节。
为了便于软件的移植,浮点数的表⽰格式应该有⼀个统⼀的标准。1985年,IEEE(Institute of Electric
al and Electronics Engineers,美国电⽓和电⼦⼯程师协会)提出了IEEE-754标准,并以此作为浮点数表⽰格式的统⼀标准。⽬前,⼏乎所有的计算机都⽀持该标准,从⽽⼤⼤改善了科学应⽤程序的可移植性。
IEEE标准从逻辑上采⽤⼀个三元组{S, E, M}来表⽰⼀个数N,它规定基数为2,符号位S⽤0和1分别表⽰正和负,尾数M⽤原码表⽰,阶码E⽤移码表⽰。根据浮点数的规格化⽅法,尾数域的最⾼有效位总是1,由此,该标准约定这⼀位不予存储,⽽是认为隐藏在⼩数点的左边,因此,尾数域所表⽰的值是1.M(实际存储的是M),这样可使尾数的表⽰范围⽐实际存储多⼀位。为了表⽰指数的正负,阶码E通常采⽤移码⽅式来表⽰,将数据的指数e 加上⼀个固定的偏移量后作为该数的阶码,这样做既可避免出现正负指数,⼜可保持数据的原有⼤⼩顺序,便于进⾏⽐较操作。
⽬前,⼤多数⾼级语⾔都按照IEEE-754标准来规定浮点数的存储格式。IEEE-754标准规定,单精度浮点数⽤4字节(即32位)存储,双精度浮点数⽤8字节(即64位)存储,如图2-3所⽰:
216.gif
单精度格式(32位):符号位(S)1位;阶码(E)8位,阶码的偏移量为127(7FH);尾数(M)23位,⽤⼩数表⽰,⼩数点放在尾数域的最前⾯;
双精度格式(64位):符号位(S)1位;阶码(E)11位,阶码的偏移量为1023(3FFH);尾数(M)52位,⽤⼩数表⽰,⼩数点放在尾数域的最前⾯。
在IEEE-754标准中,⼀个规格化的32位浮点数X的真值可表⽰为:
X = (-1)s×(1.M)×2 E-127      e = E-127          (式2-9)
在IEEE-754标准中,⼀个规格化的64位浮点数X的真值可表⽰为:
X = (-1)s×(1.M)×2 E-1023      e = E-1023        (式2-10)
由于双精度格式的原理与单精度格式相同,仅仅是表⽰的位数有所增加,所以,下⾯主要介绍单精度格式(32位)浮点数的表⽰⽅法。
当⼀个浮点数的尾数为 0,不论其阶码为何值,或者当阶码的值遇到⽐它所能表⽰的最⼩值还⼩时,不管其尾数为何值,计算机都把该浮点数看成零值,称为机器零。
当阶码E为全0且尾数M也为全0时,表⽰的真值X为零,结合符号位S为0或1,有正零和负零之分。当阶码E为全1且尾数M也为全0时,表⽰的真值X为⽆穷⼤(∞),结合符号位S为0或1,有+∞和-∞之分。这样,在32位浮点数表⽰中,要除去E⽤全0和全1(255)表⽰零和⽆穷⼤的特殊情况,因此,阶
码E的取值范围变为1~254,指数的偏移量不选128(10000000B),⽽选127(01111111B)。对于32位规格化浮点数,真正的指数值e为-126~+127,因此,数的绝对值的范围是2-126~2127≈10-38~1038。