浮点数表示方法与运算

浮点数表示方法与运算
浮点数表示方法与运算

在计算机系统的发展过程中,曾经提出过多种方法表达实数,典型的比如定点数。在定点数表达方式中,小数点位置固定,而计算机字长有限,所以定点数无法表达很大和很小的实数。最终,计算机科学发展出了表达范围更大的表达方式——浮点数,浮点数也是对实数的一种近似表达。

1.浮点数表达方式

我们知道任何一个R 进制数N 均可用下面的形式表示:N R =±S ×R ±e

其中,S—尾数,代表N 的有效数字;

R—基值,通常取2、8、16;e—阶码,代表N 的小数点的实际位置(相当于数学中的指数)。

比如一个十进制数的浮点表达1.2345×102,其中1.2345为尾数,10为基数,2为阶码。一个二进制数的浮点表达0.001001×25,0.001001为尾数,2为基数,5为阶码;同时0.001001×25也可以表示成0.100100×23,0.100100为尾数,2为基数,3为阶码。浮点数就是利用阶码e 的变化达到浮动小数点的效果,从而灵活地表达更大范围的实数。

2.浮点数的规格化

一个数用浮点表示时,存在两个问题:一是如何尽可能多得保留有效数字;二是如何保证浮点表示的唯一。

对于数0.001001×25,可以表示成0.100100×23、0.00001001×27等等,所以对于同一个数,浮点有多种表示(也就是不能唯一表示)。另外,如果规定尾数的位数为6位,则0.00001001×27会丢掉有效数字,变成0.000010×27。因此在计算机中,浮点数通常采用规格化表示方法。

当浮点数的基数R 为2,即采用二进制数时,规格化尾数的定义为:1/2<=|S|<1。若尾数采用原码(1位符号位+n 位数值)表示,[S]原=S f S 1S 2S 3…S n (S f 为符号位的数符),则满足S 1=1的数称为规格化数。即当尾数的最高有效位S 1=1,[S]原=S f 1S 2S 3…S n ,表示该浮点数为规格化数。对0.001001×25进行规格化后,表示为0.100100×23。

3.浮点数的表示范围

求浮点数的表示范围,实质是求浮点数所能表示的最小负数、最大负数、最小正数和最大正数。

图1浮点数的表示范围

由图可见,0以及处于最大负数到最小负数之间(负数区)、最小正数到最大正数之间(正数区)的数为浮点数所能正确表达的数;处于最大负数和最小正数之间(下溢区)的浮点数,由于其绝对值小于机器可表示的数值,在计算机中通常作为0来处理,称为机器0;大于最大正数或小于最小负数(上溢区)的浮点数由于其绝对值大于机器所能表示的数值,因此计算机将进行溢出处理。

4.IEEE754浮点数标准

由于不同机器所选用的基数、尾数位和阶码位长度不同,因此对浮点数的表示有很大的差别,这不利于软件在不同计算机之间的移植。为此,美国IEEE提出了一个从系统结构角度支持浮点数的表示方法,称为IEEE754标准,当今流行的计算机几乎都采用了这一标准。

在IEEE754标准中,每个浮点数均由三部分组成:符号位S、指数部分E 和尾数部分M。如下图所示。

图2IEEE754标准

IEEE754浮点数据编码标准中,32位单精度浮点数表示格式如下图所示。

图3IEEE75标准中32位单精度浮点数表示格式

各部分规定如下。

S:数符,0表示正,1表示负。

E:指数,即阶码部分。其中包括1位阶符+7位数值。采用移127码,移码值为127。

M:尾数共23位,用规格化表示。由于尾数采用规格化表示,所以IEEE754标准约定在小数点左边有一位隐含位1,从而使尾数的实际有效位为24位,即尾数的有效值为1.M。

根据上述规定可知,32位的单精度浮点数所表示的数值N为:

N=?1S×1.M×2E?127

IEEE754标准32位单精度浮点数N的解释如下:

若E=0,且M=0,则N为0。

若E=0,且M!=0,则N=(-1)S×2-126×(0.M),为非规格化数。

若1<=E<=254,则N=(-1)S×2E-127×(1.M),为规格化数。

若E=255,且M!=0,则N=NaN(非数值)。

若E=255,且M=0,则N=(-1)S×∞(无穷大)。

IEEE754标准使0有了精确表示,同时也明确地表示了无穷大。当a/0(a!=0)时得到的结果为+/-∞;当0/0时得到的结果为NaN。对于绝对值较小的数,为了避免下溢而损失精度,允许采用比最小规格化数还要小的非规格化数来表示。应该注意的是,非规格化数和正、负0的尾数M的前隐含位的值是0,不是1。

5.浮点数的精度问题

单精度浮点数以有限的32bit长度来反映无限的实数集合,因此大多数情况下都是一个近似值。

我们知道单精度浮点数的尾数是24位(包括其中的一位隐藏位)存储的。

lg224=7.22

由上计算,单精浮点数可以保证7位十进制有效数字。

6.浮点加减运算

设有两个浮点数x和y,它们的规格化表示分别为:

x=M x×2Ex

y=M y×2Ey

其中E x和E y分别为x和y的阶码,M x、M y分别为x和y的尾数,则浮点数的加减运算可表示为:

x±y=2Ex×M x±2Ey×M y=M x×2Ex?Ey±M y×2Ey Ex≤Ey

M x±M y×2Ey?Ex×2Ex(Ex>Ey)之所以要这样分类,是因为要遵循“小阶向大阶靠拢”的对阶原则,下面会有详细的解释。根据公式,可总结出浮点数运算的几个步骤:

1)0操作数检查

