版權歸原作者所有,如有侵權,請聯(lián)系我們

[科普中國]-IEEE 754

科學百科
原創(chuàng)
科學百科為用戶提供權威科普內(nèi)容,打造知識科普陣地
收藏

IEEE二進制浮點數(shù)算術標準IEEE 754)是20世紀80年代以來最廣泛使用的浮點數(shù)運算標準,為許多CPU與浮點運算器所采用。這個標準定義了表示浮點數(shù)的格式(包括負零-0)與反常值(denormal number)),一些特殊數(shù)值(無窮(Inf)與非數(shù)值(NaN)),以及這些數(shù)值的“浮點數(shù)運算符”;它也指明了四種數(shù)值舍入規(guī)則和五種例外狀況(包括例外發(fā)生的時機與處理方式)。

IEEE 754規(guī)定了四種表示浮點數(shù)值的方式:單精確度(32位)、雙精確度(64位)、延伸單精確度(43比特以上,很少使用)與延伸雙精確度(79比特以上,通常以80位實現(xiàn))。只有32位模式有強制要求,其他都是選擇性的。大部分編程語言都有提供IEEE浮點數(shù)格式與算術,但有些將其列為非必需的。例如,IEEE 754問世之前就有的C語言,現(xiàn)在有包括IEEE算術,但不算作強制要求(C語言的float通常是指IEEE單精確度,而double是指雙精確度)。

該標準的全稱為IEEE二進制浮點數(shù)算術標準(ANSI/IEEE Std 754-1985),又稱IEC 60559:1989,微處理器系統(tǒng)的二進制浮點數(shù)算術(本來的編號是IEC 559:1989)。后來還有“與基數(shù)無關的浮點數(shù)”的“IEEE 854-1987標準”,有規(guī)定基數(shù)為2跟10的狀況?,F(xiàn)在最新標準是“ISO/IEC/IEEE FDIS 60559:2010”。

浮點數(shù)剖析一個浮點數(shù) (Value) 的表示其實可以這樣表示:

也就是浮點數(shù)的實際值,等于符號位(sign bit)乘以指數(shù)偏移值(exponent bias)再乘以分數(shù)值(fraction)。

以下內(nèi)文是IEEE 754對浮點數(shù)格式的描述。

本文表示比特的約定把W個比特(bit)的數(shù)據(jù),從內(nèi)存地址低端到高端,以0到W?1編碼。通常將內(nèi)存地址低端的比特寫在最右邊,稱作最低有效位(Least Significant Bit,LSB),代表最小的比特,改變時對整體數(shù)值影響最小的比特。聲明這一點的必要性在于X86體系架構是小端序的數(shù)據(jù)存儲。

對于十進制整數(shù)N,必要時表示為N10以與二進制的數(shù)的表示N2相區(qū)分。

對于一個數(shù),其二進制科學計數(shù)法表示下的指數(shù)的值,下文稱之為指數(shù)的實際值;而根據(jù)IEEE 754標準對指數(shù)部分的編碼的值,稱之為浮點數(shù)表示法指數(shù)域的編碼值。

整體呈現(xiàn)

指數(shù)偏差

指數(shù)偏差(表示法中的指數(shù)為實際指數(shù)減掉某個值)為 ,其中的e為存儲指數(shù)的比特的長度。減掉一個值因為指數(shù)必須是有號數(shù)才能表達很大或很小的數(shù)值,但是有號數(shù)通常的表示法——補碼(two's complement),將會使比較變得困難。為了解決這個問題,指數(shù)在存儲之前需要做偏差修正,將它的值調(diào)整到一個無符號數(shù)的范圍內(nèi)以便進行比較。此外,指數(shù)采用這種方法表示的優(yōu)點還在于使得浮點數(shù)的正規(guī)形式和非正規(guī)形式之間有了一個平滑的轉變。指數(shù)偏差

指數(shù)偏移值

指數(shù)偏移值(exponent bias),是指浮點數(shù)表示法中的指數(shù)域的編碼值為指數(shù)的實際值加上某個固定的值,IEEE 754標準規(guī)定該固定值為 ,其中的 為存儲指數(shù)的比特的長度。

以單精度浮點數(shù)為例,它的指數(shù)域是8個比特,固定偏移值是 。此為有號數(shù)的表示方式,單精度浮點數(shù)的指數(shù)部分實際取值是從-128到127。例如指數(shù)實際值為 ,在單精度浮點數(shù)中的指數(shù)域編碼值為 ,即 。

采用指數(shù)的實際值加上固定的偏移值的辦法表示浮點數(shù)的指數(shù),好處是可以用長度為 個比特的無符號整數(shù)來表示所有的指數(shù)取值,這使得兩個浮點數(shù)的指數(shù)大小的比較更為容易,實際上可以按照字典序比較兩個浮點表示的大小。

這種移碼表示的指數(shù)部分,中文稱作階碼。

規(guī)約形式的浮點數(shù)

如果浮點數(shù)中指數(shù)部分的編碼值在 之間,且在科學表示法的表示方式下,分數(shù) (fraction) 部分最高有效位(即整數(shù)字)是1,那么這個浮點數(shù)將被稱為規(guī)約形式的浮點數(shù)?!耙?guī)約”是指用唯一確定的浮點形式去表示一個值。

