課程資源-計算機(jī)組織與結(jié)構(gòu)chapter_第1頁
課程資源-計算機(jī)組織與結(jié)構(gòu)chapter_第2頁
課程資源-計算機(jī)組織與結(jié)構(gòu)chapter_第3頁
課程資源-計算機(jī)組織與結(jié)構(gòu)chapter_第4頁
課程資源-計算機(jī)組織與結(jié)構(gòu)chapter_第5頁
免費預(yù)覽已結(jié)束,剩余16頁可下載查看

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

第三章運算方法和運算部件

(二)

主要內(nèi)容高級語言和機(jī)器指令中的運算基本運算部件定點數(shù)運算浮點數(shù)運算浮點數(shù)運算及結(jié)果設(shè)兩個規(guī)格化浮點數(shù)分別為A=Ma.

2EaB=Mb.2Eb,則:

A+B

=(Ma+

Mb.2-(Ea-Eb)).

2Ea(假設(shè)Ea>=Eb

)

A*B

=(Ma*

Mb).2Ea+Eb

A/B

=(Ma/

Mb).2Ea-Eb上述運算結(jié)果可能出現(xiàn)以下幾種情況:階碼上溢:一個正指數(shù)超過了最大允許值=〉+∞/-∞/溢出階碼下溢:一個負(fù)指數(shù)超過了最小允許值=〉+0/-0尾數(shù)溢出:最高有效位有進(jìn)位=〉右規(guī)非規(guī)格化尾數(shù):數(shù)值部分高位為0=〉左規(guī)右規(guī)或?qū)﹄A時,右段有效位丟失=〉尾數(shù)舍入IEEE建議實現(xiàn)時為每種異常情況提供一個自陷允許位。若某異常對應(yīng)的位為1,則發(fā)生相應(yīng)異常時,就調(diào)用一個特定的異常處理程序執(zhí)行。SP最大指數(shù)為多少?127!SP最小指數(shù)為多少?-126!運算過程中添加保護(hù)位尾數(shù)溢出,結(jié)果不一定溢出1.5+1.5=?1.5-1.0=?浮點數(shù)加/減運算十進(jìn)制科學(xué)計數(shù)法的加法例子1.123×105+2.560×102其計算過程為:1.123×105+2.560×102=1.123×105+0.002560×105

=(1.123+0.00256)×105=1.12556×105

=1.126×105“對階”操作:目的是使兩數(shù)階碼相等小階向大階看齊,階小的那個數(shù)的尾數(shù)右移,右移位數(shù)等于兩個階碼差的絕對值IEEE754尾數(shù)右移時,要將隱含的“1”移到小數(shù)部分,高位補(bǔ)0,移出的低位保留到特定的“附加位”上進(jìn)行尾數(shù)加減運算前,必須“對階”!最后還要考慮舍入計算機(jī)內(nèi)部的二進(jìn)制運算也一樣!浮點數(shù)加減法基本要點

(假定:Xm、Ym分別是X和Y的尾數(shù),Xe和Ye分別是X和Y的階碼)(1)求階差:?e=Ye–Xe(若Ye>Xe,則結(jié)果的階碼為Ye)(2)對階:將Xm右移?e位,尾數(shù)變?yōu)閄m*2Xe-Ye(保留右移部分:附加位)(3)尾數(shù)加減:Xm*2Xe-Ye±Ym(4)規(guī)格化:當(dāng)尾數(shù)高位為0,則需左規(guī):尾數(shù)左移一次,階碼減1,直到MSB為1