浮点数的运算过程比较复杂,如果能判断出两个操作数中有一个为0,那么运算结果马上可知,而不必进行后续的一系列操作,以节省运算时间。

2)对阶

两个浮点数相加减,首先要看它们的阶码是否相同,即小数点位置是否对齐。如果阶码相同,则表示小数点位置是对齐的,尾数就可以直接进行加减运算;反之若两数阶码不同,则表示小数点位置没有对齐,不能直接进行加减运算。此时,必须通过“对阶”过程使两数的阶码相同,也就是使两数的小数点位置对齐。

要对阶就要改变两数中一个数的阶码,表面上看来改变哪一个都可以。由于随着阶码的改变,尾数也要做相应的移动才能使浮点数据的值保持不变,所以如果阶码变大,尾数要右移;阶码变小,尾数要左移。尾数的左右移都会造成有效数据的移出与丢失,但是右移丢失的是最低有效位,而左移丢失的却是最高有效位。显然,右移更能减小数据误差。所以,对阶必须遵循“小阶向大阶靠拢”的原则。两数中阶码较小的那个数的阶码要变大,变成和另一个数的阶码一样,而这个数的尾数要作相应的右移,右移多少取决于阶码变大多少。阶码每增加1,尾数要相应右移1位,相当于小数点左移1位。

对阶时,一般首先求出两数阶码之差,即

△E=Ex–Ey

如果△E=0,说明两数阶码相等,无需对阶;如果△E>0,表示Ex>Ey,Ey 要向Ex靠拢,其尾数M y要做相应右移;如果△E<0,表示Ex

3)尾数相加

对阶完成后,表示两数的小数点已经对齐,可以直接进行尾数的加减运算。无论加法运算还是减法运算,都与定点数补码运算一样,按加法进行操作。要注意的是,相加过程中没有溢出,也就是对于定点数来说是溢出的结果,对于浮点数尾数相加来说是很正常的事情,所以我们常用双符号位表示尾数。

4)结果规格化

尾数相加完成之后,还需要进行规格化的判定,如果不满足规格化要求,则要对结果作规格化处理。尾数的规格化处理有两种情况:

如果尾数相加结果的两个符号位数据不相等,表明运算结果的尾数的绝对值大于1,因此要“向右规格化”。由于尾数相加的绝对值不可能超过2,因此向右规格化肯定是尾数右移1位,阶码加1。

如果尾数相加结果的符号位与数据最高位相等,表示数据没有规格化,尾数要“向左规格化”,即尾数左移n位,阶码相应减n。

5)舍入处理

在对阶和向右规格化的过程中,尾数都要向右移位,这样尾数的低位部分可能会丢失,从而造成一定的误差。为了减少误差,要进行舍入处理,常用的舍入方法有两种:

(1)0舍1入

“0舍1入”,就是指尾数右移时被丢掉的数据的最高位如果是0,那就舍去;如果是1,就在尾数的最低位加上“1”。这种方法,实际上类似于我们平时所说的“四舍五入”。

这种方法的优点是每次舍入产生的误差小,误差控制在2-(n+1)范围内,而且也不会造成误差的累积;但缺点是要进行一次“加1”运算,特殊情况下还有可能造成再次“向右规格化”的现象。

(2)恒置1

“恒置1”,就是指尾数右移时,只要发生低位数据的丢失,尾数的最低位就被设定为1。

这种方法每次舍入所产生的误差比“0舍1入”要大一点,误差控制在2-n 范围内,而且也不会造成误差的累积。其关键特点是舍入处理时无需进行加法运算,所以速度快,也不会造成再次“向右规格化”的现象。

6)溢出处理

尾数相加的溢出不是真正的溢出,可以借由向右规格化作出调整。那么,浮点数的运算会不会产生溢出?什么时候才是真正的溢出呢?

当浮点数在做向左或向右规格化的过程中,阶码也会做相应的调整,也就是说,阶码可能要加上1(向右规格化)或者减去n(向左规格化,n为尾数左移的位数)。显然,这些时候都有可能产生阶码溢出现象。

如果阶码减去n发生阶码溢出,也就是发生阶码的下溢,表示运算结果的精度超出了该浮点数可以表示的范围,也就是运算结果趋近于0。在这种情况下,机器一般认为运算结果就是0;如果阶码加上1发生阶码溢出,也就是发生阶码的上溢,表示数据超出了浮点数可表示的范围,一般认为是+∞或-∞(依赖于尾数的正负)。这种情况才是真正的溢出,机器的溢出标志会被置“1”。

综上所述,浮点数运算真正的溢出,是指在尾数相加的时候发生尾数上溢,并在向右规格化的时候使阶码也发生上溢。

7.浮点乘除法运算

设有两个浮点数x和y,它们的规格化表示分别为:

x=M x×2Ex

y=M y×2Ey

其中Ex和Ey分别为x和y的阶码,Mx、My分别为x和y的尾数。则,两数相乘为:

x×y=M x×2Ex×M y×2Ey=2Ex+Ey×M x×M y 也就是说,两个浮点数相乘的结果就是它们的阶码相加,尾数相乘。

同理,两数相除的结果为:

x/y=M x×2Ex/M y×2Ey=2Ex?Ey×M x/M y

也就是说,两个浮点数相除的结果就是它们的阶码相减,尾数相除。

这样,浮点数的乘除运算就可以转化成定点数的加、减、乘、除运算。

无论是浮点数的乘法还是除法,都可以分为下面4个运算步骤:

1.0操作数检查;

2.阶码加/减操作

3.尾数乘/除操作

4.规格化处理与舍入

数的定点表示和浮点表示