由于這種表示下的尾數(shù)有一位隱含的二進制有效數(shù)字,為了與二進制科學計數(shù)法的尾數(shù)(mantissa)相區(qū)別,IEEE754稱之為有效數(shù)(significant)。

舉例來說,雙精度 (64-bit) 的規(guī)約形式浮點數(shù)在指數(shù)偏移值的值域為 (11-bit) 到 ,在分數(shù)部分則是 (52-bit)。

非規(guī)約形式的浮點數(shù)

如果浮點數(shù)的指數(shù)部分的編碼值是0,分數(shù)部分非零,那么這個浮點數(shù)將被稱為非規(guī)約形式的浮點數(shù)。一般是某個數(shù)字相當接近零時才會使用非規(guī)約型式來表示。 IEEE 754標準規(guī)定:非規(guī)約形式的浮點數(shù)的指數(shù)偏移值比規(guī)約形式的浮點數(shù)的指數(shù)偏移值小1。例如,最小的規(guī)約形式的單精度浮點數(shù)的指數(shù)部分編碼值為1,指數(shù)的實際值為-126;而非規(guī)約的單精度浮點數(shù)的指數(shù)域編碼值為0,對應的指數(shù)實際值也是-126而不是-127。實際上非規(guī)約形式的浮點數(shù)仍然是有效可以使用的,只是它們的絕對值已經(jīng)小于所有的規(guī)約浮點數(shù)的絕對值;即所有的非規(guī)約浮點數(shù)比規(guī)約浮點數(shù)更接近0。規(guī)約浮點數(shù)的尾數(shù)大于等于1且小于2,而非規(guī)約浮點數(shù)的尾數(shù)小于1且大于0。

除了規(guī)約浮點數(shù),IEEE754-1985標準采用非規(guī)約浮點數(shù),用來解決填補絕對值意義下最小規(guī)格數(shù)與零的距離。(舉例說,正數(shù)下,最大的非規(guī)格數(shù)等于最小的規(guī)格數(shù)。而一個浮點數(shù)編碼中,如果exponent=0,且尾數(shù)部分不為零,那么就按照非規(guī)約浮點數(shù)來解析)非規(guī)約浮點數(shù)源于70年代末IEEE浮點數(shù)標準化專業(yè)技術委員會醞釀浮點數(shù)二進制標準時,Intel公司對漸進式下溢出(gradual underflow)的力薦。當時十分流行的DECVAX機的浮點數(shù)表示采用了突然式下溢出(abrupt underflow)。如果沒有漸進式下溢出,那么0與絕對值最小的浮點數(shù)之間的距離(gap)將大于相鄰的小浮點數(shù)之間的距離。例如單精度浮點數(shù)的絕對值最小的規(guī)約浮點數(shù)是 ,它與絕對值次小的規(guī)約浮點數(shù)之間的距離為 。如果不采用漸進式下溢出,那么絕對值最小的規(guī)約浮點數(shù)與0的距離是相鄰的小浮點數(shù)之間距離的 倍!可以說是非常突然的下溢出到0。這種情況的一種糟糕后果是:兩個不等的小浮點數(shù)X與Y相減,結果將是0.訓練有素的數(shù)值分析人員可能會適應這種限制情況,但對于普通的程序員就很容易陷入錯誤了。采用了漸進式下溢出后將不會出現(xiàn)這種情況。例如對于單精度浮點數(shù),指數(shù)部分實際最小值是(-126),對應的尾數(shù)部分從 , 一直到 相鄰兩小浮點數(shù)之間的距離(gap)都是 ;而與0最近的浮點數(shù)(即最小的非規(guī)約數(shù))也是 。

