本文首發(fā)于個(gè)人博客
浮點(diǎn)數(shù)表達(dá)
IEEE754標(biāo)準(zhǔn)是用于規(guī)范浮點(diǎn)數(shù)運(yùn)算的IEEE標(biāo)準(zhǔn),用于解決浮點(diǎn)數(shù)標(biāo)準(zhǔn)混亂的問(wèn)題茄螃。其被認(rèn)證后不久,幾乎所有的處理器生產(chǎn)商都采用這一標(biāo)準(zhǔn),極大的推動(dòng)了軟件的發(fā)展豪墅。浮點(diǎn)數(shù)存儲(chǔ)的格式如下:
浮點(diǎn)數(shù)由符號(hào)位,指數(shù)位和尾數(shù)三個(gè)部分組成黔寇,表達(dá)公式如下式:
在IEEE754標(biāo)準(zhǔn)中偶器,主要規(guī)定了單精度浮點(diǎn)(float)和雙精度浮點(diǎn)(double)兩種浮點(diǎn)數(shù):
類(lèi)型 | 符號(hào)位數(shù) | 指數(shù)位數(shù) | 尾數(shù)位數(shù) |
---|---|---|---|
單精度浮點(diǎn)(float) | 1 | 8 | 23 |
雙精度浮點(diǎn)(double) | 1 | 11 | 52 |
首先考慮符號(hào)位,當(dāng)該符號(hào)位為0時(shí)缝裤,表示該數(shù)為正數(shù)屏轰,符號(hào)位為1時(shí),表示該數(shù)為負(fù)數(shù)憋飞。指數(shù)可以為負(fù)數(shù)霎苗,一般使用移碼表示,移碼表示為:
E為真實(shí)的指數(shù)搀崭,e為浮點(diǎn)數(shù)中存儲(chǔ)的尾數(shù),bias為移位猾编,有瘤睹。以單精度浮點(diǎn)為例,指數(shù)位數(shù)
答倡,則有bias=127轰传,真實(shí)指數(shù)和存儲(chǔ)的關(guān)系為
,表示范圍為-126~127(e=0和e=255用于表示特殊字符)瘪撇。尾數(shù)為規(guī)格化的尾數(shù)获茬,即尾數(shù)的二進(jìn)制表示
前有一個(gè)隱藏的二進(jìn)制1港庄,即如下表示:
當(dāng)e=0時(shí),該浮點(diǎn)數(shù)為非規(guī)格化數(shù)恕曲,表示的數(shù)如下所示:
該標(biāo)準(zhǔn)內(nèi)還定義了幾個(gè)特殊值:
特殊值 | 說(shuō)明 |
---|---|
0 | 指數(shù)部分和尾數(shù)部分均為1 |
無(wú)窮大 | 指數(shù)部分為 |
NaN | 指數(shù)部分為 |
浮點(diǎn)數(shù)計(jì)算
浮點(diǎn)數(shù)乘法
浮點(diǎn)數(shù)的乘法分為以下幾個(gè)步驟:
- 計(jì)算符號(hào)位:通過(guò)異或操作計(jì)算符號(hào)位佩谣,若兩個(gè)操作數(shù)符號(hào)位相同把还,則結(jié)果符號(hào)位為0,否則結(jié)果符號(hào)為1
- 計(jì)算原始尾數(shù):兩個(gè)操作數(shù)的尾數(shù)相乘茸俭,得到原始尾數(shù)
- 計(jì)算原始指數(shù):將兩個(gè)操作數(shù)的指數(shù)相加吊履,得到原始指數(shù)
- 規(guī)格化與舍入:對(duì)原始尾數(shù)和原始指數(shù)進(jìn)行規(guī)格化,獲得結(jié)果的指數(shù)调鬓,再對(duì)尾數(shù)進(jìn)行舍入艇炎,獲得結(jié)果的尾數(shù)
對(duì)于科學(xué)計(jì)數(shù)法表示的乘法,有:
現(xiàn)考慮32位的單精度浮點(diǎn)數(shù)(float)腾窝,其指數(shù)為8位缀踪,尾數(shù)為23位,獲得原始指數(shù)和原始尾數(shù)為:
- 原始指數(shù):原始指數(shù)為兩個(gè)8位的指數(shù)相加燕锥,共9位
- 原始尾數(shù):原始尾數(shù)為兩個(gè)23位的尾數(shù)相乘辜贵,共46位
獲得原始指數(shù)和尾數(shù)后進(jìn)行規(guī)格化,若原始指數(shù)小于-126归形,則小于表示范圍托慨,將原始尾數(shù)右移,每右移一位暇榴,原始指數(shù)+1厚棵,直到原始指數(shù)到達(dá)-126,此時(shí)形成非規(guī)格化數(shù)蔼紧。若原始尾數(shù)不小于-126婆硬,進(jìn)行正常的標(biāo)準(zhǔn)化:
- 兩個(gè)規(guī)格化數(shù)相乘:
,結(jié)果在1~4之間奸例,即最高2位有以下幾種可能性:
- 最高2位為
01
:原始尾數(shù)向左移位2位(包括移除隱含的1)彬犯,原始指數(shù)直接為獲得規(guī)格化的指數(shù),小數(shù)部分還剩44位查吊,在舍入部分處理谐区。若原始指數(shù)-2后為-127,則在移位后尾數(shù)前添加1逻卖,使用非規(guī)格化表示 - 最高2位為
10
或11
:原始尾數(shù)向左移位1位(移除隱含的1)宋列,原始指數(shù)+1獲得規(guī)格化的指數(shù),小數(shù)部分還剩45位评也,在舍入部分處理炼杖。
- 最高2位為
- 非規(guī)格數(shù)和規(guī)格化相乘:
灭返,結(jié)果在0~2之間,操作方式與上述類(lèi)似
- 非規(guī)格化數(shù)和非規(guī)格化數(shù)相乘:原始指數(shù)為-252坤邪,尾數(shù)部分僅有46位熙含,無(wú)論如何都不可能使指數(shù)規(guī)格化到-126,直接為0
進(jìn)行規(guī)格化后罩扇,原始指數(shù)被修正為指數(shù)婆芦,此時(shí)若尾數(shù)的位數(shù)超過(guò)23位,還需要進(jìn)行舍入操作喂饥。將規(guī)格化后的尾數(shù)使用
表示消约,
表示高23位的指數(shù),
表示24位以后尾數(shù)员帮。舍入使用“四舍六入”的方式或粮,舍入規(guī)則如下所示:
- 若
:拋棄,舍入結(jié)果為
(四舍)
- 若
:進(jìn)位捞高,舍入結(jié)果為
(六入)
- 若
:舍向偶數(shù)氯材,即使
變?yōu)榕紨?shù)(
為奇數(shù)時(shí)進(jìn)位,否則拋棄)
進(jìn)行舍入后硝岗,原始尾數(shù)被修正為尾數(shù)氢哮,乘法計(jì)算完成。
浮點(diǎn)數(shù)加法
浮點(diǎn)數(shù)的加法分為以下幾個(gè)步驟:
- 對(duì)階:將指數(shù)較小的浮點(diǎn)數(shù)進(jìn)行尾數(shù)向右移位型檀,指數(shù)同步增大冗尤,直到兩個(gè)操作數(shù)的指數(shù)等
- 求和:對(duì)尾數(shù)進(jìn)行求和
- 規(guī)格化:對(duì)指數(shù)和尾數(shù)做規(guī)格化,并對(duì)尾數(shù)進(jìn)行舍入
對(duì)于科學(xué)計(jì)數(shù)法表示的加法胀溺,有:
第一步為對(duì)階裂七,即將指數(shù)變?yōu)橄嗤詫?shí)現(xiàn)加法,規(guī)定小階向大階對(duì)階仓坞,即原始指數(shù)背零,對(duì)于指數(shù)較小的操作數(shù),需要將尾數(shù)向右移位无埃,每移動(dòng)一位徙瓶,指數(shù)加1,移位直到階數(shù)相等即完成對(duì)階嫉称,對(duì)階過(guò)程可表示為:
第二步為求和侦镇,即對(duì)階完成后,兩個(gè)尾數(shù)可以直接求和獲得原始尾數(shù)澎埠,求和過(guò)程如下所示:
第三步為規(guī)格化和舍入虽缕,原始尾數(shù)始藕,原始指數(shù)
蒲稳,對(duì)其進(jìn)行規(guī)格化和舍入操作氮趋,獲得新的指數(shù)
和尾數(shù)
,操作方式與乘法相同江耀,即完成浮點(diǎn)數(shù)的加法剩胁。