计算机处理的数值数据多数带有小数,小数点在计算机常有两种表示方法,一种是约定所有数值数据的小数点隐含在某一个固定位置上,称为定点表示法,简称定点数;另一种是小数点位置可以浮动,称为浮点表示法,简称浮点数。 1. 定点数表示法(fixed-point) 所谓定点格式,即约定机器中所有数据的小数点位置是固定不变的。在计算机常采用两种简单的约定:将小数点的位置固定在数据的最高位之前,或者是固定在最低位之后。一般常称前者为定点小数,后者为定点整数。 定点小数是纯小数,约定的小数点位置在符号位之后、有效数值部分最高位之前。若数据x的形式为x=x0.x1x2… xn(其中x0为符号位,x1~xn是数值的有效部分,也称为尾数,x1为最高有效位),则在计算机中的表示形式为: 一般说来,如果最末位xn= 1,前面各位都为0,则数的绝对值最小,即|x|min= 2-n。如果各位均为1,则数的绝对值最大,即|x|max=1-2-n。所以定点小数的表示围是:

2-n≤|x|≤1 -2-n 定点整数是纯整数,约定的小数点位置在有效数值部分最低位之后。若数据x的形式为x=x0x1x2…xn(其中x0为符号位,x1~xn是尾数,xn为最低有效位),则在计算机中的表示形式为: 定点整数的表示围是: 1≤|x|≤2n-1 当数据小于定点数能表示的最小值时,计算机将它们作0处理,称为下溢;大于定点数能表示的最大值时,计算机将无法表示,称为上溢,上溢和下溢统称为溢出。 计算机采用定点数表示时,对于既有整数又有小数的原始数据,需要设定一个比例因子,数据按其缩小成定点小数或扩大成定点整数再参加运算,运算结果,根据比例因子,还原

浮点数的表示和基本运算

浮点数的表示和基本运算 1 浮点数的表示 通常,我们可以用下面的格式来表示浮点数 S P M 其中S是符号位,P是阶码,M是尾数 对于IBM-PC而言,单精度浮点数是32位(即4字节)的,双精度浮点数是64位(即8字节)的。两者的S,P,M所占的位数以及表示方法由下表可知 S P M表示公式偏移量 1823(-1)S*2(P-127)*1.M127 11152(-1)S*2(P-1023)*1.M1023 以单精度浮点数为例,可以得到其二进制的表示格式如下 S(第31位)P(30位到 23位) M(22位到 0位) 其中S是符号位,只有0和1,分别表示正负;P是阶码,通常使用移码表示(移码和补码只有符号位相反,其余都一样。对于正数而言,原码,反码和补码都一样;对于负数而言,补码就是其绝对值的原码全部取反,然后加1.) 为了简单起见,本文都只讨论单精度浮点数,双精度浮点数也是用一样的方式存储和表示的。 2 浮点数的表示约定 单精度浮点数和双精度浮点数都是用IEEE754标准定义的,其中有一些特殊约定。 (1) 当P = 0, M = 0时,表示0。 (2) 当P = 255, M = 0时,表示无穷大,用符号位来确定是正无穷大还是负无穷大。

(3) 当P = 255, M != 0时,表示NaN(Not a Number,不是一个数)。 当我们使用.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.WriteLine(Convert.ToDouble(float.MinValue)); //-3.40282346638529E+38 Console.WriteLine(Convert.ToDouble(float.Epsilon)); // 1.40129846432482E-45 那么这些值是如何求出来的呢? 根据上面的约定,我们可以知道阶码P的最大值是11111110(这个值是254,因为255用于特殊的约定,那么对于可以精确表示的数来说,254就是最大的阶码了)。尾数的最大值是11111111111111111111111。 那么这个最大值就是:0 11111110 11111111111111111111111。 也就是 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 = 2-149 = 1.40129846432482E-45。这个数字和上面的Epsilon 是一致的。 如果我们要精确表示最接近于0的数字,它应该是 0 00000001 00000000000000000000000 也就是:2-126 * (1+0) = 1.17549435082229E-38。 3 浮点数的精度问题 浮点数以有限的32bit长度来反映无限的实数集合,因此大多数情况下都是一个近似值。同时,对于浮点数的运算还同时伴有误差扩散现象。特定精度下看似

浮点数的表示和运算(范围计算)

浮点数的表示和运算 浮点数的表示和基本运算 1 浮点数的表示 通常,我们可以用下面的格式来表示浮点数 其中S是符号位,P是阶码,M是尾数 对于IBM-PC而言,单精度浮点数是32位(即4字节)的,双精度浮点数是64位(即8字节)的。两者的S,P,M所占的位数以及表示方法由下表可知 以单精度浮点数为例,可以得到其二进制的表示格式如下 其中S是符号位,只有0和1,分别表示正负;P是阶码,通常使用移码表示(移码和补码只有符号位相反,其余都一样。对于正数而言,原码,反码和补码都一样;对于负数而言,补码就是其绝对值的原码全部取反,然后加1.) 为了简单起见,本文都只讨论单精度浮点数,双精度浮点数也是用一样的方式存储和表示的。 2 浮点数的表示约定 单精度浮点数和双精度浮点数都是用IEEE754标准定义的,其中有一些特殊约定。 (1)当P = 0, M = 0时,表示0。 (2)当P = 255, M = 0时,表示无穷大,用符号位来确定是正无穷大还是负无穷大。 (3)当P = 255, M != 0时,表示NaN(Not a Number,不是一个数)。 当我们使用.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.WriteLine(Convert.ToDouble(float.MinValue)); //-3.40282346638529E+38 Console.WriteLine(Convert.ToDouble(float.Epsilon)); // 1.40129846432482E-45 那么这些值是如何求出来的呢?

浮点数的表示和计算

《计算机组成原理》实验报告

