IEEE 754标准--维基百科
IEEE二進(jìn)制浮點(diǎn)數(shù)算術(shù)標(biāo)準(zhǔn)(IEEE 754) 是20世紀(jì)80年代以來(lái)最廣泛使用的浮點(diǎn)數(shù)運(yùn)算標(biāo)準(zhǔn),為許多CPU與浮點(diǎn)運(yùn)算器所采用。這個(gè)標(biāo)準(zhǔn)定義了表示浮點(diǎn)數(shù)的格式(包括負(fù)零-0)與反常值(denormal number),一些特殊數(shù)值((無(wú)窮(Inf)與非數(shù)值(NaN)),以及這些數(shù)值的“浮點(diǎn)數(shù)運(yùn)算符”;它也指明了四種數(shù)值舍入規(guī)則和五種例外狀況(包括例外發(fā)生的時(shí)機(jī)與處理方式)。
IEEE 754規(guī)定了四種表示浮點(diǎn)數(shù)值的方式:單精確度(32位)、雙精確度(64位)、延伸單精確度(43比特以上,很少使用)與延伸雙精確度(79比特以上,通常以80位實(shí)現(xiàn))。只有32位模式有強(qiáng)制要求,其他都是選擇性的。大部分編程語(yǔ)言都提供了IEEE浮點(diǎn)數(shù)格式與算術(shù),但有些將其列為非必需的。例如,IEEE 754問(wèn)世之前就有的C語(yǔ)言,現(xiàn)在包括了IEEE算術(shù),但不算作強(qiáng)制要求(C語(yǔ)言的float通常是指IEEE單精確度,而double是指雙精確度)。
該標(biāo)準(zhǔn)的全稱(chēng)為IEEE二進(jìn)制浮點(diǎn)數(shù)算術(shù)標(biāo)準(zhǔn)(ANSI/IEEE Std 754-1985),又稱(chēng)IEC 60559:1989,微處理器系統(tǒng)的二進(jìn)制浮點(diǎn)數(shù)算術(shù)(本來(lái)的編號(hào)是IEC 559:1989)[1]。后來(lái)還有“與基數(shù)無(wú)關(guān)的浮點(diǎn)數(shù)”的“IEEE 854-1987標(biāo)準(zhǔn)”,有規(guī)定基數(shù)為2跟10的狀況。現(xiàn)在最新標(biāo)準(zhǔn)是“ISO/IEC/IEEE FDIS 60559:2010”。
在六、七十年代,各家計(jì)算機(jī)公司的各個(gè)型號(hào)的計(jì)算機(jī),有著千差萬(wàn)別的浮點(diǎn)數(shù)表示,卻沒(méi)有一個(gè)業(yè)界通用的標(biāo)準(zhǔn)。這給數(shù)據(jù)交換、計(jì)算機(jī)協(xié)同工作造成了極大不便。IEEE的浮點(diǎn)數(shù)專(zhuān)業(yè)小組于七十年代末期開(kāi)始醞釀浮點(diǎn)數(shù)的標(biāo)準(zhǔn)。在1980年,英特爾公司就推出了單片的8087浮點(diǎn)數(shù)協(xié)處理器,其浮點(diǎn)數(shù)表示法及定義的運(yùn)算具有足夠的合理性、先進(jìn)性,被IEEE采用作為浮點(diǎn)數(shù)的標(biāo)準(zhǔn),于1985年發(fā)布。而在此前,這一標(biāo)準(zhǔn)的內(nèi)容已在八十年代初期被各計(jì)算機(jī)公司廣泛采用,成了事實(shí)上的業(yè)界工業(yè)標(biāo)準(zhǔn)。加州大學(xué)伯克利分校的數(shù)值計(jì)算與計(jì)算機(jī)科學(xué)教授威廉·卡韓被譽(yù)為“浮點(diǎn)數(shù)之父”。
浮點(diǎn)數(shù)剖析
一個(gè)浮點(diǎn)數(shù) (Value) 的表示其實(shí)可以這樣表示:
也就是浮點(diǎn)數(shù)的實(shí)際值,等于符號(hào)位(sign bit)乘以指數(shù)偏移值(exponent bias)再乘以分?jǐn)?shù)值(fraction)。
以下內(nèi)文是IEEE 754對(duì)浮點(diǎn)數(shù)格式的描述。
本文表示比特的約定
把W個(gè)比特(bit)的數(shù)據(jù),從內(nèi)存地址低端到高端,以0到W?1編碼。通常將內(nèi)存地址低端的比特寫(xiě)在最右邊,稱(chēng)作最低有效位(Least Significant Bit, LSB),代表最小的比特,改變時(shí)對(duì)整體數(shù)值影響最小的比特。聲明這一點(diǎn)的必要性在于X86體系架構(gòu)是小端序的數(shù)據(jù)存儲(chǔ)。
對(duì)于十進(jìn)制整數(shù)N,必要時(shí)表示為N10以與二進(jìn)制的數(shù)的表示N2相區(qū)分。
對(duì)于一個(gè)數(shù),其二進(jìn)制科學(xué)計(jì)數(shù)法表示下的指數(shù)的值,下文稱(chēng)之為指數(shù)的實(shí)際值;而根據(jù)IEEE 754標(biāo)準(zhǔn)對(duì)指數(shù)部分的編碼的值,稱(chēng)之為浮點(diǎn)數(shù)表示法指數(shù)域的編碼值。
整體呈現(xiàn)
IEEE 754浮點(diǎn)數(shù)的三個(gè)域
二進(jìn)制浮點(diǎn)數(shù)是以符號(hào)數(shù)值表示法的格式存儲(chǔ)——最高有效位被指定為符號(hào)位(sign bit);“指數(shù)部分”,即次高有效的e個(gè)比特,存儲(chǔ)指數(shù)部分;最后剩下的f個(gè)低有效位的比特,存儲(chǔ)“有效數(shù)”(significand)的小數(shù)部分(在非規(guī)約形式下整數(shù)部分默認(rèn)為0,其他情況下一律默認(rèn)為1)。
指數(shù)偏移值
采用指數(shù)的實(shí)際值加上固定的偏移值的辦法表示浮點(diǎn)數(shù)的指數(shù),好處是可以用長(zhǎng)度為$e}e個(gè)比特的無(wú)符號(hào)整數(shù)來(lái)表示所有的指數(shù)取值,這使得兩個(gè)浮點(diǎn)數(shù)的指數(shù)大小的比較更為容易,實(shí)際上可以按照字典序比較兩個(gè)浮點(diǎn)表示的大小。
這種移碼表示的指數(shù)部分,中文稱(chēng)作階碼。
規(guī)約形式的浮點(diǎn)數(shù)
如果浮點(diǎn)數(shù)中指數(shù)部分的編碼值在 0<exponent?2e?20<exponent\leqslant 2^{e}-20<exponent?2e?2之間,且在科學(xué)表示法的表示方式下,分?jǐn)?shù) (fraction) 部分最高有效位(即整數(shù)字)是 1,那么這個(gè)浮點(diǎn)數(shù)將被稱(chēng)為規(guī)約形式的浮點(diǎn)數(shù)。“規(guī)約”是指用唯一確定的浮點(diǎn)形式去表示一個(gè)值。
由于這種表示下的尾數(shù)有一位隱含的二進(jìn)制有效數(shù)字,為了與二進(jìn)制科學(xué)計(jì)數(shù)法的尾數(shù)(mantissa)相區(qū)別,IEEE754稱(chēng)之為有效數(shù)(significant)。
舉例來(lái)說(shuō),雙精度 (64-bit) 的規(guī)約形式浮點(diǎn)數(shù)在指數(shù)偏移值的值域?yàn)?span id="ze8trgl8bvbq" class="katex--inline">000000000010000000000100000000001(11-bit) 到111111111101111111111011111111110 ,在分?jǐn)?shù)部分則是000.....000000.....000000.....000 到111.....111111.....111111.....111 (52-bit)
非規(guī)約形式的浮點(diǎn)數(shù)
如果浮點(diǎn)數(shù)的指數(shù)部分的編碼值是0,分?jǐn)?shù)部分非零,那么這個(gè)浮點(diǎn)數(shù)將被稱(chēng)為非規(guī)約形式的浮點(diǎn)數(shù)。一般是某個(gè)數(shù)字相當(dāng)接近零時(shí)才會(huì)使用非規(guī)約型式來(lái)表示。 IEEE 754標(biāo)準(zhǔn)規(guī)定:非規(guī)約形式的浮點(diǎn)數(shù)的指數(shù)偏移值比規(guī)約形式的浮點(diǎn)數(shù)的指數(shù)偏移值小1。例如,最小的規(guī)約形式的單精度浮點(diǎn)數(shù)的指數(shù)部分編碼值為1,指數(shù)的實(shí)際值為-126;而非規(guī)約的單精度浮點(diǎn)數(shù)的指數(shù)域編碼值為0,對(duì)應(yīng)的指數(shù)實(shí)際值也是-126而不是-127。實(shí)際上非規(guī)約形式的浮點(diǎn)數(shù)仍然是有效可以使用的,只是它們的絕對(duì)值已經(jīng)小于所有的規(guī)約浮點(diǎn)數(shù)的絕對(duì)值;即所有的非規(guī)約浮點(diǎn)數(shù)比規(guī)約浮點(diǎn)數(shù)更接近0。規(guī)約浮點(diǎn)數(shù)的尾數(shù)大于等于1且小于2,而非規(guī)約浮點(diǎn)數(shù)的尾數(shù)小于1且大于0。
特殊值
這里有三個(gè)特殊值需要指出:
以上規(guī)則,總結(jié)如下:
32位單精度
單精度二進(jìn)制小數(shù),使用32個(gè)比特存儲(chǔ)。
S為符號(hào)位,Exp為指數(shù)字,Fraction為有效數(shù)字。 指數(shù)部分即使用所謂的偏正值形式表示,偏正值為實(shí)際的指數(shù)大小與一個(gè)固定值(32位的情況是127)的和。采用這種方式表示的目的是簡(jiǎn)化比較。因?yàn)?#xff0c;指數(shù)的值可能為正也可能為負(fù),如果采用補(bǔ)碼表示的話(huà),全體符號(hào)位S和Exp自身的符號(hào)位將導(dǎo)致不能簡(jiǎn)單的進(jìn)行大小比較。正因?yàn)槿绱?#xff0c;指數(shù)部分通常采用一個(gè)無(wú)符號(hào)的正數(shù)值存儲(chǔ)。單精度的指數(shù)部分是?126~+127加上偏移值127,指數(shù)值的大小從1~254(0和255是特殊值)。浮點(diǎn)小數(shù)計(jì)算時(shí),指數(shù)值減去偏正值將是實(shí)際的指數(shù)大小。
單精度浮點(diǎn)數(shù)各種極值情況:
64位雙精度
雙精度二進(jìn)制小數(shù),使用64個(gè)比特存儲(chǔ)。
S為符號(hào)位,Exp為指數(shù)字,Fraction為有效數(shù)字。指數(shù)部分即使用所謂的偏正值形式表示,偏正值為實(shí)際的指數(shù)大小與一個(gè)固定值(64位的情況是1023)的和。采用這種方式表示的目的是簡(jiǎn)化比較。因?yàn)?#xff0c;指數(shù)的值可能為正也可能為負(fù),如果采用補(bǔ)碼表示的話(huà),全體符號(hào)位S和Exp自身的符號(hào)位將導(dǎo)致不能簡(jiǎn)單的進(jìn)行大小比較。正因?yàn)槿绱?#xff0c;指數(shù)部分通常采用一個(gè)無(wú)符號(hào)的正數(shù)值存儲(chǔ)。雙精度的指數(shù)部分是?1022~+1023加上1023,指數(shù)值的大小從1~2046(0(2進(jìn)位全為0)和2047(2進(jìn)位全為1)是特殊值)。浮點(diǎn)小數(shù)計(jì)算時(shí),指數(shù)值減去偏正值將是實(shí)際的指數(shù)大小。
浮點(diǎn)數(shù)的比較
浮點(diǎn)數(shù)基本上可以按照符號(hào)位、指數(shù)域、尾數(shù)域的順序作字典比較。顯然,所有正數(shù)大于負(fù)數(shù);正負(fù)號(hào)相同時(shí),指數(shù)的二進(jìn)制表示法更大的其浮點(diǎn)數(shù)值更大。
浮點(diǎn)數(shù)的舍入
任何有效數(shù)上的運(yùn)算結(jié)果,通常都存放在較長(zhǎng)的寄存器中,當(dāng)結(jié)果被放回浮點(diǎn)格式時(shí),必須將多出來(lái)的比特丟棄。 有多種方法可以用來(lái)運(yùn)行舍入作業(yè),實(shí)際上IEEE標(biāo)準(zhǔn)列出4種不同的方法:
舍入到最接近:舍入到最接近,在一樣接近的情況下偶數(shù)優(yōu)先(Ties To Even,這是默認(rèn)的舍入方式):會(huì)將結(jié)果舍入為最接近且可以表示的值,但是當(dāng)存在兩個(gè)數(shù)一樣接近的時(shí)候,則取其中的偶數(shù)(在二進(jìn)制中是以0結(jié)尾的)。
朝+∞方向舍入: 會(huì)將結(jié)果朝正無(wú)限大的方向舍入。
朝-∞方向舍入: 會(huì)將結(jié)果朝負(fù)無(wú)限大的方向舍入。
朝0方向舍入: 會(huì)將結(jié)果朝0的方向舍入。
浮點(diǎn)數(shù)的運(yùn)算與函數(shù)
標(biāo)準(zhǔn)運(yùn)算
下述函數(shù)必須提供:
建議的函數(shù)與謂詞
精度
在二進(jìn)制,第一個(gè)有效數(shù)字必定是“1”,因此這個(gè)“1”并不會(huì)存儲(chǔ)。
討論一
單精和雙精浮點(diǎn)數(shù)的有效數(shù)字分別是有存儲(chǔ)的23和52個(gè)位,加上最左手邊沒(méi)有存儲(chǔ)的第1個(gè)位,即是24和53個(gè)位。
log?224=7.22\log 2^{24}=7.22log224=7.22
log?253=15.95\log 2^{53}=15.95log253=15.95
由以上的計(jì)算,單精和雙精浮點(diǎn)數(shù)可以保證7位和15位十進(jìn)制有效數(shù)字。
討論二
C++語(yǔ)言標(biāo)準(zhǔn)定義的浮點(diǎn)數(shù)的十進(jìn)制精度(decimal precision):十進(jìn)制數(shù)字的位數(shù),可被(浮點(diǎn)數(shù))表示而值不發(fā)生變化[3]。C語(yǔ)言標(biāo)準(zhǔn)定義的浮點(diǎn)數(shù)的十進(jìn)制精度為:十進(jìn)制數(shù)字的位數(shù)q,使得任何具有q位十進(jìn)制數(shù)字的浮點(diǎn)數(shù)可近似表示為b進(jìn)制的p位數(shù)字并且能近似回十進(jìn)制表示而不改變這q位十進(jìn)制數(shù)字[4]
但由于相對(duì)近似誤差不均勻,有的7位十進(jìn)制浮點(diǎn)數(shù)不能保證近似轉(zhuǎn)化為32比特浮點(diǎn)再近似轉(zhuǎn)化回7位十進(jìn)制浮點(diǎn)后保持值不變:例如8.589973e9將變成8.589974e9。這種近似誤差不會(huì)超過(guò)1比特的表示能力,因此(24-1)*std::log10(2)等于6.92,下取整為6,成為std::numeric_limits::digits10以及FLT_DIG的值。std::numeric_limits::max_digits10的值為9,含義是必須9位十進(jìn)制數(shù)字才能區(qū)分float的所有值;也即float的最大表示區(qū)分度。
類(lèi)似的,std::numeric_limits<double>::digits10或DBL_DIG是15, std::numeric_limits<double>::max_digits10是17
例子
以下的C++程序,概略地展示了單精和雙精浮點(diǎn)數(shù)的精度。
#include <iostream>int main () {std::cout.precision(20);float a=123.45678901234567890;double b=123.45678901234567890;std::cout << a << std::endl;std::cout << b << std::endl;return 0; }// Xcode 5.1 // Output: // 123.456787109375 // 123.45678901234568059 // Program ended with exit code: 0全文由維基百科翻譯-- 維基百科,自由的百科全書(shū)
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的IEEE 754标准--维基百科的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 人民日报:手机预置软件过多且无法卸载侵害
- 下一篇: 长安深蓝 SL03 迎来首次大版本 OT