• <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)計

            • 隨筆 - 50
            • 文章 - 42
            • 評論 - 147
            • 引用 - 0

            留言簿(6)

            隨筆分類

            文章分類

            Link

            搜索

            •  

            積分與排名

            • 積分 - 166404
            • 排名 - 159

            最新評論

            閱讀排行榜

            評論排行榜

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

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

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

            三、浮點數(shù)格式

              IEEE標準754規(guī)定了三種浮點數(shù)格式:單精度、雙精度、擴展精度。前兩者正好對應C語言里頭的float、double或者FORTRAN里頭的real、double精度類型。限于篇幅,本文僅介紹單精度、雙精度浮點格式。
              ★ 單精度:N共32位,其中S占1位,E占8位,M占23位。
              ★ 雙精度:N共64位,其中S占1位,E占11位,M占52位。


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

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

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

              標準規(guī)定此時小數(shù)點左側的隱含位為1,那么m=|1.M|。如M="101",則|1.M|=|1.101|=1.625,即 m=1.625

              2、非規(guī)格化:當E的二進制位全部為0時,N為非規(guī)格化形式。此時e,m的計算都非常簡單。

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

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

              上面的公式中,h為M的位數(shù)(如范例中為3)。注意,公式等號右邊的第一項同時又是最小規(guī)格數(shù)的值(如范例中為 8/512 );第二項則正是最小非規(guī)格數(shù)的值(如范例中為1/512)即該浮點數(shù)能表示的最小正數(shù)。
              ★ 看 m 列,規(guī)格化數(shù)都是 1+ x 的形式,這個1正是隱含位1; 而非規(guī)格化數(shù)隱含位為0, 所以沒有 "1+" 。
              ★ 看 n 列,非規(guī)格化數(shù)從上到下的增量都是 1/512,且過渡到規(guī)格化數(shù)時,增量是平滑的,依舊是1/512。這正是非規(guī)格化數(shù)中e等于(1-bias)而不是(-bias)的緣故,也是巧妙設計的結果。再繼續(xù)往下看,發(fā)現(xiàn)增量值逐漸增大。可見,浮點數(shù)的取值范圍不是均勻的。
              
            六、實戰(zhàn)
              我們用一小段匯編來測試一下,浮點數(shù)在內存中是如何表示的。測試環(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命令結果可以看出,浮點數(shù)5被表示為 0x40a00000,二進制形式為( 0100 0000 1010 0000 ... 0000 0000)。紅色數(shù)字為E,可以看出|E|=129>0, 則e=129-bias=129-127=2 ; 藍色數(shù)字為M,且|E|>0,說明是規(guī)格化數(shù),則m=|1.M|=|1.01000..000|=1.25 ; 由n的計算公式可以求得 n=(-1)^0 *1.25 * 2^2 = 5, 結果被驗證了。
              同樣,你也可以驗證一下十進制浮點數(shù)0.1的二進制形式是否正確,你會發(fā)現(xiàn),0.1不能表示為有限個二進制位,因此在內存中的表示是舍入(rounding)以后的結果,即 0x3dcccccd, 十進制為0.100000001, 誤差0.000000001由此產生了。

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

            五月丁香综合激情六月久久 | 国产亚洲精久久久久久无码| 欧美日韩精品久久久免费观看| 久久精品国产男包| 狠狠色丁香婷综合久久| 欧美与黑人午夜性猛交久久久 | 久久人人爽人人爽人人片AV麻豆| 久久久久99这里有精品10| 99久久99久久| 性欧美大战久久久久久久久| 国产99久久九九精品无码| 久久99久久99精品免视看动漫| 99久久婷婷国产一区二区| 久久亚洲国产成人精品性色| 久久久噜噜噜久久| 国产一级持黄大片99久久| 婷婷五月深深久久精品| 久久成人小视频| 久久久久18| 久久se精品一区二区影院| 99久久亚洲综合精品网站| 久久午夜无码鲁丝片| 久久久黄色大片| 大香伊人久久精品一区二区| 国内精品久久久久久久涩爱 | 久久精品中文闷骚内射| 囯产精品久久久久久久久蜜桃| 久久久久久久综合综合狠狠| 精品久久久久久久久久中文字幕 | 综合网日日天干夜夜久久| 人妻少妇精品久久| 久久人人超碰精品CAOPOREN| 久久有码中文字幕| 日本国产精品久久| 尹人香蕉久久99天天拍| 亚洲色欲久久久综合网| 一本色道久久88—综合亚洲精品| 人妻无码αv中文字幕久久琪琪布| 久久人与动人物a级毛片| 久久天天躁狠狠躁夜夜躁2O2O| 久久婷婷国产综合精品 |