浮點(diǎn)數(shù)處理

本文首發(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ǔ)的格式如下:

float.png

浮點(diǎn)數(shù)由符號(hào)位,指數(shù)位和尾數(shù)三個(gè)部分組成黔寇,表達(dá)公式如下式:
X = (-1)^{s} \times f \times 2^{e}
在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 = e- bias
E為真實(shí)的指數(shù)搀崭,e為浮點(diǎn)數(shù)中存儲(chǔ)的尾數(shù),bias為移位猾编,有bias = 2^{len(e) - 1} - 1瘤睹。以單精度浮點(diǎn)為例,指數(shù)位數(shù)len(e) = 8答倡,則有bias=127轰传,真實(shí)指數(shù)和存儲(chǔ)的關(guān)系為E = e - 127,表示范圍為-126~127(e=0和e=255用于表示特殊字符)瘪撇。尾數(shù)為規(guī)格化的尾數(shù)获茬,即尾數(shù)的二進(jìn)制表示f_b前有一個(gè)隱藏的二進(jìn)制1港庄,即如下表示:
X = (-1)^{s} \times 1.f_b \times 2^{e-bias}
當(dāng)e=0時(shí),該浮點(diǎn)數(shù)為非規(guī)格化數(shù)恕曲,表示的數(shù)如下所示:
X = (-1)^s \times 0.f_b \times 2^{-126}
該標(biāo)準(zhǔn)內(nèi)還定義了幾個(gè)特殊值:

特殊值 說(shuō)明
0 指數(shù)部分和尾數(shù)部分均為1
無(wú)窮大 指數(shù)部分為2^{len(e)} - 1(指數(shù)最大值)鹏氧,尾數(shù)部分為0
NaN 指數(shù)部分為2^{len(e)} - 1(指數(shù)最大值),尾數(shù)部分不為0

浮點(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ù)
mul_flow.png

對(duì)于科學(xué)計(jì)數(shù)法表示的乘法,有:
[(-1)^{s_1} \times 1.f_1 \times 2^{e_1}] \times [(-1)^{s_2} \times 1.f_2 \times 2^{e_2}] = (-1)^{s_1 \ XOR \ s_2} \times (1.f_1\times 1.f_2) \times 2^{e_1+e_2}
現(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ù)相乘:1.f_1 \times 1.f_2,結(jié)果在1~4之間奸例,即最高2位有以下幾種可能性:
    • 最高2位為01:原始尾數(shù)向左移位2位(包括移除隱含的1)彬犯,原始指數(shù)直接為獲得規(guī)格化的指數(shù),小數(shù)部分還剩44位查吊,在舍入部分處理谐区。若原始指數(shù)-2后為-127,則在移位后尾數(shù)前添加1逻卖,使用非規(guī)格化表示
    • 最高2位為1011:原始尾數(shù)向左移位1位(移除隱含的1)宋列,原始指數(shù)+1獲得規(guī)格化的指數(shù),小數(shù)部分還剩45位评也,在舍入部分處理炼杖。
  • 非規(guī)格數(shù)和規(guī)格化相乘:1.f_1 \times 0.f_2灭返,結(jié)果在0~2之間,操作方式與上述類(lèi)似
  • 非規(guī)格化數(shù)和非規(guī)格化數(shù)相乘:原始指數(shù)為-252坤邪,尾數(shù)部分僅有46位熙含,無(wú)論如何都不可能使指數(shù)規(guī)格化到-126,直接為0

進(jìn)行規(guī)格化后罩扇,原始指數(shù)被修正為指數(shù)e_3婆芦,此時(shí)若尾數(shù)的位數(shù)超過(guò)23位,還需要進(jìn)行舍入操作喂饥。將規(guī)格化后的尾數(shù)使用sf表示消约,sf[h:h-23]表示高23位的指數(shù),sf[h-24:0]表示24位以后尾數(shù)员帮。舍入使用“四舍六入”的方式或粮,舍入規(guī)則如下所示:

  • sf[h-24:0] < 1000...0:拋棄,舍入結(jié)果為sf[h:h-23](四舍)
  • sf[h-24:0] > 1000...0:進(jìn)位捞高,舍入結(jié)果為sf[h:h-23]+1(六入)
  • sf[h-24:0] == 1000...0:舍向偶數(shù)氯材,即使sf[h:h-23]變?yōu)榕紨?shù)(sf[h:h-23]為奇數(shù)時(shí)進(jìn)位,否則拋棄)

進(jìn)行舍入后硝岗,原始尾數(shù)被修正為尾數(shù)f_3氢哮,乘法計(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)行舍入
add_flow.png