sw $aO, O($fp) #calculate the first nu mber andi $s2, $s0, 0x80000000 # s2 is the sig n srl $s2, $s2, 31 andi $s3, $s0, 0x7f800000 # s3 is the exp onent srl $s3, $s3, 23 andi $s4, $s0, 0x007fffff # s4 is the fractio n addi $s4, $s4, 0x00800000 #calculate the seco nd number andi $s5, $s1, 0x80000000 # s5 is the sig n srl $s5, $s5, 31 andi $s6, $s1, 0x7f800000 # s6 is the exp onent srl $s6, $s6, 23 andi $s7, $s1, 0x007fffff # s7 is the fractio n addi $s7, $s7, 0x00800000 sub $t0, $s3, $s6 bit $t0, 0, sumL1 # add sub bgt $t0, 0, sumL2 # sub add beq $t0, 0, sumL3 2.减法指令如下: mysub: subu $sp, $sp, 32 sw $ra, 20($sp) sw $fp, 16($sp) addiu $fp, $sp, 28 sw $a0, 0($fp) #calculate the first nu mber andi $s2, $s0, 0x80000000 # s2 is the sig n srl $s2, $s2, 31 andi $s3, $s0, 0x7f800000 # s3 is the exp onent srl $s3, $s3, 23 andi $s4, $s0, 0x007fffff # s4 is the fractio n addi $s4, $s4, 0x00800000 #calculate the seco nd number xori $s5, $s1, 0x80000000 # s5 is the sig n srl $s5, $s5, 31 andi $s6, $s1, 0x7f800000 # s6 is the exp onent srl $s6, $s6, 23 andi $s7, $s1, 0x007fffff # s7 is the fractio n addi $s7, $s7, 0x00800000 sub $t0, $s3, $s6 blt $t0, 0, subL1 # +,- bgt $t0, 0, subL2 # -,+ beq $t0, 0, subL3 # +,+ or -,- 3.乘法指令如下: mutilStart: srl $t2, $s0, 31 srl $t3, $s1, 31 sll $t4, $s0, 1

浮点数表示方法与运算

在计算机系统的发展过程中,曾经提出过多种方法表达实数,典型的比如定点数。在定点数表达方式中,小数点位置固定,而计算机字长有限,所以定点数无法表达很大和很小的实数。最终,计算机科学发展出了表达范围更大的表达方式——浮点数,浮点数也是对实数的一种近似表达。 1.浮点数表达方式 我们知道任何一个R 进制数N 均可用下面的形式表示:N R =±S ×R ±e 其中,S—尾数,代表N 的有效数字; R—基值,通常取2、8、16;e—阶码,代表N 的小数点的实际位置(相当于数学中的指数)。 比如一个十进制数的浮点表达1.2345×102,其中1.2345为尾数,10为基数,2为阶码。一个二进制数的浮点表达0.001001×25,0.001001为尾数,2为基数,5为阶码;同时0.001001×25也可以表示成0.100100×23,0.100100为尾数,2为基数,3为阶码。浮点数就是利用阶码e 的变化达到浮动小数点的效果,从而灵活地表达更大范围的实数。 2.浮点数的规格化 一个数用浮点表示时,存在两个问题:一是如何尽可能多得保留有效数字;二是如何保证浮点表示的唯一。 对于数0.001001×25,可以表示成0.100100×23、0.00001001×27等等,所以对于同一个数,浮点有多种表示(也就是不能唯一表示)。另外,如果规定尾数的位数为6位,则0.00001001×27会丢掉有效数字,变成0.000010×27。因此在计算机中,浮点数通常采用规格化表示方法。 当浮点数的基数R 为2,即采用二进制数时,规格化尾数的定义为:1/2<=|S|<1。若尾数采用原码(1位符号位+n 位数值)表示,[S]原=S f S 1S 2S 3…S n (S f 为符号位的数符),则满足S 1=1的数称为规格化数。即当尾数的最高有效位S 1=1,[S]原=S f 1S 2S 3…S n ,表示该浮点数为规格化数。对0.001001×25进行规格化后,表示为0.100100×23。 3.浮点数的表示范围 求浮点数的表示范围,实质是求浮点数所能表示的最小负数、最大负数、最小正数和最大正数。

浮点数加减运算课件

如果一个二进制浮点数的尾数的绝对值小于1并且大于等于0.5,(1>|尾数|≥0.5),那么这个二进制浮点数就是一个规格化的浮点数。 用二进制补码表示1个规格化的浮点数,并且规格化的浮点数的尾数只有一个符号位时: 规格化的浮点数的尾数是正数时应该是0 . 1 X X X X X X X X X ……的形式 (0表示符号位,X表示0或1中的任意一个数值) 规格化的浮点数的尾数是负数时应该是1 . 0 X X X X X X X X X ……的形式 (1表示符号位,X表示0或1中的任意一个数值) 用二进制补码表示1个规格化的浮点数,并且规格化的浮点数的尾数只有两个符号位时: 规格化的浮点数的尾数是正数时应该是00 . 1 X X X X X X X X X ……的形式 (00表示符号位,X表示0或1中的任意一个数值) 规格化的浮点数的尾数是负数时应该是11 . 0 X X X X X X X X X ……的形式 (11表示符号位,X表示0或1中的任意一个数值) 两个浮点数加减法的计算结果必须规格化,如果不是规格化的数,则要通过修改阶码并同时左移或者右移尾数,使其变为规格化的数。 [例] x=2010×0.11011011,y=2100×-0.10101100,浮点数均以补码表示,阶码采用双符号位,尾数采用单符号位。求x+y 。 答: (步骤1)转换成题目中要求的浮点数格式: 浮点数x=2010×0.11011011的阶码是+010,尾数是+0.11011011 浮点数均以补码表示,所以阶码以补码表示,并且阶码采用双符号位, [x]浮的阶码=00010(00是两个符号位) 浮点数均以补码表示,所以尾数以补码表示,并且尾数采用单符号位, [x]浮的尾数=0.11011011(0是1个符号位)

