版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Chapter3算术运算Chapter3—ArithmeticforComputers—2算术运算整数运算加减法乘除法溢出处理浮点运算浮点表示
操作
§3.1IntroductionChapter3—ArithmeticforComputers—3整数加法例子:7+6§3.2AdditionandSubtraction结果超出表示范围就会发生溢出(定义)正数和负数相加,不会溢出两个正数相加符号位为1,表示发生溢出两个负数相加符号位为0,表示发生溢出Chapter3—ArithmeticforComputers—4整数减法减法:加上加数的负值例如:7–6=7+(–6) +7: 00000000…00000111
–6: 11111111…11111010
+1: 00000000…00000001结果超出范围就会溢出相同同符号位相减,不会溢出一个负数减去一个正数符号位为0,表示发生溢出一个正数减去一个负数符号位为1,表示发生溢出FACiAiBiSiCi+1来自低位的进位加数加数向高位产生的进位和全加器逻辑符号(不考虑进位是半加器)输入输出AiBiCiCi+1Si0000000101010010111010001101101101011111如何判断溢出在什么情况下可能产生溢出?例.数A有4位尾数,1位符号SA
数B有4位尾数,1位符号SB
符号位参加运算结果符号Sf符号位进位Cf尾数最高位进位CA:01110B:00111S:1001111正确0001100010(1)A=3B=23+2:00101(2)A=10B=710+7:010100011110001正溢正确负溢正确正确(3)A=-3B=-2-3+(-2):110111110111110(4)A=-10B=-7-10+(-7):011111011011001(5)A=6B=-46+(-4):000100011011100(6)A=-6B=4-6+4:111101101000100(2)A=10B=710+7:01010
0011110001(4)A=-10B=-7-10+(-7):0111110110110011.硬件判断逻辑一(SA、SB与Sf的关系)溢出=SASBSfSASfSB2.硬件判断逻辑二(Cf与C的关系)正确0001100010(1)A=3B=23+2:00101(2)A=10B=710+7:010100011110001正溢正确负溢正确正确(3)A=-3B=-2-3+(-2):110111110111110(4)A=-10B=-7-10+(-7):011111011011001(5)A=6B=-46+(-4):000100011011100(6)A=-6B=4-6+4:111101101000100Cf=0C=0Cf=0C=1Cf=1C=1Cf=1C=0Cf=1C=1Cf=0C=0111111(2)A=10B=710+7:01010
0011110001(4)A=-10B=-7-10+(-7):0111110110110011.硬件判断逻辑一(SA、SB与Sf的关系)溢出=SASBSfSASfSB2.硬件判断逻辑二(Cf与C的关系)溢出=CfC3.硬件判断逻辑三(双符号位)(1)3+2:正确00001100001000
0101(2)10+7:001010000111010001正溢正确负溢正确正确(3)-3+(-2):110111111101111110(4)-10+(-7):101111110110111001(5)6+(-4):000010000110111100(6)-6+4:11
111011
1010000100第一符号位Sf1第二符号位Sf2溢出=Sf1Sf21.硬件判断逻辑一(SA、SB与Sf的关系)溢出=SASBSfSASfSB2.硬件判断逻辑二(Cf与C的关系)溢出=CfC3.硬件判断逻辑三(双符号位)Chapter3—ArithmeticforComputers—13如何处理溢出有些高级语言不处理异常MIPS:addu,addui,subu指令不发生溢出其他语言(Ada,Fortran)溢出时会发出异常:使用MIPSadd,addi,sub指令溢出发生时,发生异常保存PC指针到EPC(ExcetionProgramCounter)寄存器跳转到异常处理句柄mfc0(movefromcoprocessorreg)指令从EPC中恢复PC的值Chapter3—ArithmeticforComputers—14多媒体算术运算图像和媒体计算一般针对8位或16位的数据64位地址,分区进位8×8-bit,4×16-bit,or2×32-bitSIMD(单指令、多数据)饱和操作溢出时,结果保持为最大值E.g.,音频的剪切,视频中的饱和移位操作逻辑移位
:数码位置变化,数值不变。1.移位类型算术移位
10001111循环左移:0:数码位置变化,数值变化,符号位不变。1001111算术左移:1
001
1111011110(-15)(-30)(1)单符号位:0011101110
(2)双符号位:001110
0001112.正数补码移位规则(3)移位规则左移右移右移0011100011左移左移右移右移011100
001110000111数符不变(单:符号位不变;双:第一符号位不变)。空位补0(右移时第二符号位移至尾数最高位)。(1)单符号位:1101110110
(2)双符号位:101100
1101103.负数补码移位规则(3)移位规则左移右移右移1101111101左移右移右移110110111011数符不变(单:符号位不变;双:第一符号位不变)。左移空位补0(第二符号位移至尾数最高位)。右移空位补13.2.1.4舍入方法1.0舍1入(原码、补码)000100原
100101原
111011补
2.末位恒置1(原码、补码)000100原
111011补
100101原
00010原
10011原
11110补
00011原
10011原
11101补
10011原
11101补
例.保留4位尾数:例.保留4位尾数:Chapter3—ArithmeticforComputers—19乘法1000×10011000000000000001000000
1001000Lengthofproductisthesumofoperandlengths乘积的位数是乘数和被乘数之和Multiplicand被乘数Multiplier乘数Product乘积§3.3MultiplicationChapter3—ArithmeticforComputers—20乘法硬件Initially0Chapter3—ArithmeticforComputers—21改进后的乘法器操作并行:add/shift一个时钟完成一次积:频率较低(1)手算0.1101×0.1011
1101110100001101
0.10001111上符号:1.10001111部分积问题:1)加数增多(由乘数位数决定)。
2)加数的位数增多(与被乘数、乘数位数有关)。改进:将一次相加改为分步累加。(2)分步乘法每次将一位乘数所对应的部分积与原部分积的累加和相加,并移位。设置寄存器:
A:存放部分积累加和、乘积高位
B:存放被乘数
C:存放乘数、乘积低位
设置初值:
A=00.0000B=X=00.1101C=Y=.1011
步数条件操作AC
00.0000.1011
1)Cn=1+BCn+00.110100.1101
0.1101×0.1011
1101110100001101
0.10001111BC
1101
00.01101.101
0.1101×0.10112)Cn=1+B+00.110101.001100.100111.10
0.1101×0.1011
0.1101×0.1011
1101110100001101
0.10001111BC3)Cn=0+0+00.000000.100100.0100111.14)Cn=1+B+00.110101.000100.10001111X原×Y原=1.10001111圆圈圈起来的是下一步要检测的为迭代步骤乘数被乘数积product0初始值001①000000100000000011:1→积=积+被除数001100000010000000102:左移被乘数001100000100000000103:右移乘数000①000001000000001021:1→积=积+被除数000100000100000001102:左移被乘数000100001000000001103:右移乘数0000000010000000011031:无操作000000001000000001102:左移被乘数000000010000000001103:右移乘数0000000100000000011041:无操作000000010000000001102:左移被乘数000000100000000001103:右移乘数00000010000000000110Chapter3—ArithmeticforComputers—26快速乘法器使用多个加法器,成本/效率的折衷可以流水执行:几个加法可以同步执行(不同的阶段)Chapter3—ArithmeticforComputers—27MIPSMultiplication2个32位的寄存器来保存积HI:高32bitsLO:低32-bits指令multrs,rt/multurs,rt64-bitproductinHI/LOmfhird/mflord传送HI/LO到rd可以检查HI的值来判断结果是否超过32位mulrd,rs,rt低32位存入rd寄存器Chapter3—ArithmeticforComputers—28除法除数判0除法步骤
除数≤被除数商添加1,执行减法否则商添加0,从被除数中提取下一个bit恢复余数法直接执行减法,结果小于0后再把除数加回去带符号位的除法用绝对值进行除根据需要调整商和余数的符号100110001001010-1000101011010-100010n-bit操作产生
n-bit
商和余数商被除数余数除数§3.4DivisionChapter3—ArithmeticforComputers—29除法器的硬件InitiallydividendInitiallydivisorinlefthalfChapter3—ArithmeticforComputers—30改进后的除法器一个时钟周期做一次减法和乘法器类似乘法和除法可以共用同样的硬件Chapter3—ArithmeticforComputers—31MIPS除法HI/LO寄存器存储结果HI:32位余数LO:32位商指令divrs,rt/divurs,rt不会溢出和除0检查如果需要,软件必须进行检查使用mfhi,mflo指令
访问结果Chapter3—ArithmeticforComputers—32浮点数表达非整形的数可以表达很小和很大的数和科学计数法类似–2.34×1056+0.002×10–4+987.02×109二进制表示±1.xxxxxxx2
×2yyyyC语言中的类型:float和double规格化非规格化§3.5FloatingPointChapter3—ArithmeticforComputers—33浮点数标准IEEE754标准-1985消除表达的不一致性科学计算中的可移植性性现在被普遍采用2种精度单精度(32-bit)双精度(64-bit)
IEEE-InstituteofElectricalandElectrionicsEngineers电气电子工程师协会,1963年1月1日,总部美国纽约Chapter3—ArithmeticforComputers—34IEEE浮点数标准格式S:符号位(0非负数,1负数)有效位的规格化:1.0≤|有效位|<2.0数前总有一个前导的1,此外作为隐含位可以不表示。有效位是
“1.尾数”阶码:移码表示:真实的指数+偏移EnsuresexponentisunsignedSingle:偏移=127;Double:偏移=1203S阶码尾数单精度single:8bits
双精度double:11bitssingle:23bits
double:52bits移码的特点(字长8位,偏置值为27=128,注意IEEE的指数是偏置127)移码最高位为0表示负数,最高位为1表示正数。移码直观反映真值的大小。全0时,所对应的真值最小;全1时,所对应的真值最大;有利于两个浮点数进行阶码的大小比较0的移码表示形式唯一[+0]移=[-0]移=10000000移码将真值映射到正数域,可视为无符号数同一真值的补码和移码只相差符号位。2.1数据与文字的表示方法Chapter3—ArithmeticforComputers—36单精度浮点数的范围阶码00000000和11111111特殊用途最小值阶码:00000001
指数值=1–127=–126尾数:000…00
有效位=1.0±1.0×2–126≈±1.2×10–38最大值阶码:11111110
指数值=254–127=+127尾数:111…11
有效位≈2.0±2.0×2+127≈±3.4×10+38IEEE754标准对于阶码为0或255的情况,而IEEE754标准有特别的规定:阶码是1—254,如果E是0并且M是0,则这个数的真值为±0(正负号和数符位有关)如果E=255并且M是0,则这个数的真值为±∞(同样和符号位有关)如果E=255并且M不是0,则这不是一个数(NaN)。短浮点数和长浮点数(不含临时浮点数)的存储在尾数中隐含存储着一个1,因此在计算尾数的真值时比一般形式要多一个整数1。对于阶码E的存储形式因为是127的偏移,所以在计算其移码时与人们熟悉的128偏移不一样,正数的值比用128偏移求得的少1,负数的值多1,为避免计算错误,方便理解,常将E当成二进制真值进行存储。例如:将数值-0.5按IEEE754单精度格式存储,先将-0.5换成二进制并写成标准形式:-0.5(10进制)=-0.1(2进制)=-1.0×2-1(2进制,-1是指数),这里s=1,M为全0,E-127=-1,E=126(10进制)=01111110(2进制),则存储形式为:1
01111110000000000000000000000000Chapter3—ArithmeticforComputers—37Chapter3—ArithmeticforComputers—38双精度浮点数的范围阶码0000…00和1111…11特殊用途最小值阶码:
指数=1–1023=–1022尾数:000…00有效位=1.0±1.0×2–1022≈±2.2×10–308最大值阶码:11111111110
指数=2046–1023=位数:111…11有效位≈2.0±2.0×2≈±1.8×10+308Chapter3—ArithmeticforComputers—39浮点数精度相对精度(分辨率)尾数的每一部分都有意思单精度:大约2–23Equivalentto23×log102≈23×0.3≈7decimaldigitsofprecision双精度:大约2–52Equivalentto52×log102≈52×0.3≈16decimaldigitsofprecisionChapter3—ArithmeticforComputers—40浮点数的示例如何表示–0.75–0.75=(–1)1×1.12×2–1S=1尾数=1000…002阶码=–1+偏移单精度:–1+127=126=011111102双精度:–1+1023=1022=单精度:1011111101000…008位23位双精度:11000…00Chapter3—ArithmeticforComputers—41浮点数的示例计算下列浮点数的真值
11000000101000…00S=1尾数=01000…002阶码=100000012=129x=(–1)1×(1+012)×2(129–127) =(–1)×1.25×22 =–5.0Chapter3—ArithmeticforComputers—42非规格化的浮点数阶码=000...0隐含位为0比规格化的数要小以较低的精度允许下溢尾数=000...00.0有两种表示法!Chapter3—ArithmeticforComputers—43无穷和NaNs阶码=111...1,尾数=000...0±无穷可以参与计算阶码=111...1,尾数≠000...0Not-a-Number(NaN)表示非法或则未定义的结果e.g.,0.0/0.0可以参与计算,结果衡为NaNChapter3—ArithmeticforComputers—44浮点数加法以一个4位的十进制数为例:9.999×101+1.610×10–11.对阶把小阶的值调整到和大阶一致(-1调整到1)9.999×101+0.016×1012.尾数相加9.999×101+0.016×101=10.015×1013.结果规格化&检查是否溢出1.0015×1024.进行必要的舍入处理1.002×102Chapter3—ArithmeticforComputers—45浮点数加法现在计算一个4位的二进制数1.0002×2–1+–1.1102×2–2(0.5+–0.4375)1.对接小阶对大阶1.0002×2–1+–0.1112×2–12.尾数相加1.0002×2–1+–0.1112×2–1=0.0012×2–13.规格化&检查溢出1.0002×2–4,withnoover/underflow4.进行必要的舍入1.0002×2–4(nochange)=0.0625Chapter3—ArithmeticforComputers—46浮点加法的硬件实现比整数复杂很多如果在一个时钟周期内完成,就会要求时钟周期非常的长比整数运算跟费时较慢的时钟会对所有的指令产生影响浮点加法器通常需要花费几个时钟周期可以被流水化Chapter3—ArithmeticforComputers—47浮点加法Step1Step2Step3Step4Chapter3—ArithmeticforComputers—48浮点乘法以一个4位的十进制乘法为例1.110×1010×9.200×10–51.指数相加如果指数有偏移,还需要减去多加的偏移值新指数=10+–5=52.有效位相乘1.110×9.200=10.21210.212×1053.规格化,同时检查上溢和下溢1.0212×1064.舍入,可能还需要进一步规格化1.021×1065.计算符号位+1.021×106Chapter3—ArithmeticforComputers—49浮点乘法下面是一个4位的二进制数的例子1.0002×2–1×–1.1102×2–2(0.5×–0.4375)1.阶码相加无偏移:–1+–2=–3有偏移:(–1+127)+(–2+127)=–3+254–127=–3+1272.有效位相乘1.0002×1.1102=1.11021.1102×2–33.规格化,同时检查上溢和下溢1.1102×2–3
无溢出,也不需规格化4.舍入,可能还需要进一步规格化1.1102×2–3(nochange)5.计算符号位:+ve×–ve–ve–1.1102×2–3=–0.21875Chapter3—ArithmeticforComputers—50浮点运算硬件浮点乘法和加法的硬件复杂度类似有效位上进行乘法而不是加法浮点运算通常需要的操作是加法,减法,乘法,除法,求倒数,平方根浮点数和整数间的转换通常需要多个时钟周期很容易用流水实现流水方式
Chapter3—ArithmeticforComputers—52MIPS中的浮点指令浮点数使用协处理器通过ISA相连的附属处理器独立的浮点寄存器32个单精度:$f0,$f1,…$f31配对为双精度:$f0/$f1,$f2/$f3,…Release2ofMIPsISAsupports32×64-bitFPreg’s浮点指令只操作浮点寄存器程序通常不会在浮点寄存器上进行整数操作,或在整数寄存器上进行浮点操作因此可以提供更多的寄存器,而不影响指令的长度浮点数读取、存储指令lwc1,ldc1,swc1,sdc1e.g.,ldc1$f8,32($sp)Chapter3—ArithmeticforComputers—53MIPS中的浮点指令单精度add.s,sub.s,mul.s,div.se.g.,add.s$f0,$f1,$f6双精度add.d,sub.d,mul.d,div.de.g.,mul.d$f4,$f4,$f6比较c.xx.s,c.xx.d(xxiseq,lt,le,…)SetsorclearsFPcondition-codebite.g.c.lt.s$f3,$f4分支bc1t,bc1fe.g.,bc1tTargetLabelChapter3—ArithmeticforComputers—54示例:°Fto°CC语言: floatf2c(floatfahr){
return((5.0/9.0)*(fahr-32.0));
}Fahr变量存在$f12,$f0存结果,常量存在全局共享内存编译后的MIPS指令:
f2c:lwc1$f16,const5($gp)
lwc2$f18,const9($gp)
div.s$f16,$f16,$f18
lwc1$f18,const32($gp)
sub.s$f18,$f12,$f18
mul.s$f0,$f16,$f18
jr$raChapter3—ArithmeticforComputers—55示例:数组乘法X=X+Y×Z都是32×32矩阵,64-bit双精度C语言:
voidmm(doublex[][],
doubley[][],doublez[][]){
inti,j,k;
for(i=0;i!=32;i=i+1)
for(j=0;j!=32;j=j+1)
for(k=0;k!=32;k=k+1)
x[i][j]=x[i][j]
+y[i][k]*z[k][j];
}x,y,z指针存储在$a0,$a1,$a2,
i,j,k在$s0,$s1,$s2中Chapter3—ArithmeticforComputers—56示例:数组乘法MIPScode:
li$t1,32#$t1=32(rowsize/loopend)
li$s0,0#i=0;initialize1stforloop
L1:li$s1,0#j=0;restart2ndforloop
L2:li$s2,0#k=0;restart3rdforloop
sll$t2,$s0,5#$t2=i*32(sizeofrowofx)
addu$t2,$t2,$s1#$t2=i*size(row)+j
sll$t2,$t2,3#$t2=byteoffsetof[i][j]
addu$t2,$a0,$t2#$t2=byteaddressofx[i][j]
l.d$f4,0($t2)#$f4=8bytesofx[i][j]
L3:sll$t0,$s2,5#$t0=k*32(sizeofrowofz)
addu$t0,$t0,$s1#$t0=k*size(row)+j
sll$t0,$t0,3#$t0=byteoffsetof[k][j]
addu$t0,$a2,$t0#$t0=byteaddressofz[k][j]
l.d$f16,0($t0)#$f16=8bytesofz[k][j]
…Chapter3—ArithmeticforComputers—57示例:数组乘法…
sll$t0,$s0,5#$t0=i*32(sizeofrowofy)
addu$t0,$t0,$s2#$t0=i*size(row)+k
sll$t0,$t0,3#$t0=byteoffsetof[i][k]
addu$t0,$a1,$t0#$t0=byteaddressofy[i][k]
l.d$f18,0($t0)#$f18=8bytesofy[i][k]
mul.d$f16,$f18,$f16#$f16=y[i][k]*z[k][j]
add.d$f4,$f4,$f16#f4=x[i][j]+y[i][k]*z[k][j]
addiu$s2,$s2,1#$kk+1
bne$s2,$t1,L3#if(k!=32)gotoL3
s.d$f4,0($t2)#x[i][j]=$f4
addiu$s1,$s1,1#$j=j+1
bne$s1,$t1,L2#if(j!=32)gotoL2
addiu$s0,$s0,1#$i=i+1
bne$s0,$t1,L1#if(i!=32)gotoL1Chapter3—ArithmeticforComputers—58精度IEEE754定义了多种舍入控制策略多存储几个位(保护,舍入,sticky)可以选择不同的舍入模式允许程序员微调计算中的行为不是所有的硬件都实现了IEEE754的舍入策略大部分语言和类库只是用缺省的策略是硬件复杂度、效率和市场需求的折衷Chapter3—ArithmeticforComputers—59内在含义Bits没有固有的含义由在上面操作的指令决定如何使用计算机中数的表示有限的
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 冰箱的租赁合同范文
- 参建住宅协议书的编写范本
- 交通银行借款合同范本
- 房屋租赁合同终止声明书
- 物业公司管理协议书
- 旅游合作开发合同范文点评
- 建筑劳务分包合同格式范本
- 广东省茶叶原料采购合同模板
- 工程劳动力和施工合同示例
- 员工劳动合同续签互用协议
- 正余弦定理知识点权威总结18页
- 国企纪检监察嵌入式监督的探索与实践
- 浅议小升初数学教学衔接
- 设备安装应急救援预案
- 深基坑工程降水技术及现阶段发展
- 暂堵压裂技术服务方案
- 《孔乙己》公开课一等奖PPT优秀课件
- 美的中央空调故障代码H系列家庭中央空调(第一部分多联机)
- 业主委员会成立流程图
- (完整版)全usedtodo,beusedtodoing,beusedtodo辨析练习(带答案)
- 广联达办公大厦工程施工组织设计
评论
0/150
提交评论