转载参考:http://share.onlinesjtu.com/mod/tab/view.php?id=176php
http://www.ruanyifeng.com/blog/2010/06/ieee_floating-point_representation.htmlhtml
http://baike.baidu.com/link?url=heUWO1s1ygzWlf_ZQ0nzfKcJQFmosbGJVzkOCvInmNRcISY_bSfsjaDaxgGjOlJcMwFKKIMf3z9Ml0hW6xQi7_ url
在定点数表示中存在的一个问题是,难以表示数值很大的数据和数值很小的数据。例如,电子的质量(9×10-28克)和太阳的质量(2×1033克)相差甚远,在定点计算机中没法直接表示,由于小数点只能固定在某一个位置上,从而限制了数据的表示范围。spa
为了表示更大范围的数据,数学上一般采用科学计数法,把数据表示成一个小数乘以一个以10为底的指数。设计
例如,在计算机中,电子的质量和太阳的质量能够分别取不一样的比例因子,以使其数值部分的绝对值小于1,即:htm
9×10-28 = 0.9×10-27blog
2×1033 = 0.2×1034数学
这里的比例因子10-27和1034要分别存放在机器的某个单元中,以便之后对计算结果按此比例增大。显然,这要占用必定的存储空间和运算时间。it
浮点表示法就是把一个数的有效数字和数的范围在计算机中分别予以表示。这种把数的范围和精度分别表示的方法,至关于数的小数点位置随比例因子的不一样而在必定范围内自由浮动,改变指数部分的数值至关于改变小数点的位置。在这种表示法中,小数点的位置是能够浮动的,所以称为浮点表示法。io
浮点数的通常表示形式为:
一个十进制数N能够写成:N = 10e×M
一个二进制数N能够写成:N = 2e×M
其中,M称为浮点数的尾数,是一个纯小数;e是比例因子的指数,称为浮点数的指数,是一个整数。在计算机中表示一个浮点数时,一是要给出尾数M,用小数形式表示;二是要给出指数e,用整数形式表示,常称为阶码。尾数部分给出有效数字的位数,于是决定了浮点数的表示精度;阶码部分指明了小数点在数据中的位置,于是决定了浮点数的表示范围。浮点数也是有符号数,带符号的浮点数的表示如图2-2所示。
其中,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 Electrical 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所示:
单精度格式(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位)浮点数的表示方法。
当阶码E为全0时,若尾数M也为全0时,表示的真值X为零,结合符号位S为0或1,有正零和负零之分。若M非全0,这时,浮点数的指数E等于1-127(或者1-1023),有效数字M再也不加上第一位的1,而是还原为0.xxxxxx的小数。总之,这样作是为了表示±0,以及接近于0的很小的数字。
当阶码E为全1时,若尾数M也为全0时,表示的真值X为无穷大(∞),结合符号位S为0或1,有+∞和-∞之分。若是有效数字M不全为0,表示这个数不是一个数(NaN)。
当E不全为0,不全为1。这时,浮点数就采用上面的规则表示,即指数E的计算值减去127(或1023),获得真实值,再将有效数字M前加上第一位的1。
这样,在32位浮点数表示中,要除去E用全0和全1(255)表示零和无穷大的特殊状况,所以,阶码E的取值范围变为1~254,指数的偏移量不选128(10000000B),而选127(01111111B)。对于32位规格化浮点数,真正的指数值e为-126~+127,所以,数的绝对值的范围是2-126~2127≈10-38~1038。
补充说明:
在单精度表示中,以8位二进制存储指数(阶码)。本来的范围是-127~128(余码系统)。余127码后,加上偏移量,范围变成0~255。由以前的讨论,去除全0和全1的阶码,阶码E的取值范围变为1~254即真正的指数值e为-126~ +127。
由此咱们计算单精度浮点表示法能够表示的数的最大绝对值:1.11………1(23个1)最大尾数,再化为十进制,再乘以2^127 (阶码能够表示的最大指数),结果=(1-2^-24)*2^128
= 3.4028234663853 * 10 38
计算单精度浮点表示法能够表示的数的最小绝对值 :(1-2^-1)*2^-127 =2.9387358770557 * 10 -39(这个值我暂时不会计算,求教)
超出最大绝对值的数为上溢,小于最大绝对值的数为下溢。