浮点数的加减乘除运算步骤

设两个浮点数X=Mx※2Ex Y=My※2Ey 实现X±Y要用如下5步完成: ①对阶操作:小阶向大阶看齐 ②进行尾数加减运算 ③规格化处理:尾数进行运算的结果必须变成规格化的浮点数,对于双符号位的补码尾数来说,就必须是001×××…×× 或110×××…××的形式, 若不符合上述形式要进行左规或右规处理。 ④舍入操作:在执行对阶或右规操作时常用“0”舍“1”入法将右移出去的尾数数值进行舍入,以确保精度。 ⑤判结果的正确性:即阶码是否溢出 若阶码下溢(移码表示是00…0),要置结果为机器0; 若阶码上溢(超过了阶码表示的最大值)置溢出标志。 例题:假定X=0 .0110011*211,Y=0.1101101*2-10(此处的数均为二进制)?? 计算X+Y;解:[X]浮:0 1010 1100110 [Y]浮:0 0110 1101101 符号位阶码尾数 第一步:求阶差:│ΔE│=|1010-0110|=0100 第二步:对阶:Y的阶码小,Y的尾数右移4位 [Y]浮变为0 1010 0000110 1101暂时保存 第三步:尾数相加,采用双符号位的补码运算 00 1100110 +00 0000110 00 1101100 第四步:规格化:满足规格化要求 第五步:舍入处理,采用0舍1入法处理 故最终运算结果的浮点数格式为:0 1010 1101101, 即X+Y=+0. 1101101*210

①阶码运算:阶码求和(乘法)或阶码求差(除法) 即[Ex+Ey]移= [Ex]移+ [Ey]补 [Ex-Ey]移= [Ex]移+ [-Ey]补 ②浮点数的尾数处理:浮点数中尾数乘除法运算结果要进行舍入处理 例题:X=0 .0110011*211,Y=0.1101101*2-10 求X※Y 解:[X]浮:0 1 010 ******* [Y]浮:0 0 110 1101101 第一步:阶码相加 [Ex+Ey]移=[Ex]移+[Ey]补=1 010+1 110=1 000 1 000为移码表示的0 第二步:原码尾数相乘的结果为: 0 10101101101110 第三步:规格化处理:已满足规格化要求,不需左规,尾数不变,阶码不变。第四步:舍入处理:按舍入规则,加1进行修正 所以X※Y= 0.1010111※2+000

浮点数计算方式

2.3.4二进制转10进制及10进制转为二进制 【例2-3-4】 把二进制110.11转换成十进制数,及十进制转为二进制。 解: (110.11)2 =1×22+1×21+1×20+1×2-1+1×2-2 =4+2+0+0.5+0.25=(6.75)10 把十进制转换为二进制 解: 2 6 0 2 3 1 1 1 所以实数部分为110 0.75×(2×2-1)=0.75×2×2-1 =1×2-1+0.5×2-1 =1×2-1+1×2-2 所以结果为:(110.11)2 2.3.5 浮点数在计算机中存储形式 当前主流微机中广泛采用的IEEE754标准浮点格式。 按IEEE754标准,常用的浮点数(32位短实数)的格式如图2-3所示。

IEEE754标准浮点格式 N=2e.M (M为浮点尾数,为纯小数,e为浮点数的指数(阶码))尾数部分决定了浮点数的精度,阶码决定了表示范围32为浮点数(IEEE754标准格式0—22为尾数M,23-30为阶码E,31为符号位S),阶码用移码表示。阶码E=指数真值e+127 规格化真值x=(-1)^S*(1.M)*2^(E-127) 将(82.25)10 转换成短浮点数格式。 1)先将(82.25)10 转换成二进制数 (82.25)10 =(1010010.01)2 2)规格化二进制数(1010010.01)2 1010010.01=1.01001001×2 6 尾数M=01001001 3)计算移码表示的阶码=偏置值+阶码真值: E=127+6=133=10000101 4)以短浮点数格式存储该数 因此:符号位=0 S=0表示该数为正数 阶码=10000101 由3)可得 尾数=01001001000000000000000 由2)可得;尾数为23位, 不足在后面添15位0 所以,短浮点数代码为: 0;10000101;01001001000000000000000 表示为十六进制代码为:42A48000H

数的定点表示和浮点表示

计算机处理的数值数据多数带有小数,小数点在计算机中通常有两种表示方法,一种是约定所有数值数据的小数点隐含在某一个固定位置上,称为定点表示法,简称定点数;另一种是小数点位置可以浮动,称为浮点表示法,简称浮点数。 1. 定点数表示法(fixed-point) 所谓定点格式,即约定机器中所有数据的小数点位置是固定不变的。在计算机中通常采用两种简单的约定:将小数点的位置固定在数据的最高位之前,或者是固定在最低位之后。一般常称前者为定点小数,后者为定点整数。 定点小数是纯小数,约定的小数点位置在符号位之后、有效数值部分最高位之前。若数据x的形式为x=x0.x1x2… xn(其中x0为符号位,x1~xn是数值的有效部分,也称为尾数,x1为最高有效位),则在计算机中的表示形式为: 一般说来,如果最末位xn= 1,前面各位都为0,则数的绝对值最小,即|x|min= 2-n。如果各位均为1,则数的绝对值最大,即|x|max=1-2-n。所以定点小数的表示范围是:

