版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
本文格式為Word版,下載可任意編輯——浮點(diǎn)數(shù)的表示和運(yùn)算(范圍計(jì)算)浮點(diǎn)數(shù)的表示和運(yùn)算浮點(diǎn)數(shù)的表示和基本運(yùn)算1浮點(diǎn)數(shù)的表示
尋常,我們可以用下面的格式來表示浮點(diǎn)數(shù)SPM
其中S是符號(hào)位,P是階碼,M是尾數(shù)
對于IBM-PC而言,單精度浮點(diǎn)數(shù)是32位(即4字節(jié))的,雙精度浮點(diǎn)數(shù)是64位(即8字節(jié))的。兩者的S,P,M所占的位數(shù)以及表示方法由下表可知SPM表示公式偏移量1823(-1)S*2(P-127)*1.M12711152(-1)S*2(P-1023)*1.M1023
以單精度浮點(diǎn)數(shù)為例,可以得到其二進(jìn)制的表示格式如下S(第31位)P(30位到23位)M(22位到0位)其中S是符號(hào)位,只有0和1,分別表示正負(fù);P是階碼,尋常使用移碼表示(移碼和補(bǔ)碼只有符號(hào)位相反,其余都一樣。對于正數(shù)而言,原碼,反碼和補(bǔ)碼都一樣;對于負(fù)數(shù)而言,補(bǔ)碼就是其絕對值的原碼全部取反,然后加1.)
為了簡單起見,本文都只探討單精度浮點(diǎn)數(shù),雙精度浮點(diǎn)數(shù)也是用一樣的方式存儲(chǔ)和表示的。
2浮點(diǎn)數(shù)的表示約定
單精度浮點(diǎn)數(shù)和雙精度浮點(diǎn)數(shù)都是用IEEE754標(biāo)準(zhǔn)定義的,其中有一些特別約定。
(1)當(dāng)P=0,M=0時(shí),表示0。
(2)當(dāng)P=255,M=0時(shí),表示無窮大,用符號(hào)位來確定是正無窮大還是負(fù)無窮大。
(3)當(dāng)P=255,M!=0時(shí),表示NaN(NotaNumber,不是一個(gè)數(shù))。
當(dāng)我們使用.NetFramework的時(shí)候,我們尋常會(huì)用到下面三個(gè)常量Console.WriteLine(float.MaxValue);//3.402823E+38Console.WriteLine(float.MinValue);//-3.402823E+38Console.WriteLine(float.Epsilon);//1.401298E-45//假使我們把它們轉(zhuǎn)換成雙精度類型,它們的值如下
Console.WriteLine(Convert.ToDouble(float.MaxValue));//3.40282346638529E+38Console.WriteLine(Convert.ToDouble(float.MinValue));//-3.40282346638529E+38Console.WriteLine(Convert.ToDouble(float.Epsilon));//1.40129846432482E-45那么這些值是如何求出來的呢?
根據(jù)上面的約定,我們可以知道階碼P的最大值是11111110(這個(gè)值是254,由于255用于特別的約定,那么對于可以確切表示的數(shù)來說,254就是最大的階碼了)。尾數(shù)的最大值是11111111111111111111111。
那么這個(gè)最大值就是:01111111011111111111111111111111。
也就是2(254-127)*(1.11111111111111111111111)2=2127*(1+1-2-23)=3.40282346638529E+38
從上面的雙精度表示可以看出,兩者是一致的。最小的數(shù)自然就是-3.40282346638529E+38。
對于最接近于0的數(shù),根據(jù)IEEE754的約定,為了擴(kuò)大對0值附近數(shù)據(jù)的表示能力,取階碼P=-126,尾數(shù)M=(0.00000000000000000000001)2。此時(shí)該數(shù)的二進(jìn)制表示為:00000000000000000000000000000001
也就是2-126*2-23=2-149=1.40129846432482E-45。這個(gè)數(shù)字和上面的Epsilon是一致的。
假使我們要確切表示最接近于0的數(shù)字,它應(yīng)當(dāng)是00000000100000000000000000000000
也就是:2-126*(1+0)=1.17549435082229E-38。3浮點(diǎn)數(shù)的精度問題
浮點(diǎn)數(shù)以有限的32bit長度來反映無限的實(shí)數(shù)集合,因此大多數(shù)狀況下都是一個(gè)近似值。同時(shí),對于浮點(diǎn)數(shù)的運(yùn)算還同時(shí)伴有誤差擴(kuò)散現(xiàn)象。特定精度下看似相等的兩個(gè)浮點(diǎn)數(shù)可能并不相等,由于它們的最小有效位數(shù)不同。
由于浮點(diǎn)數(shù)可能無法確切近似于十進(jìn)制數(shù),假使使用十進(jìn)制數(shù),則使用浮點(diǎn)數(shù)的數(shù)學(xué)或比較運(yùn)算可能不會(huì)產(chǎn)生一致的結(jié)果。
假使涉及浮點(diǎn)數(shù),值可能不來回。值的來回是指,某個(gè)運(yùn)算將原始浮點(diǎn)數(shù)轉(zhuǎn)換為另一種格式,而反向運(yùn)算又將轉(zhuǎn)換后的格式轉(zhuǎn)換回浮點(diǎn)數(shù),且最終浮點(diǎn)數(shù)與原始浮點(diǎn)數(shù)相等。由于一個(gè)或多個(gè)最低有效位可能在轉(zhuǎn)換中丟失或更改,來回可能會(huì)失敗。
4將浮點(diǎn)數(shù)表示為二進(jìn)制
4.1無小數(shù)的浮點(diǎn)數(shù)轉(zhuǎn)換成二進(jìn)制表示
首先,我們用一個(gè)不帶小數(shù)的浮點(diǎn)數(shù)來說明如何將一個(gè)浮點(diǎn)數(shù)轉(zhuǎn)換成二進(jìn)制表示。假設(shè)要轉(zhuǎn)換的數(shù)據(jù)是45678.0f。
在處理這種不帶小數(shù)的浮點(diǎn)數(shù)時(shí),直接將整數(shù)部分轉(zhuǎn)化為二進(jìn)制表示:
1011001001101110.0,這時(shí)要加上一位默認(rèn)的1(這是由于依照浮點(diǎn)數(shù)規(guī)格化的要求,尾數(shù)必需化成1.M的格式),
那么可以表示成:11011001001101110.0。
然后將小數(shù)點(diǎn)向左移,一直移到離最高位只有1位,也就是1.1011001001101110,一共移動(dòng)了16位,我們知道,左移位表示乘法,右移位表示除法。所以原數(shù)就等于這樣:1.1011001001101110*(216)。現(xiàn)在尾數(shù)和指數(shù)都出來了。由于最高位的1是根據(jù)標(biāo)準(zhǔn)加上去的,只是為了滿足規(guī)格化的要求,這時(shí)候需要把這個(gè)1去掉。尾數(shù)的二進(jìn)制就變成了:1011001001101110。
最終在尾數(shù)的后面補(bǔ)0,一直到補(bǔ)夠23位,就是:10110010011011100000000。
再回來看指數(shù),根據(jù)前面的定義,P-127=16,那么P=143,表示成二進(jìn)制就是:10001111。
45678.0f這個(gè)數(shù)是正的,所以符號(hào)位是0,那么我們依照前面講的格式把它拼起來,就是:01000111110110010011011100000000。
這就是45678.0f這個(gè)數(shù)的二進(jìn)制表示,假使我們要得到16進(jìn)制的表示,十分簡單,我們只需要把這個(gè)二進(jìn)制串4個(gè)一組,轉(zhuǎn)換成16進(jìn)制數(shù)就可以了。但是要注意的是x86架構(gòu)的CPU都是LittleEndian的(也就是低位字節(jié)在前,高位字節(jié)在后),所以在實(shí)際內(nèi)存中該數(shù)字是按上面二進(jìn)制串的倒序存儲(chǔ)的。要知道CPU是不是littleendian的也很簡單。BitConverter.IsLittleEndian;
4.2含小數(shù)的浮點(diǎn)數(shù)表示為二進(jìn)制
對于含小數(shù)的浮點(diǎn)數(shù),會(huì)有精度的問題,下面舉例說明。假設(shè)要轉(zhuǎn)換的小數(shù)為123.456f。
對于這種帶小數(shù)的就需要把整數(shù)部和小數(shù)部分開處理。對于整數(shù)部分的處理不再贅述,直接化成二進(jìn)制為:100100011。小數(shù)部份的處理比較麻煩一些,我們知道,使用二進(jìn)制表示只有0和1,那么對于小數(shù)就只能用下面的方式來表示:
a1*2-1+a2*2-2+a3*2-3++an*2-n
其中a1等數(shù)可以是0或者1,從理論上將,使用這種表示方法可以表示一個(gè)有限的小數(shù)。但是尾數(shù)只能有23位,那么就必然會(huì)帶來精度的問題。
在好多狀況下,我們只能近似地表示小數(shù)。來看0.456這個(gè)十進(jìn)制純小數(shù),該如何表示成二進(jìn)制呢?一般說來,我們可以通過乘以2的方法來表示。
首先,把這個(gè)數(shù)字乘以2,小于1,所以第一位為0,然后再乘以2,大于1,所以其次位為1,將這個(gè)數(shù)字減去1,再乘以2,這樣循環(huán)下去,直到這個(gè)數(shù)字等于0為止。
在好多狀況下,我們得到的二進(jìn)制數(shù)字都大于23位,多于23位的就要舍去。舍入原則是0舍1入。通過這樣的方法,我們可以得到二進(jìn)制表示:1111011.01110100101111001。
現(xiàn)在開始向左移小數(shù)點(diǎn),一共移了6位,這時(shí)候尾數(shù)為:1.11101101110100101111001,階碼為6加上127得131,二進(jìn)制表示為:10000101,那么總的二進(jìn)制表示為:
01000010111101101110100101111001
表示成十六進(jìn)制是:42F6E979
由于CPU是LittleEndian的,所以在內(nèi)存中表示為:79E9F642。
4.3將純小數(shù)表示成二進(jìn)制
對于純小數(shù)轉(zhuǎn)化為二進(jìn)制來說,必需先進(jìn)行規(guī)格化。例如0.0456,我們需要把它規(guī)格化,變?yōu)?.xxxx*(2n)的形式,要求得純小數(shù)X對應(yīng)的n可用下面的公式:n=int(1+log2X)
0.0456我們可以表示為1.4592乘以以2為底的-5次方的冪,即1.4592*(2-5)。轉(zhuǎn)化為這樣形式后,再依照上面處理小數(shù)的方法處理,得到二進(jìn)制表示
1.01110101100011100010001
去掉第一個(gè)1,得到尾數(shù)
01110101100011100010001
階碼為:-5+127=122,二進(jìn)制表示為
00111101001110101100011100010001
最終轉(zhuǎn)換成十六進(jìn)制11C73A3D
5浮點(diǎn)數(shù)的數(shù)學(xué)運(yùn)算
5.1浮點(diǎn)數(shù)的加減法
設(shè)兩個(gè)浮點(diǎn)數(shù)X=Mx*2Ex,Y=My*2Ey
實(shí)現(xiàn)X±Y要用如下5步完成:
(1)對階操作:小階向大階看齊(2)進(jìn)行尾數(shù)加減運(yùn)算
(3)規(guī)格化處理:尾數(shù)進(jìn)行運(yùn)算的結(jié)果必需變成規(guī)格化的浮點(diǎn)數(shù),對于雙符號(hào)位(就是使用00表示正數(shù),11表示負(fù)數(shù),01表示上溢出,10表示下溢出)的補(bǔ)碼尾數(shù)來說,就必需是
001×××…××或110×××…××的形式
若不符合上述形式要進(jìn)行左規(guī)或右規(guī)處理。
(4)舍入操作:在執(zhí)行對階或右規(guī)操作時(shí)常用“0〞舍“1〞入法將右移出去的尾數(shù)數(shù)值進(jìn)行舍入,以確保精度。
(5)判結(jié)果的正確性:即檢查階碼是否溢出
若階碼下溢(移碼表示是00…0),要置結(jié)果為機(jī)器0;若階碼上溢(超過了階碼表示的最大值)置溢出標(biāo)志。
現(xiàn)在用一個(gè)具體的例子來說明上面的5個(gè)步驟
例題:假定X=0.0110011*211,Y=0.1101101*2-10(此處的數(shù)均為二進(jìn)制),計(jì)算X+Y;
首先,我們要把這兩個(gè)數(shù)變成2進(jìn)制表示,對于浮點(diǎn)數(shù)來說,階碼尋常用移碼表示,而尾數(shù)尋常用補(bǔ)碼表示。
要注意的是-10的移碼是00110[X]?。?10101100110[Y]?。?01101101101符號(hào)位階碼尾數(shù)
(1)求階差:│ΔE│=|1010-0110|=0100
(2)對階:Y的階碼小,Y的尾數(shù)右移4位[Y]浮變?yōu)?101000001101101暫時(shí)保存
(3)尾數(shù)相加,采用雙符號(hào)位的補(bǔ)碼運(yùn)算001100110+000000110001101100
(4)規(guī)格化:滿足規(guī)格化要求
(5)舍入處理,采用0舍1入法處理
故最終運(yùn)算結(jié)果的浮點(diǎn)數(shù)格式為:010101101101
即X+Y=+0.1101101*210
5.2浮點(diǎn)數(shù)的乘除法
(1)階碼運(yùn)算:階碼求和(乘法)或階碼求差(除法)即[Ex+Ey]移=[Ex]移+[Ey]補(bǔ)[Ex-Ey]移=[Ex]移+[-Ey]補(bǔ)
(2)浮點(diǎn)數(shù)的尾數(shù)處理:浮點(diǎn)數(shù)中尾數(shù)乘除法運(yùn)算結(jié)果要進(jìn)行舍入處理
例題:X=0.0110011*211,Y=0.1101101*2-10求X*Y
解:
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五版多房產(chǎn)離婚協(xié)議書-2025年度家庭財(cái)產(chǎn)分割實(shí)施流程2篇
- 二零二五年度餐飲業(yè)餐飲店裝修設(shè)計(jì)與施工服務(wù)合同2篇
- 二零二五版廣告牌廣告位租賃與廣告效果分析合同3篇
- 二零二五年度鋼板租賃及節(jié)能改造服務(wù)合同2篇
- 二零二五版房屋抵押借款合同及借款收據(jù)范本3篇
- 二零二五年度軟裝方案創(chuàng)意設(shè)計(jì)合同2篇
- 二零二五年度火鍋店原料采購及質(zhì)量控制合同范本3篇
- 二零二五版跨境電商個(gè)人合伙退伙合同范本3篇
- 二零二五年度頂賬房買賣合同備案及注銷協(xié)議3篇
- 二零二五版綠色建筑項(xiàng)目墊資合同范本共3篇
- 《疥瘡的防治及治療》課件
- Unit4 What can you do Part B read and write (說課稿)-2024-2025學(xué)年人教PEP版英語五年級上冊
- 2025年MEMS傳感器行業(yè)深度分析報(bào)告
- 《線控底盤技術(shù)》2024年課程標(biāo)準(zhǔn)(含課程思政設(shè)計(jì))
- 學(xué)校對口幫扶計(jì)劃
- 倉庫倉儲(chǔ)安全管理培訓(xùn)課件模板
- 風(fēng)力發(fā)電場運(yùn)行維護(hù)手冊
- 《3-6歲兒童學(xué)習(xí)與發(fā)展指南》專題培訓(xùn)
- 河道旅游開發(fā)合同
- 情人合同范例
- 建筑公司勞務(wù)合作協(xié)議書范本
評論
0/150
提交評論