浮点数的表示和基本运算_第1页
浮点数的表示和基本运算_第2页
浮点数的表示和基本运算_第3页
浮点数的表示和基本运算_第4页
浮点数的表示和基本运算_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、浮点数的表示和基本运算1浮点数的表示通常,我们可以用下面的格式来表示浮点数SP其中S是符号位,P是阶码,M是尾数对于IBM-PC而言,单精度浮点数是32位(即4字节)的,双精度浮点数是64位(即8字节)的。两者的S, P, M所占的位数以及表示方法由下表可知SPM表示公式偏移量1823(-1)S*2 (P-127)*1.M12711152(-1)S*2 (P-1023) *1.M1023以单精度浮点数为例,可以得到其二进制的表示格式如下S (第31位)P (30位到23位)W(22位到0位)其中S是符号位,只有0和1,分别表示正负;P是阶码,通常使用移码表示(移码和补码只有符号位相反,其余都一

2、样。对于正数而言,原码,反码和补码都一样;对于负数而言,补码就是其绝对值的原码全部取反,然后加1) 为了简单起见,本文都只讨论单精度浮点数,双精度浮点数也是用一样的方式存储 和表示的。2浮点数的表示约定单精度浮点数和双精度浮点数都是用IEEE754标准定义的,其中有一些特殊约定。(1) 当 P = 0, M 二 0 时,表示 0。(2) 当P二255, M二0时,表示无穷大,用符号位来确定是正无穷大还是负无 穷大。(3) 当 F 二 255, M !二 0 时,表示 NaN (Not a Number,不是一个数)。当我们使用Net Framework的时候,我们通常会用到下面三个常量Cons