2-n≤|x|≤1 -2-n 定点整数是纯整数,约定的小数点位置在有效数值部分最低位之后。若数据x的形式为x=x0x1x2…xn(其中x0为符号位,x1~xn是尾数,xn为最低有效位),则在计算机中的表示形式为: 定点整数的表示范围是: 1≤|x|≤2n-1 当数据小于定点数能表示的最小值时,计算机将它们作0处理,称为下溢;大于定点数能表示的最大值时,计算机将无法表示,称为上溢,上溢和下溢统称为溢出。 计算机采用定点数表示时,对于既有整数又有小数的原始数据,需要设定一个比例因子,数据按其缩小成定点小数或扩大成定点整数再参加运算,运算结果,根据比例因子,还原

单片机浮点数计算

在单片机应用系统的数据处理过程中,经常会遇到小数的运算问题,如求解BCD的增量算式、线性化处理等。因此,需要用二进制数来表示小数。表示小数的方法一般有两种,定点数和浮点数。定点数结构简单,与整数的运算过程相同,运算速度快。但随着所表示数的范围的扩大,其位数成倍增加,给运算和存储带来不便,而且也不能保证相对精度不变。浮点数的结构相对复杂,但它能够以固定的字节长度保持相对精度不变,用较少的字节表示很大的数的范围,便于存储和运算,在处理的数据范围较大和要求精度较高时,采用浮点数。 浮点数的概念 常用的科学计数法来表示一个十进制数如 l234.75=1.23475E3=1.23475×103 在数据很大或很小时,采用科学计数避免了在有效数字前加0来确定小数点的位置,突出了数据的有效数字的位数,简化了数据的表示。可以认为,科学计数法就是十进制数的浮点数表示方法。 在二进制效中,也可以用类似的方法来表示一个数,如 1234.75=10011010010.11(二进制)=0.1001101001011×211 一般表达式为 N=S×2p 在这种表示方法中,数值由四个部分组成,即尾数S及符号,阶码P及符号。 在二进制中,通过定义相应字节或位来表示这四部分,就形成了二进制浮点数。二进制浮点数可以有多种不同的表示方法,下面是一种常见的三字节浮点数的格式: 其中尾数占16位,阶码占6位,阶符占1位,数符占1位。阶码通常用补码来表示。 在这种表示方法中,小数点的实际位置要由阶码来确定,而阶码又是可变的,因此称为浮点数。 1234.75用这种格式的浮点数表示就是: 0000 1011 1001 1010 0101 1000 用十六进制表示为 1234.75=0B9A58H -1234.75=4B9A58H 0.171875=043B00H -0.171875=443B00H 三字节浮点数所能表示的最大值为 1×263=9.22×1018 能表示的最小数的绝对值为 0.5×2-63=5.42×10-20 其所表示的数的绝对值范围=(5.42×10-20~9.22×1018),由此可以看到,比三字节定点数表示的数的范围大得多。 按同样方法可以定义一个四字节的浮点数,以满足更高精度的需要。 规格化浮点数 同一个数用浮点数表示可以是不同的,如 1234.75=0B9A58H=0C4D2CH=0D2696H 虽然这几种表示其数值是相同的,但其尾数的有效数字的位数不同,分别为16位、15位和14位。在运算过程中,为了最大限度地保持运算精度,应尽量增加尾数的有效位数。这就需要对浮点数进行规格化处理。 在只考虑用二进制原码表示尾数时,尾数的最高位为l,则该浮点数为规格化浮点数。在规格化浮点数中,用尾数为0和最小阶码表示0,三字节规格化浮点数的0表示为410000H。 浮点数在运算之前和运算之后都要进行规格化,规格化过程包括以下步骤: (1)首先判断尾是否为0,如果为0,规格化结果为410000H; (2)如果尾数不为0,判断层数的最高位是否为1,如果不为1,尾数左移,阶码减1; (3)再判断层数的最高位是否为1,如果不为1,继续进行规格化操作,如果为1,则规格化结束。 浮点数运算

浮点数的加减法运算

计算机组成与结构 之 浮点数的加减法运算 学生组所在学院:燕山大学信息学院 学生组所在班级:2014级计算机1 班 学生组姓名:陈朝俊张海傅晓欣曲佳彤

地址:中国河北省秦皇岛市河北大街438号邮编:066004 电话: 传真: 网址:

浮点数加减法运算简介 大型计算机和高档微型机中,浮点加减法运算是由硬件完成的。低档的微型机浮点加减法运算是由软件完成的,但不论用硬件实现还是软件实现,基本原理是一致的。 浮点加减法运算要经过对阶、尾数加减运算、结果规格化、舍入处理、溢出判断五步操作。其中尾数运算与定点加减法运算相同,而对阶、规格化、舍入和溢出判断,则是浮点加减法运算和定点加减法运算不同的操作之处。 在补码浮点运算中,阶码与尾数可以都用补码表示。在硬件实现的运算中,阶码和数符常采用双符号位。 浮点数的表示形式 浮点数的表示形式(假设以2为底): N=M·2E 其中,M为浮点数的尾数,一般为绝对值小于1的规格化二进制小数,用原码或补码形式表示;E为浮点数的阶码,一般是用移码或补码表示的整数。 阶码的底除了2以外,还有用8或16表示的,这里暂且只以2为底进行讨论。

浮点数加减法运算的步骤 设两浮点数X、Y进行加减运算,其中:X=M X·2EX,Y=M Y·2EY 一般由以下五个步骤完成:

规 格 化 浮 点 数 加 减 运 算 流 程 一、对阶 1.对阶是指将两个进行运算的浮点数的阶码对齐的操作。对阶的目