特殊值

這里有三個特殊值需要指出:

如果指數(shù)是0并且尾數(shù)的小數(shù)部分是0,這個數(shù)±0(和符號位相關)

如果指數(shù)= 并且尾數(shù)的小數(shù)部分是0,這個數(shù)是±∞(同樣和符號位相關)

如果指數(shù)= 并且尾數(shù)的小數(shù)部分非0,這個數(shù)表示為不是一個數(shù)(NaN)。

以上規(guī)則,總結如下:

|| ||

32位單精度

單精度二進制小數(shù),使用32個比特存儲。

|| ||

S為符號位,Exp為指數(shù)字,F(xiàn)raction為有效數(shù)字。 指數(shù)部分即使用所謂的偏正值形式表示,偏正值為實際的指數(shù)大小與一個固定值(32位的情況是127)的和。采用這種方式表示的目的是簡化比較。因為,指數(shù)的值可能為正也可能為負,如果采用補碼表示的話,全體符號位S和Exp自身的符號位將導致不能簡單的進行大小比較。正因為如此,指數(shù)部分通常采用一個無符號的正數(shù)值存儲。單精度的指數(shù)部分是?126~+127加上偏移值127,指數(shù)值的大小從1~254(0和255是特殊值)。浮點小數(shù)計算時,指數(shù)值減去偏正值將是實際的指數(shù)大小。

單精度浮點數(shù)各種極值情況:

|| ||

64位雙精度

雙精度二進制小數(shù),使用64個比特存儲。

|| ||

S為符號位,Exp為指數(shù)字,F(xiàn)raction為有效數(shù)字。指數(shù)部分即使用所謂的偏正值形式表示,偏正值為實際的指數(shù)大小與一個固定值(64位的情況是1023)的和。采用這種方式表示的目的是簡化比較。因為,指數(shù)的值可能為正也可能為負,如果采用補碼表示的話,全體符號位S和Exp自身的符號位將導致不能簡單的進行大小比較。正因為如此,指數(shù)部分通常采用一個無符號的正數(shù)值存儲。雙精度的指數(shù)部分是?1022~+1023加上1023,指數(shù)值的大小從1~2046(0(2進位全為0)和2047(2進位全為1)是特殊值)。浮點小數(shù)計算時,指數(shù)值減去偏正值將是實際的指數(shù)大小。

浮點數(shù)的比較浮點數(shù)基本上可以按照符號位、指數(shù)域、尾數(shù)域的順序作字典比較。顯然,所有正數(shù)大于負數(shù);正負號相同時,指數(shù)的二進制表示法更大的其浮點數(shù)值更大。

浮點數(shù)的舍入任何有效數(shù)上的運算結果,通常都存放在較長的寄存器中,當結果被放回浮點格式時,必須將多出來的比特丟棄。 有多種方法可以用來運行舍入作業(yè),實際上IEEE標準列出4種不同的方法:

舍入到最接近:舍入到最接近,在一樣接近的情況下偶數(shù)優(yōu)先(Ties To Even,這是默認的舍入方式):會將結果舍入為最接近且可以表示的值,但是當存在兩個數(shù)一樣接近的時候,則取其中的偶數(shù)(在二進制中式以0結尾的)。

朝+∞方向舍入:會將結果朝正無限大的方向舍入。

朝-∞方向舍入:會將結果朝負無限大的方向舍入。

朝0方向舍入:會將結果朝0的方向舍入。

浮點數(shù)的運算與函數(shù)標準運算

下述函數(shù)必須提供:

加減乘除(Add、subtract、multiply、divide)。在加減運算中負零與零相等:

平方根(Square root): ,另規(guī)定

浮點余數(shù)。返回值

近似到最近的整數(shù) 。如果恰好在兩個相鄰整數(shù)之間,則近似到偶數(shù)。

比較運算. -Inf