浮點數是計算機內部儲存數值的一種方法。
計算機內部儲存數值如果按照一般儲存的方法,以32位為例,則最大值只能表示
1111…1111(32個)=232=4,294,967,296
而且這裡沒有考慮符號位和小數字。
如果用一位數表示符號位,並且再用一部分數表示小數字,那麼32位計算機一次能表示的數值範圍就會變得很小了。為了能夠用固定的位數表示足夠大範圍的資料,就引入了浮點數。
浮點數分為單精度浮點數(32位)和雙精度浮點數(64位)
單精度浮點數的表示範圍為 3.4e-38~3.4e+38
雙精度浮點數的表示範圍為 1.7e-308~1.7e+308
可見使用浮點數表示數的範圍比定點數大了許多。
浮點數如圖所示,以32位為列,用一位來表示符號位s,一部分位數表示指數字e,另一部分表示尾數字m。其表示方法類似於科學計數法,無論任何數都可以近似化成s(-1)×2e×1.***的形式(因為在2進製的體系中用2為基數,那麼底數增大或減小都相當於位的左移右移)
符號位:表示數的正負,0表示正數,1表示負數。
指數字:在32位的系統中,用8位表示指數,那麼8位的取值範圍為0~255,其中間數為127,因為指數中可能有負數,所以為了能夠表示負數,真實的基數需要減去固定值127。 (也可以空出一位專門表示基數字的符號位,其佔位和表示範圍不變)
尾數字:即1.***,表示數的具體的值樣。
規格化就是指將浮點數按照一定規則表示。由於浮點數m總是能寫成m=(-1)s(1.***)2e的形式。(通過小數點左移右移來完成)
故,我們稱尾數字為1.***x形式時,該浮點數就是規格化形式。
這樣尾數的第一位總是為1,這樣我們就可以省略第一位1,而只在尾數中保留小數點後的數值,來節省一位有效位來儲存資訊。(我在網上還見過規格化尾數為0.***的形式,但其實不論哪個道理都是一樣的)
以(+56)10在轉化成浮點數為列:
(+56)10=111000(2)=1.11× 25
尾數字:11000(省略最高位1)
指數字:階碼(5)10=(101)2, 還需要加上(01111)即結果為(10100)2(基數字需加上乙個中間數)
符號位:由於56為正數故符號位為0.
那麼最終浮點數的結果為:
0 000010100 1100……0000
最後讓我們欣賞下64位浮點數的表示方法:
浮點數 儲存
關鍵字 體系結構 ieee754 浮點數 儲存 main 如果不執行上面的 讓我們來直接判斷,輸出的結果會是什麼?而在你執行程式之後,結果卻很讓人詫異 123.456001。為什麼會是123.456001?有六位小數可以理解,最後那個1是為何?有很多人解釋說最後那個1是亂碼,隨機的。嘿嘿 其實無論你...
浮點數操作
float fx 49.03f int nx fx 100 printf d nx 執行上述 結果 4902。用vc6.0,2005,gcc編譯執行結果都是一樣。為什麼會這樣呢,是因為浮點數運算具有不精確性。其實編譯上面的 編譯器會有警告的。warning c4244 initializing co...
浮點數比較
在數 算當中經常會涉及到判斷兩個數是否相等的情況 對於整數很好處理 a b這樣的乙個語句就可以解決全部的問題 但是對於浮點數是不同的 首先,浮點數在計算機當中的二進位制表達方式就決定了大多數浮點數都是無法精確的表達的 現在的計算機大部分都是數字計算機,不是模擬機,數字機的離散化的資料表示方法自然無法...