的是为了使两个浮点数的尾数能够进行加减运算。因为,当进行MX·2EX 与MY·2EY加减运算时,只有使两浮点数的指数值部分相同,才能将相同的指数值作为公因数提出来,然后进行尾数的加减运算。 2.对阶的具体方法是:首先求出两浮点数阶码的差,即ΔE=Ex-Ey,将小阶码加上ΔE,使之与大阶码相等,同时将小阶码对应的浮点数的尾数右移ΔE位,以保证该浮点数的值不变。 3.几点注意: (1)对阶的原则是小阶对大阶,因为若大阶对小阶,则尾数的数值部分的高位需移出,而小阶对大阶移出的是尾数的数值部分的低位,这样损失的精度更小。 (2)若ΔE=0,说明两浮点数的阶码已相同,无需再做对阶操作。(3)尾数右移时,对原码表示的尾数,符号位不参加移位,尾数数值部分的高位补0;对补码表示的尾数,符号位参加右移,并保持原符号位不变。 (4)由于尾数右移时是将最低位移出,会损失一定的精度,为减少误差,可先保留若干移出的位,供以后舍入处理用。 二、尾数的加减运算

浮点数计算实例

浮点数表示法示例 目前C/C++编译器标准都遵照IEEE制定的浮点数表示法来进行float,double运算。这种结构是一种科学计数法,用符号、指数和尾数来表示,底数定为2——即把一个浮点数表示为尾数乘以2的指数次方再添上符号。下面是具体的规格: 符号位阶码尾数长度 float 1 8 23 32 double 1 11 52 64 通通表示为1.f * 2^n 因为浮点数中的小数部分= x1*1/2 + x2*1/4 + .....+xn*1/(2^n)来近似,所有这就是浮点数的精度问题。 以下通过几个例子讲解浮点数如何转换为二进制数 例一: 已知:double类型38414.4。 求:其对应的二进制表示。 分析:double类型共计64位,折合8字节。由最高到最低位分别是第63、62、61、……、0位: 最高位63位是符号位,1表示该数为负,0表示该数为正; 62-52位,一共11位是指数位; 51-0位,一共52位是尾数位。 步骤:按照IEEE浮点数表示法,下面先把38414.4转换为十六进制数。 把整数部和小数部分开处理:整数部直接化十六进制:960E。小数的处理: 0.4=0.5*0+0.25*1+0.125*1+0.0625*0+…… 实际上这永远算不完!这就是著名的浮点数精度问题。所以直到加上前面的整数部分算够53位就行了。隐藏位技术:最高位的1不写入内存(最终保留下来的还是52位)。 如果你够耐心,手工算到53位那么因该是:38414.4(10)=1001011000001110.0110011001100110011001100110011001100 ...... 1100110011001101...... (2) 科学记数法为:1.001011000001110 0110011001100110011001100110011001100,右移了15位,所以指数为15。或者可以如下理解: 1.001011000001110 0110011001100110011001100110011001100×2^15 于是来看阶码,按IEEE标准一共11位,可以表示范围是-1024 ~ 1023。因为指数可以为负,为了便于计算,规定都先加上1023(2^10-1),在这里,阶码:15+1023=1038。二进制表示为:100 00001110; 符号位:因为38414.4为正对应为0; 合在一起(注:尾数二进制最高位的1不要): 0 1000000 1110 0010 11000001 110 01100 11001100 11001100 11001100 11001100 例二:已知:整数3490593(16进制表示为0x354321)。求:其对应的浮点数3490593.0的二进制表示。 解法如下: 先求出整数3490593的二进制表示: H: 3 5 4 3 2 1 (十六进制表示) B: 0011 0101 0100 0011 0010 0001 (二进制表示) │←──────21─────→│ 即:1.1010101000011001000012×221 可见,从左算起第一个1后有21位,我们将这21为作为浮点数的小数表示,单精度浮点数float由符号位1位,指数域位k=8位,小数域位(尾数)n=23位构成,因此对上面得到的21位小数位我们还需要补上2个0,得到浮点数的小数域表示为: 1 0101 0100 0011 0010 0001 00

浮点数加法运算

浮点加减运算 对任意一个二进制数N,总可以表示成:N=2E×M ,式中,E为数N的阶码,M称为数N的尾数,一般为绝对值小于1的规格化数(补码是允许为-1)。 两浮点数X,Y进行加减运算时,必须按以下几步执行: ①对阶,使两数的小数点位置对齐,小的阶码向大的阶码看齐。 ②尾数求和,将对阶后的两尾数按定点加减运算规则求和(差)。 ③规格化,为增加有效数字的位数,提高运算精度,必须将求和(差)后的尾数规格化。 ④舍入,为提高精度,要考虑尾数右移时丢失的数值位。 ⑤判断结果,即判断结果是否溢出。 规格化又分左规和右规两种 (1) 左规。当尾数出现00.0××…×或11.1××…×时,需左规。左规时尾数左移一位,阶码减1,直到符合补码规格化表示式为止(2) 右规。当尾数出现01.××…×或10.××…×时,表示尾数溢出,这在定点加减运算中是不允许的,但在浮点运算中这不算溢出,可 通过右规处理。右规时尾数右移一位,阶码加1. 例,两浮点数x=2+010 ×0.110100,y=2+100 ×(-0.101010),求x+y。 解:阶码取3位,尾数取6位(均不包括符号位),机器表示的形式分别为[x]补= 0010 0110100 [y]补= 0100 1010110 ①对阶:先求阶差(两阶码的补码相减) 00 010 + 11 100 (减00 100 就是加—00100的补码,即11 100) 11 110 其真值为-2,即x的阶码比y的阶码小2 [x] 补的阶码增大成0100,尾数右移两位,即[x] 补 = 0100 0001101 ②尾数相加 00.001101 + 11.010110 11.100011 相加结果为0100 1 100011 ③规格化: 最高有效位与符号位相同,需要左规,所以结果应为: [x+y] 补 = 0011 1 000110 x+y = 2+011 ×(-0.111010) 4.舍入 在对阶和右规的过程中,可能会将尾数的低位丢失,引起误差,影响了精度,为此可用舍入法来提高尾数的精度。常用的舍入方法有三种。