每次階碼減1后要判斷階碼是否下溢(比最小可表示的階碼還要?。?/p>

當(dāng)尾數(shù)最高位有進(jìn)位,需右規(guī):尾數(shù)右移一次,階碼加1,直到MSB為1

每次階碼加1后要判斷階碼是否上溢(比最大可表示的階碼還要大)如果尾數(shù)比規(guī)定位數(shù)長,則需考慮舍入(有多種舍入方式)若運算結(jié)果尾數(shù)是0,則需要將階碼也置0。為什么?階碼溢出異常處理:階碼上溢,則結(jié)果溢出;階碼下溢,則結(jié)果為0尾數(shù)為0說明結(jié)果應(yīng)該為0(階碼和尾數(shù)為全0)。浮點數(shù)加法運算舉例Example:用二進(jìn)制形式計算0.5+(–0.4375)=?對階:-1.110x2-2

→-0.111x2-1

加減:1.000x2-1+(-0.111x2-1)=0.001x2-1

左規(guī):0.001x2-1→1.000x2–4判溢出:無解:0.5=1.000x2-1,-0.4375=-1.110x2-2結(jié)果為:1.000x2–4=0.0001000=1/16=0.0625問題:為何IEEE754加減運算右規(guī)時最多只需一次?因為即使是兩個最大的尾數(shù)相加,得到的和的尾數(shù)也不會達(dá)到4,故尾數(shù)的整數(shù)部分最多有兩位,保留一個隱含的“1”后,最多只有一位被右移到小數(shù)部分。ExtraBits(附加位)"FloatingPointnumbersarelikepilesofsand;everytimeyoumoveoneyoulosealittlesand,butyoupickupalittledirt.““浮點數(shù)就像一堆沙,每動一次就會失去一點‘沙’,并撿回一點‘臟’”

如何才能使失去的“沙”和撿回的“臟”都盡量少呢?加多少附加位才合適?IEEE754規(guī)定:中間結(jié)果須在右邊加2個附加位(guard&round)

Guard(保護(hù)位):在significand右邊的位

Round(舍入位):在保護(hù)位右邊的位Add/Sub: 1.xxxxx1.xxxxx1.xxxxx 1.xxxxxxxx + 1.xxxxx0.001xxxxx0.01xxxxx -1.xxxxxxxx 1x.xxxxy1.xxxxxyyy1x.xxxxyyy0.0…0xxxx附加位的作用:用以保護(hù)對階時右移的位或運算的中間結(jié)果。附加位的處理:

①左規(guī)時被移到significand中;②作為舍入的依據(jù)。在后面加附加位!無法給出準(zhǔn)確的答案!RoundingDigits(舍入位)舉例:十進(jìn)制數(shù),最終有效位數(shù)為3,采用兩位附加位(G、R)。

2.3400*10

0.0253*10

2.3653*10222IEEEStandard:fourroundingmodes(用圖說明)roundtonearest(default)roundtowardsplusinfinity(alwaysroundup)roundtowardsminusinfinity(alwaysrounddown)roundtowards0roundtonearest:rounddigit<1/2thentruncate(截去)>1/2thenroundup(add1toULP)=1/2thenroundtonearestevendigit

可以證明默認(rèn)方式得到的平均誤差最小。注:ULP=unitsinthelastplace.簡稱為就近舍入到偶數(shù)問題:若沒有舍入位,采用就近舍入到偶數(shù),則結(jié)果是什么?結(jié)果為2.36!精度沒有2.37高!IEEE754的舍入方式的說明IEEE754的舍入方式(

Z1和Z2分別是結(jié)果Z的最近的可表示的左、右兩個數(shù))(1)就近舍入:舍入為最近可表示的數(shù)非中間值:0舍1入;

中間值:強(qiáng)迫結(jié)果為偶數(shù)(2)朝+∞方向舍入:舍入為Z2(正向舍入)(3)朝-∞方向舍入:舍入為Z1(負(fù)向舍入)(4)朝0方向舍入:截去。正數(shù):取Z1;

負(fù)數(shù):取Z2

00ZZ1Z2例如:附加位為01:舍11:入10:(強(qiáng)迫結(jié)果為偶數(shù))例:1.110111

→1.1110;1.110101

1.1101;1.110110

1.1110;1.111110

→10.0000;

Kahan累加算法TheFatherofFloatingPointKahan累加算法(續(xù))y=3.14159-0t=10000.0+3.14159=10003.1c=(10003.1-10000.0)-3.14159=3.10000-3.14159=-.0415900sum=10003.1y=2.71828--.0415900=2.75987t=10003.1+2.75987=10005.9c=(10005.9-10003.1)-2.75987=2.80000-2.75987=.040130sum=10005.9functionKahanSum(input)varsum=0.0,tvarc=0.0,yfori=1toinput.lengthdoy=input[i]-ct=sum+yc=(t-sum)–ysum=treturnsumsum=10000.0+3.14159=10003.14159=10003.1sum=10003.1+2.71828=10005.81828=10005.8sum=10000.0+3.14159+2.71828=10005.85987=10005.9浮點數(shù)加減法運算流程圖浮點數(shù)運算舉例假設(shè)有兩個實數(shù)x和y,x=–68,y=–8.25,它們在C語言程序中定義為float型變量(用IEEE754單精度浮點數(shù)格式表示),x和y分別存放在寄存器A和B中。另外,還有兩個寄存器C和D。A、B、C、D都是32位寄存器。請回答下列問題(要求最終用十六進(jìn)制表示二進(jìn)制序列)。(1)寄存器A和B中的內(nèi)容分別是什么?(2)若x和y相加后的結(jié)果存放在寄存器C中,則寄存器C中的內(nèi)容是什么?(3)若x和y相減后的結(jié)果存放在寄存器D中,則寄存器D中的內(nèi)容是什么?(4)如果相加結(jié)果被寫到了主存(按字節(jié)編址),地址為0x8049000,請分別給出在大端機(jī)器和小端機(jī)器上在內(nèi)存是如何存放的。參考答案:(1)[68]=C2880000H,[-8.25]=C1040000H(2)[x+y]=C2988000H(3)[x-y]=C26F0000H(4)C29880008049000804900180490028049003008098C28049000804900180490028049003大端小端非規(guī)格化浮點數(shù)舉例計算器2-63264討論問題:計算器上算的準(zhǔn)確嗎?為什么x輸出為0?為什么y的輸出發(fā)生變化?為什么x、y、z用%x輸出為0?Z輸出為0說明了什么?如下賦初值對否?

floatx=0x40000000;

floaty=0x5f800000;當(dāng)結(jié)果為

0.1x2-126時,是用非規(guī)格化數(shù)表示還是近似為0?以下程序試圖計算2-63/264=2-127C語言中的浮點數(shù)類型C語言中有float和double類型,分別對應(yīng)IEEE754單精度浮點數(shù)格式和雙精度浮點數(shù)格式longdouble類型的長度和格式隨編譯器和處理器類型的不同而有所不同,IA-32中是80位擴(kuò)展精度格式從int轉(zhuǎn)換為float時,不會發(fā)生溢出,但可能有數(shù)據(jù)被舍入從int或float轉(zhuǎn)換為double時,因為double的有效位數(shù)更多,故能保留精確值從double轉(zhuǎn)換為float和int時,可能發(fā)生溢出,此外,由于有效位數(shù)變少,故可能被舍入從float或double轉(zhuǎn)換為int時,因為int沒有小數(shù)部分,所以數(shù)據(jù)可能會向0方向被截斷CarnegieMellon浮點數(shù)比較運算舉例對于以下給定的關(guān)系表達(dá)式,判斷是否永真。2/3==2/3.0d<0.0?((d*2)<0.0)d>f?-f>-dd*d>=0.0x*x>=0(d+f)-d==fintx;floatf;doubled;AssumeneitherdnorfisNaN否是是是自己寫程序測試一下!否否浮點運算舉例1991年2月25日,海灣戰(zhàn)爭中,美國在沙特阿拉伯達(dá)摩地區(qū)設(shè)置的愛國者導(dǎo)彈攔截伊拉克的飛毛腿導(dǎo)彈失敗,致使飛毛腿導(dǎo)彈擊中了沙特阿拉伯載赫藍(lán)的一個美軍軍營,殺死了美國陸軍第十四軍需分隊的28名士兵。其原因是由于愛國者導(dǎo)彈系統(tǒng)時鐘內(nèi)的一個軟件錯誤造成的,引起這個軟件錯誤的原因是浮點數(shù)的精度問題。

愛國者導(dǎo)彈系統(tǒng)中有一個內(nèi)置時鐘,用計數(shù)器實現(xiàn),每隔0.1秒計數(shù)一次。程序用0.1的一個24位定點二進(jìn)制小數(shù)x來乘以計數(shù)值作為以秒為單位的時間。0.1的二進(jìn)制表示是一個無限循環(huán)序列:0.00011[0011]…,x=0.00011001100110011001100B。顯然,x是0.1的近似表示,0.1-x=0.00011001100110011001100[1100]…-0.00011001100110011001100B,即為:=0.000000000000000000000001100[1100]…B=2-20×0.1

9.54×10-8浮點運算舉例

已知在愛國者導(dǎo)彈準(zhǔn)備攔截飛毛腿導(dǎo)彈之前,已經(jīng)連續(xù)工作了100小時,飛毛腿的速度大約為2000米/秒,則由于時鐘計算誤差而導(dǎo)致的距離誤差是多少?

100小時相當(dāng)于計數(shù)了100×60×60×10=36×105次,因而導(dǎo)彈的時鐘已經(jīng)偏差了9.54×10-8×36×1050.343秒

因此,距離誤差是2000×0.343秒

687米小故事:實際上,以色列方面已經(jīng)發(fā)現(xiàn)了這個問題并于1991年2月11日知會了美國陸軍及愛國者計劃辦公室(軟件制造商)。以色列方面建議重新啟動愛國者系統(tǒng)的電腦作為暫時解決方案,可是美國陸軍方面卻不知道每次需要間隔多少時間重新啟動系統(tǒng)一次。1991年2月16日,制造商向美國陸軍提供了更新軟件,但這個軟件最終卻在飛毛腿導(dǎo)彈擊中軍營后的一天才運抵部隊。浮點運算舉例若x用float型表示,則x的機(jī)器數(shù)是什么?0.1與x的偏差是多少?系統(tǒng)運行100小時后的時鐘偏差是多少?在飛毛腿速度為2000米/秒的情況下,預(yù)測的距離偏差為多少?0.1=0.00011[0011]B=+1.10011001100110011001100B×2-4,故x的機(jī)器數(shù)為00111101110011001100110011001100Float型僅24位有效位數(shù),后面的有效位全被截斷,故x與0.1之間的誤差為:|x–0.1|=0.0000000000000000000000000001100[1100]…B。這個值等于2-24×0.15.96×10-9。100小時后時鐘偏差5.96×10-9×36×1050.0215秒。距離偏差0.0215×200043米。比愛國者導(dǎo)彈系統(tǒng)精確約16倍。若用32位二進(jìn)制定點小數(shù)x=0.0001100110011001100110011001101B表示0.1,則誤差比用float表示誤差更大還是更???當(dāng)x=0.0001100110011001100110011001101B時,與0.1之間的誤差約為:|x–0.1|=0.

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論