對(duì)于科學(xué)計(jì)數(shù)法表示的加法胀溺,有:
[(-1)^{s_1} \times 1.f_1 \times 2^{e_1}] + [(-1)^{s_2} \times 1.f_2 \times 2^{e_2}] = [(-1)^{s_1} \times 1.f_1 \times 2^{e_1-e_2}+ (-1)^{s_2} \times 1.f_2] \times 2^{e_2}
第一步為對(duì)階裂七,即將指數(shù)變?yōu)橄嗤詫?shí)現(xiàn)加法,規(guī)定小階向大階對(duì)階仓坞,即原始指數(shù)e=\max\{e_1,e_2\}背零,對(duì)于指數(shù)較小的操作數(shù),需要將尾數(shù)向右移位无埃,每移動(dòng)一位徙瓶,指數(shù)加1,移位直到階數(shù)相等即完成對(duì)階嫉称,對(duì)階過(guò)程可表示為:
\begin{cases}(-1)^{s_1} \times 1.f_1 \times 2^{e_1} \\ (-1)^{s_2} \times 1.f_2 \times 2^{e_2}\end{cases} \to \begin{cases}[(-1)^{s_1} \times 1.f_1 \times 2^{e_1 - \max\{e_1,e_2\}}] \times 2^{\max\{e_1,e_2\}} \\ [(-1)^{s_2} \times 1.f_2 \times 2^{e_2 - \max\{e_1,e_2\}}] \times 2^{\max\{e_1,e_2\}}\end{cases}
第二步為求和侦镇,即對(duì)階完成后,兩個(gè)尾數(shù)可以直接求和獲得原始尾數(shù)澎埠,求和過(guò)程如下所示:
\begin{cases}[(-1)^{s_1} \times 1.f_1 \times 2^{e_1 - \max\{e_1,e_2\}}] \times 2^{\max\{e_1,e_2\}} \\ [(-1)^{s_2} \times 1.f_2 \times 2^{e_2 - \max\{e_1,e_2\}}] \times 2^{\max\{e_1,e_2\}}\end{cases} \to \\ [(-1)^{s_1} \times 1.f_1 \times 2^{e_1 - \max\{e_1,e_2\}} + (-1)^{s_2} \times 1.f_2 \times 2^{e_2 - \max\{e_1,e_2\}}] \times 2^{\max\{e_1,e_2\}}
第三步為規(guī)格化和舍入虽缕,原始尾數(shù)f = (-1)^{s_1} \times 1.f_1 \times 2^{e_1 - \max\{e_1,e_2\}} + (-1)^{s_2} \times 1.f_2 \times 2^{e_2 - \max\{e_1,e_2\}}始藕,原始指數(shù)e=\max\{e_1,e_2\}蒲稳,對(duì)其進(jìn)行規(guī)格化和舍入操作氮趋,獲得新的指數(shù)e_3和尾數(shù)f_3,操作方式與乘法相同江耀,即完成浮點(diǎn)數(shù)的加法剩胁。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市祥国,隨后出現(xiàn)的幾起案子昵观,更是在濱河造成了極大的恐慌,老刑警劉巖舌稀,帶你破解...
    沈念sama閱讀 223,126評(píng)論 6 520
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件啊犬,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡壁查,警方通過(guò)查閱死者的電腦和手機(jī)觉至,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,421評(píng)論 3 400
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)睡腿,“玉大人语御,你說(shuō)我怎么就攤上這事∠郑” “怎么了应闯?”我有些...
    開(kāi)封第一講書(shū)人閱讀 169,941評(píng)論 0 366
  • 文/不壞的土叔 我叫張陵,是天一觀(guān)的道長(zhǎng)挂捻。 經(jīng)常有香客問(wèn)我碉纺,道長(zhǎng),這世上最難降的妖魔是什么细层? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 60,294評(píng)論 1 300
  • 正文 為了忘掉前任惜辑,我火速辦了婚禮,結(jié)果婚禮上疫赎,老公的妹妹穿的比我還像新娘盛撑。我一直安慰自己,他們只是感情好捧搞,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,295評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布抵卫。 她就那樣靜靜地躺著,像睡著了一般胎撇。 火紅的嫁衣襯著肌膚如雪介粘。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 52,874評(píng)論 1 314
  • 那天晚树,我揣著相機(jī)與錄音姻采,去河邊找鬼。 笑死爵憎,一個(gè)胖子當(dāng)著我的面吹牛慨亲,可吹牛的內(nèi)容都是我干的婚瓜。 我是一名探鬼主播,決...
    沈念sama閱讀 41,285評(píng)論 3 424
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼刑棵,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼巴刻!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起蛉签,我...
    開(kāi)封第一講書(shū)人閱讀 40,249評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤胡陪,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后碍舍,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體柠座,經(jīng)...
    沈念sama閱讀 46,760評(píng)論 1 321
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,840評(píng)論 3 343
  • 正文 我和宋清朗相戀三年片橡,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了愚隧。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,973評(píng)論 1 354
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡锻全,死狀恐怖狂塘,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情鳄厌,我是刑警寧澤荞胡,帶...
    沈念sama閱讀 36,631評(píng)論 5 351
  • 正文 年R本政府宣布,位于F島的核電站了嚎,受9級(jí)特大地震影響泪漂,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜歪泳,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,315評(píng)論 3 336
  • 文/蒙蒙 一萝勤、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧呐伞,春花似錦敌卓、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,797評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至癣防,卻和暖如春蜗巧,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背蕾盯。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,926評(píng)論 1 275
  • 我被黑心中介騙來(lái)泰國(guó)打工幕屹, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,431評(píng)論 3 379
  • 正文 我出身青樓望拖,卻偏偏與公主長(zhǎng)得像迅腔,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子靠娱,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,982評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容