• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            統(tǒng)計(jì)

            • 隨筆 - 50
            • 文章 - 42
            • 評(píng)論 - 147
            • 引用 - 0

            留言簿(6)

            隨筆分類

            文章分類

            Link

            搜索

            •  

            積分與排名

            • 積分 - 165513
            • 排名 - 159

            最新評(píng)論

            閱讀排行榜

            評(píng)論排行榜

            解讀IEEE標(biāo)準(zhǔn)754:浮點(diǎn)數(shù)表示
            一、背景
              在IEEE標(biāo)準(zhǔn)754之前,業(yè)界并沒有一個(gè)統(tǒng)一的浮點(diǎn)數(shù)標(biāo)準(zhǔn),相反,很多計(jì)算機(jī)制造商都設(shè)計(jì)自己的浮點(diǎn)數(shù)規(guī)則,以及運(yùn)算細(xì)節(jié)。那時(shí),實(shí)現(xiàn)的速度和簡(jiǎn)易性比數(shù)字的精確性更受重視。
              直到1985年Intel打算為其的8086微處理器引進(jìn)一種浮點(diǎn)數(shù)協(xié)處理器的時(shí)候,聰明地意識(shí)到,作為設(shè)計(jì)芯片者的電子工程師和固體物理學(xué)家們,也許并不能通過(guò)數(shù)值分析來(lái)選擇最合理的浮點(diǎn)數(shù)二進(jìn)制格式。于是Intel在請(qǐng)加州大學(xué)伯克利分校的 WilliamKahan教授──最優(yōu)秀的數(shù)值分析家之一來(lái)為8087 FPU設(shè)計(jì)浮點(diǎn)數(shù)格式;而這個(gè)家伙又找來(lái)兩個(gè)專家來(lái)協(xié)助他,于是就有了KCS組合(Kahn, Coonan, andStone)。 他們共同完成了Intel的浮點(diǎn)數(shù)格式設(shè)計(jì),而且完成地如此出色,以致于IEEE組織決定采用一個(gè)非常接近KCS的方案作為IEEE的標(biāo)準(zhǔn)浮點(diǎn)格式。目前,幾乎所有計(jì)算機(jī)都支持該標(biāo)準(zhǔn),大大改善了科學(xué)應(yīng)用程序的可移植性。

            二、表示形式
              從表面上看,浮點(diǎn)數(shù)也是一串0和1構(gòu)成的位序列(bit sequence),并不是三頭六臂的怪物,更不會(huì)咬人。然而IEEE標(biāo)準(zhǔn)從邏輯上用三元組{S,E,M}表示一個(gè)數(shù)N,如下圖所示:  N的實(shí)際值n由下列式子表示:

            其中:
              ★ n,s,e,m分別為N,S,E,M對(duì)應(yīng)的實(shí)際數(shù)值,而N,S,E,M僅僅是一串二進(jìn)制位。
              ★ S(sign)表示N的符號(hào)位。對(duì)應(yīng)值s滿足:n>0時(shí),s=0; n<0時(shí),s=1。
              ★ E(exponent)表示N的指數(shù)位,位于S和M之間的若干位。對(duì)應(yīng)值e值也可正可負(fù)。
              ★ M(mantissa)表示N的尾數(shù)位,恰好,它位于N末尾。M也叫有效數(shù)字位(sinificand)、系數(shù)位(coefficient), 甚至被稱作“小數(shù)”。

            三、浮點(diǎn)數(shù)格式

              IEEE標(biāo)準(zhǔn)754規(guī)定了三種浮點(diǎn)數(shù)格式:?jiǎn)尉取㈦p精度、擴(kuò)展精度。前兩者正好對(duì)應(yīng)C語(yǔ)言里頭的float、double或者FORTRAN里頭的real、double精度類型。限于篇幅,本文僅介紹單精度、雙精度浮點(diǎn)格式。
              ★ 單精度:N共32位,其中S占1位,E占8位,M占23位。
              ★ 雙精度:N共64位,其中S占1位,E占11位,M占52位。


                  值得注意的是,M雖然是23位或者52位,但它們只是表示小數(shù)點(diǎn)之后的二進(jìn)制位數(shù),也就是說(shuō),假定M為“010110011...”,在二進(jìn)制數(shù)值上其實(shí)是“.010110011...”。而事實(shí)上,標(biāo)準(zhǔn)規(guī)定小數(shù)點(diǎn)左邊還有一個(gè)隱含位,這個(gè)隱含位通常,哦不,應(yīng)該說(shuō)絕大多數(shù)情況下是1,那什么情況下是0呢?答案是N對(duì)應(yīng)的n非常小的時(shí)候,比如小于2^(-126)(32位單精度浮點(diǎn)數(shù))。不要困惑怎么計(jì)算出來(lái)的,看到后面你就會(huì)明白。總之,隱含位算是賺來(lái)了一位精度,于是M對(duì)應(yīng)的m最后結(jié)果可能是"m=1.010110011...”或者“m=0.010110011...”

            四、計(jì)算e、m
              首先將提到令初學(xué)者頭疼的“規(guī)格化(normalized)”、“非規(guī)格化(denormalized)”。噢,其實(shí)并沒有這么難的,跟我來(lái)!掌握它以后你會(huì)發(fā)現(xiàn)一切都很優(yōu)雅,更美妙的是,規(guī)格化、非規(guī)格化本身的概念幾乎不怎么重要。請(qǐng)牢記這句話:規(guī)格化與否全看指數(shù)E!
              下面分三種情況討論E,并分別計(jì)算e和m:
              
              1、規(guī)格化:當(dāng)E的二進(jìn)制位不全為0,也不全為1時(shí),N為規(guī)格化形式。此時(shí)e被解釋為表示偏置(biased)形式的整數(shù),e值計(jì)算公式如下圖所示:

              上圖中,|E|表示E的二進(jìn)制序列表示的整數(shù)值,例如E為"10000100",則|E|=132,e=132-127=5 。 k則表示E的位數(shù),對(duì)單精度來(lái)說(shuō),k=8,則bias=127,對(duì)雙精度來(lái)說(shuō),k=11,則bias=1023。
              此時(shí)m的計(jì)算公式如下圖所示:
              

              標(biāo)準(zhǔn)規(guī)定此時(shí)小數(shù)點(diǎn)左側(cè)的隱含位為1,那么m=|1.M|。如M="101",則|1.M|=|1.101|=1.625,即 m=1.625

              2、非規(guī)格化:當(dāng)E的二進(jìn)制位全部為0時(shí),N為非規(guī)格化形式。此時(shí)e,m的計(jì)算都非常簡(jiǎn)單。

              注意,此時(shí)小數(shù)點(diǎn)左側(cè)的隱含位為0。 為什么e會(huì)等于(1-bias)而不是(-bias),這主要是為規(guī)格化數(shù)值、非規(guī)格化數(shù)值之間的平滑過(guò)渡設(shè)計(jì)的。后文我們還會(huì)繼續(xù)討論。
              有了非規(guī)格化形式,我們就可以表示0了。把符號(hào)位S值1,其余所有位均置0后,我們得到了 -0.0; 同理,把所有位均置0,則得到+0.0。非規(guī)格化數(shù)還有其他用途,比如表示非常接近0的小數(shù),而且這些小數(shù)均勻地接近0,稱為“逐漸下溢(graduallyunderflow)”屬性。
              
              3、特殊數(shù)值: 當(dāng)E的二進(jìn)制位全為1時(shí)為特殊數(shù)值。此時(shí),若M的二進(jìn)制位全為0,則n表示無(wú)窮大,若S為1則為負(fù)無(wú)窮大,若S為0則為正無(wú)窮大; 若M的二進(jìn)制位不全為0時(shí),表示NaN(Not a Number),表示這不是一個(gè)合法實(shí)數(shù)或無(wú)窮,或者該數(shù)未經(jīng)初始化。
              
            五、范例
              仔細(xì)研讀第四點(diǎn)后,再回憶一下文章開頭計(jì)算n的公式,你應(yīng)該寫出一個(gè)浮點(diǎn)編碼的實(shí)際值n了吧?還不能嗎?不急,我先給你示范一下。我們假定N是一個(gè)8位浮點(diǎn)數(shù),其中,S占1位,E占4位,M占3位。下面這張表羅列了N可能的正數(shù)形式,也包含了e、m等值,請(qǐng)你對(duì)照著這張表,重溫一下第四點(diǎn),你會(huì)慢慢明白的。說(shuō)實(shí)在的,這張表花了我不少功夫呢,幸好TeX畫表格還算省事! 
              

              這張表里頭有很多有趣的地方,我提醒一下:
              ★ 看 N 列,從上到下,二進(jìn)制位表示是均勻遞增的,且增量都是一個(gè)最小二進(jìn)制位。這不是偶然,正是巧妙設(shè)計(jì)的結(jié)果。觀察最大的非規(guī)格數(shù),發(fā)現(xiàn)恰好就是M全為1, E全為0的情況。于是我們求出最大的非規(guī)格數(shù)為:

              上面的公式中,h為M的位數(shù)(如范例中為3)。注意,公式等號(hào)右邊的第一項(xiàng)同時(shí)又是最小規(guī)格數(shù)的值(如范例中為 8/512 );第二項(xiàng)則正是最小非規(guī)格數(shù)的值(如范例中為1/512)即該浮點(diǎn)數(shù)能表示的最小正數(shù)。
              ★ 看 m 列,規(guī)格化數(shù)都是 1+ x 的形式,這個(gè)1正是隱含位1; 而非規(guī)格化數(shù)隱含位為0, 所以沒有 "1+" 。
              ★ 看 n 列,非規(guī)格化數(shù)從上到下的增量都是 1/512,且過(guò)渡到規(guī)格化數(shù)時(shí),增量是平滑的,依舊是1/512。這正是非規(guī)格化數(shù)中e等于(1-bias)而不是(-bias)的緣故,也是巧妙設(shè)計(jì)的結(jié)果。再繼續(xù)往下看,發(fā)現(xiàn)增量值逐漸增大。可見,浮點(diǎn)數(shù)的取值范圍不是均勻的。
              
            六、實(shí)戰(zhàn)
              我們用一小段匯編來(lái)測(cè)試一下,浮點(diǎn)數(shù)在內(nèi)存中是如何表示的。測(cè)試環(huán)境: GentooLinux2006.0/GNU assembler version 2.16.1/GNU gdb 6.4/AMD XP1600+。 如下所示
            代碼:

            ~/coding/assemble $  gdb float
            GNU gdb 6.4
            Copyright 2005 Free Software Foundation, Inc.
            GDB is free software, covered by the GNU General Public License, and you are
            welcome to change it and/or distribute copies of it under certain conditions.
            Type "show copying" to see the conditions.
            There is absolutely no warranty for GDB.  Type "show warranty" for details.
            This GDB was configured as "i686-pc-linux-gnu"...Using host libthread_db library "/lib/libthread_db.so.1".

            (gdb) list
            1 .section .data
            2 f1:
            3     .float  5
            4 f2:
            5     .float  0.1   
            6 .section .text
            7     .global _start
            8 _start:
            9     nop
            10
            (gdb) x/f &f1
            0x80490a4 <f1>: 5
            (gdb) x/xw &f1
            0x80490a4 <f1>: 0x40a00000
            (gdb) x/f &f2
            0x80490a8 <f2>: 0.100000001
            (gdb) x/xw &f2
            0x80490a8 <f2>: 0x3dcccccd
            (gdb)



              從上面的gdb命令結(jié)果可以看出,浮點(diǎn)數(shù)5被表示為 0x40a00000,二進(jìn)制形式為( 0100 0000 1010 0000 ... 0000 0000)。紅色數(shù)字為E,可以看出|E|=129>0, 則e=129-bias=129-127=2 ; 藍(lán)色數(shù)字為M,且|E|>0,說(shuō)明是規(guī)格化數(shù),則m=|1.M|=|1.01000..000|=1.25 ; 由n的計(jì)算公式可以求得 n=(-1)^0 *1.25 * 2^2 = 5, 結(jié)果被驗(yàn)證了。
              同樣,你也可以驗(yàn)證一下十進(jìn)制浮點(diǎn)數(shù)0.1的二進(jìn)制形式是否正確,你會(huì)發(fā)現(xiàn),0.1不能表示為有限個(gè)二進(jìn)制位,因此在內(nèi)存中的表示是舍入(rounding)以后的結(jié)果,即 0x3dcccccd, 十進(jìn)制為0.100000001, 誤差0.000000001由此產(chǎn)生了。

            posted on 2009-10-11 23:46 pear_li 閱讀(973) 評(píng)論(0)  編輯 收藏 引用 所屬分類: Algorithm

            婷婷久久五月天| 亚洲国产视频久久| 久久99国产综合精品| 久久狠狠色狠狠色综合| 国内精品久久久久久久影视麻豆| 国产精品美女久久久网AV| 久久久久久一区国产精品| 亚洲欧美成人综合久久久| 国产精品欧美亚洲韩国日本久久| 深夜久久AAAAA级毛片免费看| 日本久久久久亚洲中字幕 | 91精品国产9l久久久久| 久久精品不卡| 国产高潮国产高潮久久久| 色婷婷久久综合中文久久一本| 久久久噜噜噜久久中文字幕色伊伊| 国内精品久久久久久久97牛牛| 久久精品国产一区二区三区| 久久亚洲日韩精品一区二区三区| 久久久无码精品亚洲日韩软件| 亚洲AV无码成人网站久久精品大| 久久久久亚洲精品男人的天堂 | 久久久久亚洲AV片无码下载蜜桃| 久久国产精品99精品国产| 久久久高清免费视频| 9999国产精品欧美久久久久久| 国内精品伊人久久久久av一坑| 国产一区二区久久久| 亚洲国产成人精品91久久久 | 久久久精品久久久久影院| 久久久网中文字幕| 久久精品国产清自在天天线| 免费观看成人久久网免费观看| 成人久久精品一区二区三区| 香蕉久久av一区二区三区| 久久久久久亚洲AV无码专区| 亚洲熟妇无码另类久久久| 人妻精品久久久久中文字幕69| 久久无码人妻一区二区三区午夜 | 久久99久久成人免费播放| 国产69精品久久久久9999|