码迷,mamicode.com
首页 > 其他好文 > 详细

浮点数在计算机内存的存储结构以及溢出临界值的计算

时间:2015-04-03 15:04:07      阅读:269      评论:0      收藏:0      [点我收藏+]

标签:

转载参考:http://share.onlinesjtu.com/mod/tab/view.php?id=176

              http://www.ruanyifeng.com/blog/2010/06/ieee_floating-point_representation.html

              http://baike.baidu.com/link?url=heUWO1s1ygzWlf_ZQ0nzfKcJQFmosbGJVzkOCvInmNRcISY_bSfsjaDaxgGjOlJcMwFKKIMf3z9Ml0hW6xQi7_ 

在定点数表示中存在的一个问题是,难以表示数值很大的数据和数值很小的数据。例如,电子的质量(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所示。

技术分享

其中,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位)浮点数的表示方法。

计算机中机器零是指:
1、如果一个浮点数的尾数全为0,则不论其阶码为何值,计算机在处理时都把这种浮点数当作零看待;
2、如果一个浮点数的阶码小于它所表示范围的最小值,则不论其尾数为何值,计算机在处理时都把这种浮点数当作零看待。

当阶码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(这个值我暂时不会计算,求教)

 

            超出最大绝对值的数为上溢,小于最大绝对值的数为下溢。 

浮点数在计算机内存的存储结构以及溢出临界值的计算

标签:

原文地址:http://www.cnblogs.com/programforjoy-yiyuan01/p/4389905.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!