2.6我們進行了二進制整數(shù)運算的最后一役,本次LZ將和各位一起進入浮點數(shù)的世界,這里沒有無符號,沒有補碼,但是有各種各樣的驚奇。倘若你真正的進入了浮點數(shù)的世界,一定會發(fā)現(xiàn)它原來是這么有意思,而不是像之前一樣,覺得了解浮點數(shù)的內(nèi)容沒什么用,只要會簡單的使用就行了。當然,這其中也可能有部分猿友是覺得這部分內(nèi)容太難,而對它失去了學習的興趣。
就像之前的LZ一樣,曾經(jīng)對IEEE標準望而卻步,不過相信這幾章浮點數(shù)的介紹會讓你有種頓悟的感覺。倘若你有了這樣的感覺,也不要忘了“點個推薦哦。”
引言
整數(shù)運算雖然能解決計算機當中有關信息的很大一部分儲存、運算等功能,但卻是仍然不夠的。否則假設我們要做一個超市的庫存管理系統(tǒng),那么所有商品的價格都只能是整數(shù),這是不是讓你難以接受呢。
因此有時候我們需要更精確的數(shù)值表示,這就需要浮點數(shù)出場了。對于浮點數(shù)的表示以及運算規(guī)則,在以前是各個計算機制造商各自有一套自己的標準,這給程序的可移植性造成了很大的困擾。
有需求就有創(chuàng)新,最終在1985年左右,浮點數(shù)標準IEEE754就應運而生了。它就像一代秦始皇一樣,一統(tǒng)浮點數(shù)世界。秦始皇統(tǒng)一了文字、貨幣等,而IEEE754統(tǒng)一了浮點數(shù)的標準。
浮點數(shù)不僅僅是為了讓數(shù)值的表示更加精確,也是為了表示一些整數(shù)無法達到的數(shù)字,比如一些接近于0的數(shù)字,或者一些非常大的數(shù)值。因此浮點數(shù)對于計算機的意義,可以說是相當之大。
二進制小數(shù)
盡管我們本章的主要內(nèi)容應該是IEEE標準,不過我們先來看看二進制是如何表示小數(shù)的,這有助于我們理解浮點數(shù)的表示。如果是一個十進制小數(shù),相信各位都再熟悉不過了,對于12345.6789來說,它的值是由下列式子得到的。
12345.6789 = 1 * 104 + 2 * 103 + 3 * 102 + 4 * 101 + 5 * 100 + 6 * 10-1 + 7 * 10-2 + 8 * 10-3 + 9 * 10-4
這對我們來說應該是常識,那么對于二進制小數(shù)也是類似的,考慮這樣一個小數(shù)10010.1110,它的值則可以由以下式子得到。
10010.1110 = 1 * 24 + 0 * 23 + 0 * 22 + 1 * 21 + 0 * 20 + 1 * 2-1 + 1 * 2-2 + 1 * 2-3 + 0 * 2-4 = 16 + 2 + 1/2 + 1/4 + 1/8 = 18.875
從這個角度來看,二進制小數(shù)其實與十進制小數(shù)是一樣的計算方式,只是這里是2的整數(shù)次冪而已。
在書中給出了二進制小數(shù)的公式,對于一個形式為bm....b0.b-1....b-n的二進制小數(shù)b來說,它的值為以下計算方式。
這里需要提醒的是,二進制小數(shù)不像整數(shù)一樣,只要位數(shù)足夠,它就可以表示所有整數(shù)。二進制小數(shù)無法精確的表示任意小數(shù),比如最簡單的,十進制小數(shù)0.3這樣一個小數(shù),二進制是無法精確的表示它的。
IEEE標準
IEEE標準采用類似于科學計數(shù)法的方式表示浮點小數(shù),即我們將每一個浮點數(shù)表示為 V = (-1)s * M * 2E 。
這其中s為符號位,為0時為正,為1時為負。M為尾數(shù),是一個二進制小數(shù),它的范圍是0至1-ε,或者1至2-ε(ε的值一般是2-k次方,其中設k > 0)。E為階碼,是一個二進制整數(shù),可正可負,為了給尾數(shù)加權。
浮點格式分為兩種,一種是單精度,一種是雙精度。單雙精度分別對應于編程語言當中的float和double類型。其中float是單精度的,采用32位二進制表示,其中1位符號位,8位階碼以及23位尾數(shù)。double是雙精度的,采用64位二進制表示,其中1位符號位,11位階碼以及52位尾數(shù)。
從上面的位數(shù)上就能看出,雙精度浮點數(shù)所表示的范圍將遠遠大于單精度浮點數(shù)。針對階碼E的值,浮點數(shù)的值可以分為三種不同的情況,分別是規(guī)格化的,非規(guī)格化的以及特殊值,這三種情況就是浮點數(shù)的奧義所在了。