IEEE 754格式是什麼?

做者:郭無意
連接:https://www.zhihu.com/question/21711083/answer/63951385
來源:知乎
著做權歸做者全部。商業轉載請聯繫做者得到受權,非商業轉載請註明出處。

在這裏詳細介紹下,也看成本身的總結:
首先介紹一些基本數據類型的數值範圍以及注意事項:

4字節有符號int值:-2^31 至 2^31-1 (因爲計算機採用補碼標示,+0表明0 -0表明絕對值最大的負值)是21億多的範圍具體就是 -21 4748 3648 到 21 4748 3647
附帶提一句: 在Java代碼中調用System.out.println(System.currentTimeMillis()); 返回的數值如今是
14424 1484 5783 這是ms的標示值,通常狀況下咱們那顯示都是精確到s,那麼(int)(time/1000就能夠了,注意,此時的值是14億多,這樣其實離int的最大值還有至關距離,若是咱們默認本身的應用不會再30年以後使用,大可以使用int,可是建議使用long。
插個有趣的事情,維基百科上關於Unix時間的條目spa

2038年問題


主條目:2038年問題

2038年1月19日3時14分07秒,32位系統的UNIX時間將會被重置。設計

現時大部分使用UNIX的系統都是32位的,即它們會以32位有符號整數表示時間類型time_t。所以它能夠表示136年的秒數。表示協調世界時間1901年12月13星期五20時45分52秒至2038年1月19日3時14分07秒(二進制:01111111 11111111 11111111 11111111,0x7FFF:FFFF),在下一秒二進制數字會是10000000 00000000 00000000 00000000(0x8000:0000),這是負數,所以各系統會把時間誤解做1901年12月13日20時45分52秒(亦有說迴歸到1970年)。這時可能會令軟件發生問題,致使系統癱瘓。3d

目前的解決方案是把系統由32位轉爲64位系統。在64位系統下,此時間最多能夠表示到292,277,026,596年12月4日15時30分08秒。unix

Unix負時間致使部分iPhone手機沒法啓動

在2016年2月12日,據披露,若是把蘋果iPhoneiPad等設備的系統時間設置爲1970年1月1日,隨後重啓設備,它會直接變磚。目前蘋果公司正式認可了漏洞存在,可是還沒有公佈具體的引起緣由。blog

[2]

部分中國大陸用戶猜測這是由於調整當地時間到1970.1.1 0:00後,若是時區爲正,那麼GMT時間就早於unix定義的0時間。例如北京時間 1970.1.1 0:00 (UTC+0800) 是UTC 1969.12.31 16:00 對應的unix時間是負的。可是有人迴應嘗試設爲正時區重啓後仍然變磚。ip

[3]

蘋果對此採用的策略是在隨後的固件更新中將時間禁止調整到2000年之前。2字節short值: -2^15 到 2^15-1 這也恰巧和計算機端口號的範圍相似 0-65535(
系統保留端口(從0到1023) 動態端口(從1024到65535) )
1字節byte值:-2^7 到 2^7-1

那麼4字節的浮點數的範圍怎麼進行計算?爲何4字節的浮點數能夠表示那麼大的數據?
下圖是4字節浮點數在計算機的表示說明:

關於階碼:
在機器中表示一個浮點數時須要給出指數,這個指數用整數形式表示,這個整數叫作階碼,階碼指明瞭小數點在數據中的位置。
對於任意一個二進制數N,可用N=S×2^P表示,其中S爲尾數,P爲階碼,2爲階碼的底,P、S都用二進制數表示,S表示N的所有有效數字,P指明小數點的位置。當階碼爲固定值時,數的這種表示法稱爲定點表示,這樣的數稱爲「定點數」;當階碼爲可變時,數的這種表示法稱爲浮點表示,這樣的數稱爲「浮點數」。

爲何要定義使用階碼? 由於浮點數的定義致使的,也是浮點數的表示需求產生的。
浮點數是屬於有理數中某特定子集的數的數字表示,在計算機中用以近似表示任意某個實數。具體的說,這個實數由一個整數或定點數(即尾數)乘以某個基數(計算機中一般是2)的整數次冪獲得,這種表示方法相似於基數爲10的科學記數法。



問題一:爲何32位浮點數階碼要有偏移量?
緣由仍是爲了計算機處理數據的方便,還記得爲何計算機要有補碼嗎?緣由就是但願在加法運算中將減法運算一併處理了,簡化CPU中運算器的設計,確實咱們經過補碼實現了加減法的統一。
如今咱們將浮點數用這種形式保存,那麼計算機怎麼比較浮點數的大小呢?
浮點數表示有兩個符號位置,一個是數符S,一個是階碼的符號,若是僅僅採用補碼做爲階碼,於階碼有正有負,整個數的符號位和階數的符號位將致使不能進行簡單的大小比較,因此階數採用了一個無符號的正整數存儲。階數的值直接進行二進制計算,符號位置是默認爲0的,因而階數的值能夠爲0 到 255


問題二:爲何偏移量設置爲127?內存

當階碼E 爲全0且尾數M 也爲全0時,表示的真值x 爲零,結合符號位S 爲0或1,有正零和負ci

零之分。當階碼E 爲全1且尾數M 爲全0時,表示的真值x 爲無窮大,結合符號位S 爲0或1,也有get

+∞和-∞之分。這樣在32位浮點數表示中,要除去E 用全0和全1(255)10表示零和無窮大的特殊it

狀況,指數的偏移值不選128(10000000),而選127(01111111)。對於規格化浮點數,E 的範圍變

爲1到254,真正的指數值e 則爲-126到+127。所以32位浮點數表示的絕對值的範圍是10-38~10^38

(以10的冪表示)。



這樣咱們就知道了,其實咱們的浮點數是這樣表示在計算機噹噹中的,那麼浮點數的範圍呢?
float與double的範圍和精度
1. 範圍
float和double的範圍是由指數的位數來決定的。
float的指數位有8位,而double的指數位有11位,分佈以下:
float:
1bit(符號位) 8bits(指數位) 23bits(尾數位)
double:
1bit(符號位) 11bits(指數位) 52bits(尾數位)
因而,float的指數範圍爲-126~+127,而double的指數範圍爲-1022~+1023,而且指數位是按補碼的形式來劃分的。
之因此是上面的範圍:上面黑體字部分已經解釋了,爲了比較方便,咱們將指數加偏移量改成正值,因爲隱匿一位偏移致使偏移量總體-1
其中負指數決定了浮點數所能表達的絕對值最小的非零數;而正指數決定了浮點數所能表達的絕對值最大的數,也即決定了浮點數的取值範圍。
float的範圍爲-2^127 ~ +2^127,也即-3.40E+38 ~ +3.40E+38;double的範圍爲-2^1023 ~ +2^1023,也即-1.79E+308 ~ +1.79E+308。
2. 精度
float和double的精度是由尾數的位數來決定的。浮點數在內存中是按科學計數法來存儲的,其整數部分始終是一個隱含着的「1」,因爲它是不變的,故不能對精度形成影響。
float:2^23 = 8388608,一共七位,這意味着最多能有7位有效數字,但絕對能保證的爲6位,也即float的精度爲6~7位有效數字;
double:2^52 = 4503599627370496,一共16位,同理,double的精度爲15~16位。

這樣IEE754就算基本弄清了吧
參考這個資料能夠得到更詳細的解釋

計算機中經常使用的數據表示格式有兩種,一是定點格式,二是浮點格式。通常來講,定點格式容

許的數值範圍有限,但要求的處理硬件比較簡單。而浮點格式允許的數值範圍很大,但要求的處

理硬件比較複雜。

定點表示:約定機器中全部數據的小數點位置是固定不變的。因爲約定在固定的位置,小數

點就再也不使用記號「.」來表示。一般將數據表示成純小數純整數

  定點數x=x012…xn 在定點機中表示以下(0:符號位,0表明正號,1表明負號):

純小數的表示範圍爲(012…xn 各位均爲0時最小;各位均爲1時最大)

純整數的表示範圍爲

目前計算機中多采用定點純整數表示,所以將定點數表示的運算簡稱爲整數運算

電子的質量(9×10-28克)和太陽的質量(2×1033克)相差甚遠,在定點計算機中沒法直接來表

示這個數值範圍.要使它們送入定點計算機進行某種運算,必須對它們分別取不一樣的比例因子,

使其數值部分絕對值小於1,即:

這裏的比例因子10-27和 1034要分別存放在機器的某個存儲單元中,以便之後對計算結果

按這個比例增大。顯然這要佔用必定的存儲空間和運算時間。所以獲得浮點表示法以下:

  浮點表示法:把一個數的有效數字和數的範圍在計算機的一個存儲單元中分別予以表示,

這種把數的範圍和精度分別表示的方法,數的小數點位置隨比例因子的不一樣而在必定範圍內自

由浮動。

  任意一個十進制數 能夠寫成

爲提升數據的表示精度,當尾數的值不爲 0 時,尾數域的最高有效位應爲1,不然以修改

階碼同時左右移小數點的辦法,使其變成這一表示形式,這稱爲浮點數的規格化表示

  當浮點數的尾數爲 0,不論其階碼爲什麼值,或者當階碼的值遇到比它能表示的最小值還小

時,無論其尾數爲什麼值,計算機都把該浮點數當作零值,稱爲機器零

  當階碼E 爲全0且尾數M 也爲全0時,表示的真值x 爲零,結合符號位S 爲0或1,有正零和負

零之分。當階碼E 爲全1且尾數M 爲全0時,表示的真值x 爲無窮大,結合符號位S 爲0或1,也有

+∞和-∞之分。這樣在32位浮點數表示中,要除去E 用全0和全1(255)10表示零和無窮大的特殊

狀況,指數的偏移值不選128(10000000),而選127(01111111)。對於規格化浮點數,E 的範圍變

爲1到254,真正的指數值e 則爲-126到+127。所以32位浮點數表示的絕對值的範圍是10-38~1038

(以10的冪表示)。

浮點數所表示的範圍遠比定點數大。一臺計算機中究竟採用定點表示仍是浮點表示,

要根據計算機的使用條件來肯定。通常在高檔微機以上的計算機中同時採用定點、浮點

表示,由使用者進行選擇,而單片機中多采用定點表示。

編輯於 2016-12-31

相關文章
相關標籤/搜索