浮点数怎么计算?-浮点数-数学学习资料
编辑: admin 2017-26-03
-
4
请耐心看完:
浮点数运算
假定有两个浮点数 X=Mx * 2Ex , Y=My * 2Ey
(1)加减运算
实现X±Y运算,需要如下五步:
1.1 对阶操作,即比较两个浮点数的阶码值的大小.求△E=Ex-Ey.当其不等于零时,首先应使两个数取相同的阶码值.其实现方法是,将原来阶码小的数的尾数右移|△E|位,其阶码值加上|△E|,即每右移一次尾数要使阶码加1,则该浮点数的值不变(但精度变差了).尾数右移时,对原码形式的尾数,符号位不参加移位,尾数高位补0;对补码形式的尾数,符号位要参加右移并使自己保持不变.为减少误差,可用另外的线路,保留右移过程中丢掉的一到几位的高位值,供以后舍入操作使用.
1.2 实现尾数的加(减)运算,对两个完成对阶后的浮点数执行求和(差)操作.
1.3 规格化处理,若得到的结果不满足规格化规则,就必须把它变成规格化的数,规格化处理规则如下:
\x09 当结果尾数的两个符号位的值不同时,表明尾数运算结果溢出.此时应 使结果尾数右移一位,并使阶码的值加1,这被称为向右规格化,简称右规.
\x09 当尾数的运算结果不溢出,但最高数值位与符号位同值,表明不满足规格化规则,此时应重复地使尾数左移、阶减减1,直到出现在最高数值位上的值与符号位的值不同为止,这是向左规格化的操作,简称左规.
1.4 舍入操作.在执行对阶或右规操作时,会使尾数低位上的一位或多位的数值被移掉,使数值的精度受到影响,可以把移掉的几个高位的值保存起来供舍入使用.舍入的总的原则是要有舍有入,而且尽量使舍和入的机会均等,以防止误差积累.常用的办法有"0"舍"1"入法,即移掉的最高位为1时 则在尾数末位加1;为0时则舍去移掉的数值.该方案的最大误差为2-(n+1).这样做可能又使尾数溢出,此时就要再做一次右规.另一种方法 "置1"法,即右移时,丢掉移出的原低位上的值,并把结果的最低位置成1.该方案同样有使结果尾数变大或变小两种可能.即舍入前尾数最低位已为0,使其变1,对正数而言,其值变大,等于最低位入了个1.若尾数最低位已为1,则再对其置1无实际效用,等于舍掉了丢失的尾数低位值.
1.5 判结果的正确性,即检查阶码是否溢出.浮点数的溢出是以其阶码溢出表现出来的.在加减运算真正结束前,要检查是否产生了溢出,若阶码正常,加(减)运算正常结束;若阶码下溢,要置运算结果为浮点形式的机器零,若上溢,则置溢出标志.
例15:某浮点数阶码6位(含1位符号位:阶符),补码表示,尾数10位(含1位符号位,数符),补码表示, X=2010B * 0.11011011B, Y=2100B * (-0.10101100B),求 X+Y
由已知条件,Ex=+010B,Mx = 0.11011011 B,
Ey=+100B,My =-0.10101100 B
对应补码分别为
[Ex]补=[+010B] 补=[+00010B] 补=000010B
[Mx]补= [+0.11011011 B]补=[0.110110110 B] 补=0, 110110110 B
[Ey]补=[+100B] 补=[+00100B] 补=000100B
[-Ey]补=111100B
[My]补= [-0.10101100 B]补=[-0.101011000 B] 补=1, 010101000 B
浮点表示分别为:
数符 阶码 尾数数值
[X]浮 = 0 000010 110110110
[Y]浮 = 1 000100 010101000
15_(1)对阶
[△ E]补= [Ex]补+[-Ey]补= 00 00010B + 11 11100B = 11 11110B
△E =-00010B=-2,说明X的阶码小,应使Mx右移两位,Ex加2
所以修正[X]浮 = 0 000100 001101101 10
15_(2)尾数求和
00 001101101 10
+ 11 010101000
11 100010101 10
15_(3)尾数规格化
尾数运算结果的符号位与最高数值位均为1,应执行左规处理,具体为:将尾数左移一位,符号位1位,结果为1000101011, 阶码减1变为000011.
15_(4)尾数移出位的舍入处理
左规已将对阶移出的1位有效1移入,尾数不用做舍入处理.
15_(5)判溢出,写结果
尾数已规格化且阶码符号位为00,没有溢出,最终结果为
[Ex+y]补=000011 Ex+y=+00011B
[Mx+y]补=1000101011 Mx+y=-0.111010101B
所以,X+Y = 2+0011B *(-0.111010101B)
(2)乘法运算
实现X*Y运算,需要如下三步:
2.1 尾数相乘(两个定点小数相乘)
2.2 阶码求和
2.3 结果左规、舍入
例16:某浮点数阶码3位(含1位符号位:阶符),补码表示,尾数3位(含1位符号位,数符),原码表示, X=210B * 0.1101B, Y=2-01B * (-0.1011B),求 X*Y
由已知条件,Ex=+10B,Mx = 0.1101 B,
Ey=-01B,My =-0.1011 B
对应机器数分别为:
[Ex]补=[+10B]补=010B
[Mx]原= [+0.1101 B]原=0, 1101 B
[Ey]补=[-01B]补=111B
[My]原= [-0.1011B]原=1, 1011B
机内浮点表示分别为:
数符 阶码 尾数数值
[X]浮 = 0 010 1101
[Y]浮 = 1 111 1011
16_(1)尾数相乘(Mx* My)
1.1 [ | Mx | ]原= [+0.1101 B]原=0, 1101 B
[|My | ]原= [+0.1011B]原=0, 1011B
\x09 1.2 高 位 积 乘数/低位积
Y0
00 0000 1 0 1 1
+[ Y0*|X| ]补 00 1101
00 1101
右移 00 0110 1 1 0 1
+[ Y0*|X| ]补 00 1101
01 0011
右移 00 1001 1 1 1 0
+[ Y0*|X| ]补 00 0000
00 1001
右移 00 0100 1 1 1 1
+[ Y0*|X| ]补 00 1101
01 0001
右移 00 1000 1 1 1 1
\x09 1.3 [Mx * My] 符号=[ Mx ]符号?[My]符号=0?1=1
1.4 [Mx * My] 原=1,100011110B
16_(2)阶码求和
00 10
+ 11 11
00 01
16_(3)结果左规、舍入
尾数已为规格化形式,由于数值部分职能保存4位,需对小数点后第5位进行0设1入,最终尾数原码为1,1001B
最终运算结果为:1 001 1001
所以,X*Y = 2+01B *(-0.1001B)
(3)除法运算
实现X/Y运算,需要如下三步:
3.1 尾数相除(两个定点小数相除)
3.2 阶码相减
3.3 结果规格化及舍入
例17:某浮点数阶码3位(含1位符号位:阶符),补码表示,尾数3位(含1位符号位,数符),原码表示, X=210B * 0.0011B, Y=2-01B * 0.1011B,求 X/Y
由已知条件,Ex=+10B,Mx = 0.0011 B,
Ey=-01B,My =-0.1011 B
对应机器数分别为
[Ex]补=[+10B]补=010B
[Mx]原= [+0.0011 B]原=0, 0011B
[Ey]补=[-01B]补=111B
[My]原= [-0.1011B]原=1, 1011B
机内浮点表示分别为:
数符 阶码 尾数数值
[X]浮 = 0 010 0011
[Y]浮 = 1 111 1011
17_(1)尾数相除(Mx/ My)
1.1 [ | Mx | ]原= [+0.00110000 B]原=0, 00110000 B
[|My | ]原= [+0.1011B]原=0, 1011B
[-|My | ]补= 1, 0101B
\x09 1.2 被除数高位/余数 被除数低位/商
00 0011 00000
+[-|My |]补 11 0101
11 1100 00000
左移 11 1000 00000
+[ |My |]补 00 1011
00 0011 00001
左移 00 0110 00010
+[-|My |]补 11 0101
11 1011 00010
左移 11 0110 00100
+[|My |]补 00 1011
00 0001 00101
左移 00 0010 01010
+[-|My |]补 11 0101
11 0111 01010
+[|My |]补 00 1011
00 0010
\x09 1.3 [Mx /My] 商符号=[ Mx ]符号?[My]符号=0?0=0
1.4 [Mx / My] 商原=0,1010B
17_(2)阶码相减
[-Ey]补=[+01B]补=001B
00 10
+ 00 01
00 11
17_(3)结果规格化、舍入
尾数已为规格化形式,余数过小,结果也不必舍入,
最终运算结果为:0 011 1010
所以,X*Y = 2+11B *(+0.1010B)
类似问题
类似问题1: 有关浮点数的运算程序A:doublef(intx){return1.0/x;}voidmain(){doublea,b;inti;a=f(10);b=f(10);i=a==b;printf("%d\n",i);}程序B:doublef(intx){return1.0/x;}voidmain(){doublea,b,c;inti;a=f(10);b
一致,有没有c=f(10),这一句对程序的运行根本没有影响
类似问题2: 浮点数的精度怎么计算出来的请以64为的double为例详细讲解一下64位的double可表示|1.7e-308|~|1.7e308|这里的1.7和308是怎么算出来的?为了简便以32位的float为例讲解也行![数学科目]
第一位储存符号
然后你将该数转换成二进制,用二进制的标准表示法表示
如2^6 * 1.01000111001
接下来的十一位将那个指数6加上1023(幻数)转成二进制,
然后接下来的那52位储存标准表示法的后面那些位,如上面那个例子,
后面的52位就是01000111001(后面用0填满)00000……
至于32位的,
仍然是第一位储存符号,后八位储存二进制的指数加上32位的幻数127,后23位储存二进制小数位.
例如71.3125转换成二进制的规范化表示是
+2^6 * 1.0001110101
那么,在储存中就是
0 1000101 00011101010000000000000
0表示正号
1000101是6+127后转成二进制
00011101010000000000000就是小数部分后加上0填满23个位.
至于表示范围.你知道了怎么储存数的话就可以算出来了
类似问题3: 【关于整数运算和浮点数的问题为什么一般情况下整数运算比浮点数运算更快?】百度作业帮[数学科目]
现在一般认为整数和浮点数运算差不多,都是通过硬件完成.(整数还是快点)
为什么一般情况下整数运算比浮点数运算更快?
主要是数表示的原因:
整数:正数是原码,负数是补码,加法可以直接相加,乘法也可以很快完成
浮点数:第一位是符号位,表示正负,然后是阶码(用移码表示),有若干位,最后的是尾数(用原码表示)
很明显,浮点数的加法运算首先要进行对位,就是把阶码变得一致,然后再按整数相加,最后再作调整,成为规范数,当然比整数慢了,整数就直接相加,乘法的原理也差不多,除了尾数,还要对阶码进行考虑
类似问题4: 浮点数怎么计算[数学科目]
对阶操作,即比较两个浮点数的阶码值的大小.求△E=Ex-Ey.当其不等于零你说的是CPU计算浮点的过程?如果是的话,我不记得了,这是计算机组成原理
类似问题5: 【浮点数计算有一个字长为32位的浮点数,符号位1位;阶码8位,用移码表示;尾数23位,用补码表示;基数为2.(1)最大数的二进制表示?(2)最小数的二进制表示?(3)规格化数所能表示的数的范围?正确的】百度作业帮[数学科目]
1) 阶码:11…1,尾数:0.11…1.真值:2^(2^7)*(1-2^(-23))
2) 阶码:11…1,尾数:1.00…0.真值:2^(2^7)*(-1)
3) 范围:[2^(2^7)*(-1),2^(2^7)*(1-2^(-23))].