第二章 浮点数的表达与运算

浮点数的表示与运算 一、选择 1、在规格化浮点数运算中,若浮点数为25×1.10101,其中 尾数为补码表示,则该数需将尾数左移一位规格化 2、浮点数格式如下:1位阶符,6位阶码,1位数符,8位 尾数。若阶码用移码,尾数用补码表示,则浮点数所能表示数的范围是-263 ~(1-2-8)×263 3、某浮点机,采用规格化浮点数表示,阶码用移码表示(最 高位代表符号位),尾数用原码表示。下列哪个数的表示不是规格化浮点数?(B ) 阶码尾数 A.,1.1000 (00) B.,1.0111 (01) C.,0.1111 (01) D.,0.1000 (10) 4、设浮点数阶的基数为8,尾数用模4补码表示。试指出下 列浮点数中哪个是规格化数?(C ) A.11. B.00. C.11. D.11. 5、按照IEEE654标准规定的32位浮点数(41A4C000)16对 应的十进制数是(D ) A.4.59375 B.-20.59375 C.-4.59375 D.20.59375 6、如果某单精度浮点数、某原码、某补码、某移码的32位 机器数为0xF。这些数从大到小的顺序是移>补>原>浮 7、假定采用IEEE754标准中的单精度浮点数格式表示一个数 为H,则该数的值是(+1.125)10×211 8、设浮点数共12位。其中阶码含1位阶符共4位,以2为 底,补码表示:尾数含1位数符共8位,补码表示,规格化。则该浮点数所能表示的最大正数是27-1 9、如果浮点数的尾数用补码表示,则下列(D )中的尾数 是规格化数形式。 A. 1.11000 B. 0.01110 C. 0.01010 D.1.00010 10、设浮点数的基数为4,尾数用原码表示,则以下(C ) 是规格化的数。 A. 1. B.0. C.1. D.0. 11、已知X=00.875×21,Y=0.625×22,设浮点数格式为阶符1位,阶码2位,数符1位,尾数3位,通过补码求出Z=X-Y 的二进制浮点数规格化结果是0111 011 12、IEEE754标准中的舍入模式可以用于二进制数也可以用于 十进制数,在采用舍入到最接近且可表示的值时,若要舍入两个有效数字形式,(12.5)D应该舍入为12 13、下列关于舍入的说法,正确的是(E ) A.不仅仅只有浮点数需要舍入,定点数在运算时也可能要 舍入 B. 在浮点数舍入中,只有左规格化时可能要舍入 C. 在浮点数舍入中,只有右规格化时可能要舍入 D. 在浮点数舍入中,左、右规格化均可能要舍入

浮点数的加减运算一般由以下五个步骤完成

浮点数的加减运算一般由以下五个步骤完成: 对阶 ↓ 尾数运算 ↓ 结果规格化 ↓ 舍入处理 ↓ 溢出判断 设两浮点数X、Y进行加减运算,其中 X=M x·2Ex,Y=M y·2Ey 1. 对阶 所谓对阶是指将两个进行运算的浮点数的阶码对齐的操作。对阶的目的是为使两个浮点数的尾数能够进行加减运算。因为,当进行M x·2Ex与M y·2Ey加减运算时,只有使两浮点数的指数值部分相同,才能将相同的指数值作为公因数提出来,然后进行尾数的加减运算。 对阶的具体方法是:首先求出两浮点数阶码的差,即⊿E=E x-E y,将小阶码加上⊿E,使之与大阶码相等,同时将小阶码对应的浮点数的尾数右移相应位数,以保证该浮点数的值不变。几点注意: (1)对阶的原则是小阶对大阶,之所以这样做是因为若大阶对小阶,则尾数的数值部分的高位需移出,而小阶对大阶移出的是尾数的数值部分的低位,这样损失的精度更小。 (2)若⊿E=0,说明两浮点数的阶码已经相同,无需再做对阶操作了。 (3)采用补码表示的尾数右移时,符号位保持不变。 (4)由于尾数右移时是将最低位移出,会损失一定的精度,为减少误差,可先保留若干移出的位,供以后舍入处理用。 2. 尾数运算 尾数运算就是进行完成对阶后的尾数相加减。这里采用的就是我们前面讲过的纯小数的定点数加减运算。 3. 结果规格化 在机器中,为保证浮点数表示的唯一性,浮点数在机器中都是以规格化形式存储的。对于IEEE754标准的浮点数来说,就是尾数必须是1.M的形式。由于在进行上述两个定点小数的尾数相加减运算后,尾数有可能是非规格化形式,为此必须进行规格化操作。 规格化操作包括左规和右规两种情况。 左规操作:将尾数左移,同时阶码减值,直至尾数成为1.M的形式。例如,浮点数0.0011·25是非规格化的形式,需进行左规操作,将其尾数左移3位,同时阶码减3,就变成1.1100·22规格化形式了。 右规操作:将尾数右移1位,同时阶码增1,便成为规格化的形式了。要注意的是,右规操作只需将尾数右移一位即可,这种情况出现在尾数的最高位(小数点前一位)运算时出现了进位,使尾数成为10.xxxx或11.xxxx的形式。例如,10.0011·25右规一位后便成为1.00011·26的规格化形式了。 4. 舍入处理

相关文档
最新文档