3、ole. WriteLine(float. MaxValue); / 3. 402823E+38Console. WriteLine(float. MinValue);/-3. 402823E+38Console. WriteLine(float. Epsilon);/1.401298E-45如果我们把它们转换成双精度类型,它们的值如下Console. WriteLine(Convert ToDouble(float MaxValue); /3. 40282346638529E+38Console. WriteLine(Convert ToDouble(float MinValue);/- 3

4、.40282346638529E+38/1.401Console. WriteLine(Convert. ToDouble(float. Epsilon);29846432482E-45那么这些值是如何求出来的呢?根据上面的约定,我们可以知道阶码P的最大值是11111110 (这个值是254,因为2亦用于特殊的约定,那么对于可以精确表示的数来说,254就是最大的阶码T)。尾数的最大值是uiiio那么这个最大值就是:0 11111110 lllllo也就是 2(254-127)* (1. 11111)2= 2127* (1+1-2-23) = 3. 40282346638529E+38从上面的双

5、精度表示可以看出,两者是一致的。最小的数自然就是-3.40282346638329E+38。对于最接近于0的数,根据IEEE754的约定,为了扩大对0值附近数据的表示能 力,取阶码P二-126,尾数M二(0. 00001)2 o此时该数的二进制表示为:0 00000000 00001也就是 2-126* 2-23= 2-149 = 1. 40129846432482E-45。这个数字和上面的 Epsilon是一致的。如果我们要精确表示最接近于0的数字,它应该是0 00000001 00000也就是:2-126* (1+0)=1.229E-38。3浮点数的精度问题 浮点数以有限的32bit长度来

6、反映无限的实数集合,因此大多数情况下都是一个近 似值。同时,对于浮点数的运算还同时伴有误差扩散现象。特定精度下看似相等的 两个浮点数可能并不相等,因为它们的最小有效位数不同。山于浮点数可能无法精确近似于十进制数,如果使用十进制数,则使用浮点数的数 学或比较运算可能不会产生相同的结果。如果涉及浮点数,值可能不往返。值的往返是指,某个运算将原始浮点数转换为另 一种格式,而反向运算乂将转换后的格式转换回浮点数,且最终浮点数与原始浮点 数相等。由于一个或多个最低有效位可能在转换中丢失或更改,往返可能会失败。4将浮点数表示为二进制4.1无小数的浮点数转换成二进制表示首先,我们用一个不带小数的浮点数来说明

7、如何将一个浮点数转换成二进制表示。 假设要转换的数据是45678. Ofo在处理这种不带小数的浮点数时,直接将整数部分转化为二进制表示:0.0,这时要加上一位默认的1 (这是因为按照浮点数规格化的要求,尾数必须化 成1.M的格式),那么可以表示成:10.0。然后将小数点向左移,一直移到离最高位只有1位,也就是1.0, 共移动了 16 位,我们知道,左移位表示乘法,右移位表示除法。所以原数就等于这样:1.0 * (216 )。现在尾数和指数都出来了。因为最高位的1是根据标准加上去的,只是为了满足规格化的要求,这时候需要把这个1去掉。尾数的二进制就变成了: 0。最后在尾数的后面补0, 直到补够23

8、位,就是:00000o再回来看指数,根据前面的定义,P-127二16,那么P二143,表示成二进制就是: lOOOllllo45678. Of这个数是正的,所以符号位是0,那么我们按照前面讲的格式把它拼起 来,就是:0 10001111 00000c这就是45678. Of这个数的二进制表示,如果我们要得到16进制的表示,非常简 单,我们只需要把这个二进制串4个一组,转换成16进制数就可以了。但是要注 意的是x86架构的CPU都是Little Endian的(也就是低位字节在前,高位字节在 后),所以在实际内存中该数字是按上面二进制串的倒序存储的。要知道CPU是不 是little endian

9、的也很容易。BitConverter. IsLittleEndian;4.2含小数的浮点数表示为二进制对于含小数的浮点数,会有精度的问题,下面举例说明。假设要转换的小数为123. 456f o对于这种带小数的就需要把整数部和小数部分开处理。对于整数部分的处理不再赘 述,直接化成二进制为:100100011c小数部份的处理比较麻烦一些,我们知道, 使用二进制表示只有0和1,那么对于小数就只能用下面的方式来表示:al*2l+a2*22+a3*2-3+an*2-n其中di等数可以是0或者1,从理论上将,使用这种表示方法可以表示一个有限 的小数。但是尾数只能有23位,那么就必然会带来精度的问题。在很多

10、情况下,我们只能近似地表示小数。来看0.456这个十进制纯小数,该如何 表示成二进制呢? 一般说来,我们可以通过乘以2的方法来表示。首先,把这个数字乘以2,小于1,所以第一位为0,然后再乘以2,大于1,所以 第二位为1,将这个数字减去1,再乘以2,这样循环下去,直到这个数字等于0 为止。在很多情况下,我们得到的二进制数字都大于23位,多于23位的就要舍去。舍入 原则是0舍1入。通过这样的办法,我们可以得到二进制表示:1111011. Olo现在开始向左移小数点,一共移了 6位,这时候尾数为:1.11001,阶码为6加上 127得131,二进制表示为:10000101,那么总的二进制表示为:0

11、10000101 11001表示成十六进制是:42 F6 E9 79由于CPU是Little Endian的,所以在内存中表示为:79 E9 F6 42。4. 3将纯小数表示成二进制对于纯小数转化为二进制来说,必须先进行规格化。例如0.0456,我们需要把它 规格化,变为1. xxxx * (2n )的形式,要求得纯小数X对应的n可用下面的公 式:n = int( 1 + log 2X )0. 0456我们可以表示为1. 4592乘以以2为底的-5次方的幕,即1. 4592 * ( 2-5 )。转化为这样形式后,再按照上面处理小数的方法处理,得到二进制表示1. 10001去掉第一个1,得到尾数

12、10001阶码为:-5 + 127 = 122,二进制表示为0 01111010 10001最后转换成十六进制11 C7 3A 3D5浮点数的数学运算5. 1浮点数的加减法设两个浮点数X二Mx*2Ex , Y=My*2Ey实现XY要用如下5步完成:(1)对阶操作:小阶向大阶看齐(2)进行尾数加减运算(3)规格化处理:尾数进行运算的结果必须变成规格化的浮点数,对于双符号位(就是使用00表示正数,11表示负数,01表示上溢出,10表示下溢出)的补码 尾数来说,就必须是001X X X-X X 或 11OX X X-X X 的形式若不符合上述形式要进行左规或右规处理。(4)舍入操作:在执行对阶或右规

13、操作时常用“0”舍“1”入法将右移出去的尾 数数值进行舍入,以确保精度。(5)判结果的正确性:即检查阶码是否溢出若阶码下溢(移码表示是00-0),要置结果为机器0;若阶码上溢(超过了阶码表示的最大值)置溢出标志。现在用一个具体的例子来说明上面的5个步骤例题:假定X=0 .0110011*211, Y=0.1101101*2-10 (此处的数均为二进制),计算 X+Y;首先,我们要把这两个数变成2进制表示,对于浮点数来说,阶码通常用移码表 示,而尾数通常用补码表示。要注意的是T0的移码是00110X 浮:01 010 *Y浮:00 110 1101101符号位阶码尾数(1)求阶差:| AE | =11010-0110 二0100(2)对阶:Y的阶码小,Y的尾数右移4位Y浮变为0 1 010 * 1101暂时保存(3)尾数相加,采用双符号位的补码运算00 1100110 +00 000011000 1101100(4)规格化:满足规格化要求(5)舍入处理,采用0舍1入法处理故最终运算结果的浮点数格式为:0 1 010 *即 X+Y二+0. 1101101*2105. 2浮点数的乘除法(1)阶码运算:阶码求和(乘法)或阶码求差(除法)即Ex+Ey移二Ex移 + Ey补Ex-Ey移二Ex移 +-Ey补(2)浮点数的尾数处理:浮点数中尾数乘除法运算结果要进行舍入处理例题:X=0 .0110

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论