浮点数的表示和基本运算

上传人:jiups****uk12 文档编号:39282768 上传时间:2018-05-14 格式:DOC 页数:5 大小:61.50KB
返回 下载 相关 举报
浮点数的表示和基本运算_第1页
第1页 / 共5页
浮点数的表示和基本运算_第2页
第2页 / 共5页
浮点数的表示和基本运算_第3页
第3页 / 共5页
浮点数的表示和基本运算_第4页
第4页 / 共5页
浮点数的表示和基本运算_第5页
第5页 / 共5页
亲,该文档总共5页,全部预览完了,如果喜欢就下载吧!
资源描述

《浮点数的表示和基本运算》由会员分享,可在线阅读,更多相关《浮点数的表示和基本运算(5页珍藏版)》请在金锄头文库上搜索。

1、浮点数的表示和基本运算浮点数的表示和基本运算 1 1 浮点数的表示浮点数的表示通常,我们可以用下面的格式来表示浮点数SPM其中 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位)M(22位到0位)其中 S 是符号位,只有0和1,分别表示正负;P 是阶码

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

3、) 。当我们使用.Net Framework 的时候,我们通常会用到下面三个常量Console.WriteLine(float.MaxValue); / 3.402823E+38 Console.WriteLine(float.MinValue); /-3.402823E+38 Console.WriteLine(float.Epsilon); / 1.401298E-45 /如果我们把它们转换成双精度类型,它们的值如下 Console.WriteLine(Convert.ToDouble(float.MaxValue); / 3.40282346638529E+38 Console.Writ

4、eLine(Convert.ToDouble(float.MinValue); /-3.40282346638529E+38 Console.WriteLine(Convert.ToDouble(float.Epsilon); / 1.40129846432482E-45那么这些值是如何求出来的呢?根据上面的约定,我们可以知道阶码 P 的最大值是11111110(这个值是254,因为255用于 特殊的约定,那么对于可以精确表示的数来说,254就是最大的阶码了) 。尾数的最大值是 11111111111111111111111。那么这个最大值就是:0 11111110 1111111111111

5、1111111111。也就是 2(254-127)* (1.11111111111111111111111)2= 2127* (1+1-2-23) = 3.40282346638529E+38从上面的双精度表示可以看出,两者是一致的。最小的数自然就是- 3.40282346638529E+38。对于最接近于0的数,根据 IEEE754的约定,为了扩大对0值附近数据的表示能力,取阶码 P = -126,尾数 M = (0.00000000000000000000001)2 。此时该数的二进制表示为:0 00000000 00000000000000000000001也就是2-126* 2-23=

6、 2-149 = 1.40129846432482E-45。这个数字和上面的 Epsilon 是一致的。如果我们要精确表示最接近于0的数字,它应该是 0 00000001 00000000000000000000000也就是:2-126* (1+0) = 1.17549435082229E-38。 3 3 浮点数的精度问题浮点数的精度问题浮点数以有限的32bit 长度来反映无限的实数集合,因此大多数情况下都是一个近似值。 同时,对于浮点数的运算还同时伴有误差扩散现象。特定精度下看似相等的两个浮点数可 能并不相等,因为它们的最小有效位数不同。由于浮点数可能无法精确近似于十进制数,如果使用十进制数

7、,则使用浮点数的数学或比 较运算可能不会产生相同的结果。如果涉及浮点数,值可能不往返。值的往返是指,某个运算将原始浮点数转换为另一种格 式,而反向运算又将转换后的格式转换回浮点数,且最终浮点数与原始浮点数相等。由于 一个或多个最低有效位可能在转换中丢失或更改,往返可能会失败。 4 4 将浮点数表示为二进制将浮点数表示为二进制4.14.1 无小数的浮点数转换成二进制表示无小数的浮点数转换成二进制表示首先,我们用一个不带小数的浮点数来说明如何将一个浮点数转换成二进制表示。假设要 转换的数据是45678.0f。在处理这种不带小数的浮点数时,直接将整数部分转化为二进制表示:10110010011011

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

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

10、数字 是按上面二进制串的倒序存储的。要知道 CPU 是不是 little endian 的也很容易。BitConverter.IsLittleEndian; 4.24.2 含小数的浮点数表示为二进制含小数的浮点数表示为二进制对于含小数的浮点数,会有精度的问题,下面举例说明。假设要转换的小数为123.456f。对于这种带小数的就需要把整数部和小数部分开处理。对于整数部分的处理不再赘述,直 接化成二进制为:100100011。小数部份的处理比较麻烦一些,我们知道,使用二进制表示 只有0和1,那么对于小数就只能用下面的方式来表示:a1*2-1+a2*2-2+a3*2-3+.+an*2-n其中 a1等

11、数可以是0或者1,从理论上将,使用这种表示方法可以表示一个有限的小数。但 是尾数只能有23位,那么就必然会带来精度的问题。在很多情况下,我们只能近似地表示小数。来看0.456这个十进制纯小数,该如何表示成二 进制呢?一般说来,我们可以通过乘以2的方法来表示。首先,把这个数字乘以2,小于1,所以第一位为0,然后再乘以2,大于1,所以第二位为 1,将这个数字减去1,再乘以2,这样循环下去,直到这个数字等于0为止。在很多情况下,我们得到的二进制数字都大于23位,多于23位的就要舍去。舍入原则是0舍 1入。通过这样的办法,我们可以得到二进制表示:1111011.01110100101111001。现在

12、开始向左移小数点,一共移了6位,这时候尾数为:1.11101101110100101111001,阶 码为6加上127得131,二进制表示为:10000101,那么总的二进制表示为:0 10000101 11101101110100101111001表示成十六进制是:42 F6 E9 79由于 CPU 是 Little Endian 的,所以在内存中表示为:79 E9 F6 42。4.34.3 将纯小数表示成二进制将纯小数表示成二进制对于纯小数转化为二进制来说,必须先进行规格化。例如0.0456,我们需要把它规格化, 变为1.xxxx * (2n )的形式,要求得纯小数 X 对应的 n 可用下

13、面的公式: n = int( 1 + log 2X )0.0456我们可以表示为1.4592乘以以2为底的-5次方的幂,即1.4592 * ( 2-5 )。转化为这 样形式后,再按照上面处理小数的方法处理,得到二进制表示1. 01110101100011100010001去掉第一个1,得到尾数01110101100011100010001阶码为:-5 + 127 = 122,二进制表示为0 01111010 01110101100011100010001最后转换成十六进制 11 C7 3A 3D5 5 浮点数的数学运算浮点数的数学运算5.15.1 浮点数的加减法浮点数的加减法 设两个浮点数 X

14、=Mx*2Ex ,Y=My*2Ey 实现 XY 要用如下5步完成:(1)对阶操作:小阶向大阶看齐 (2)进行尾数加减运算 (3)规格化处理:尾数进行运算的结果必须变成规格化的浮点数,对于双符号位(就是使 用00表示正数,11表示负数,01表示上溢出,10表示下溢出)的补码尾数来说,就必须是 001 或110的形式 若不符合上述形式要进行左规或右规处理。 (4)舍入操作:在执行对阶或右规操作时常用“0”舍“1”入法将右移出去的尾数数值进 行舍入,以确保精度。 (5)判结果的正确性:即检查阶码是否溢出若阶码下溢(移码表示是000) ,要置结果为机器0; 若阶码上溢(超过了阶码表示的最大值)置溢出标

15、志。现在用一个具体的例子来说明上面的5个步骤例题:假定 X=0 .0110011*211,Y=0.1101101*2-10(此处的数均为二进制) , 计算 X+Y;首先,我们要把这两个数变成2进制表示,对于浮点数来说,阶码通常用移码表示,而尾数 通常用补码表示。要注意的是-10的移码是00110X浮: 0 1 010 1100110Y浮: 0 0 110 1101101符号位 阶码 尾数(1)求阶差:E=|1010-0110|=0100(2)对阶:Y 的阶码小,Y 的尾数右移4位Y浮变为 0 1 010 0000110 1101暂时保存 (3)尾数相加,采用双符号位的补码运算 00 11001

16、10 +00 0000110 00 1101100(4)规格化:满足规格化要求 (5)舍入处理,采用0舍1入法处理故最终运算结果的浮点数格式为: 0 1 010 1101101即 X+Y=+0. 1101101*210 5.25.2 浮点数的乘除法浮点数的乘除法(1)阶码运算:阶码求和(乘法)或阶码求差(除法)即 Ex+Ey移= Ex移+ Ey补 Ex-Ey移= Ex移+ -Ey补 (2)浮点数的尾数处理:浮点数中尾数乘除法运算结果要进行舍入处理例题:X=0 .0110011*211,Y=0.1101101*2-10 求 X*Y解:X浮: 0 1 010 1100110Y浮: 0 0 110 1101101(1)阶码相加 Ex+Ey移=Ex移+Ey补=1 010+1 110=1 000 1 000为移码表示的0(2)原码尾数相乘的结果为: 0 10101

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号