浮點數就是有小數點的數。
在c語言中有三種浮點數,分別為float,double和long double。下面分析一下其實現。
#include int main(int argc, char *argv)
這是乙個簡單的c語言程式,定義了三個不同型別的變數a、b、c。編譯後用gdb除錯下
(gdb) p sizeof(a)
$1 = 4
(gdb) p sizeof(b)
$2 = 8
(gdb) p sizeof(c)
$3 = 16
可以看到float佔4位元組,double佔8位元組,long double佔16位元組。
在計算機中儲存浮點數一般使用科學技術法,如12345=>0.12345e5,只不過在計算機中使用的是二進位制數,像十進位制數10,先翻譯成二進位制數110,再換成指數形式0.11*(2)3。這裡以float為例來說明一下浮點數的儲存方式。
(gdb) set var a = 0
(gdb) x/t &a
0x7fff5fbffbbc: 00000000000000000000000000000000
把a的值設為0,以二進位制方式現實,結果是32個零。計算機把這32位數分成3部分,[0]為符號位,[1~8]為指數部分,[9~31] 為底數部分。
再看看十進位制數2的表示
(gdb) set var a = 2
(gdb) x/t &a
0x7fff5fbffbbc: 01000000000000000000000000000000
符號位為0,表示正,1為負,指數部分為10000000,底數部分為23個零。
使用科學技術法時最高位都是1,如101,1100等,在高位放0是沒有意義的,如001010可表示為1010,因此,底數部分最高位的1將捨去,因為最高位必定有乙個1,所以這裡的23個0實際為100000000000000000000000,表達的底數為0.100000000000000000000000,即1。
指數部分為10000000。底數為1這裡要表示的數為10,即十進位制數為2,則指數為1,可是10000000如果能表示2呢,再做個實驗。
(gdb) set var a = 1
(gdb) x/t &a
0x7fff5fbffbbc: 00111111100000000000000000000000
這裡底數部分還是23個0,表示的底數為1,要表示1的話指數部分為0。
指數部分考慮到純小數指數為負的原因,把指數看成無符號數加上127才是其儲存的指數值。
如10000000要表達的指數為1。
來實驗一下,十進位制數22.2,翻譯成二進位制數為10110.001100110011001100110011001100110011....................
則底數為01100011001100110011001,之後的數字將會被捨去,這就是為什麼浮點數不能儲存精確值的原因
指數為4,加127那就是,131,翻譯成二進位制數那就是10000011
符號位為0,那麼十進位制數22.2在計算機中則儲存為01000001101100011001100110011001
看驗證,和之前計算完全符合。
(gdb) set var a = 22.2
(gdb) x/t &a
0x7fff5fbffbbc: 01000001101100011001100110011001
計算機中浮點數的表示
在c語言中浮點數有兩個size,32位和64位。其中32位浮點數 第1位是signflag 符號位 2 9位是階碼位 exponent 10 32位是尾數字 significand 64位分別是第1位,2 12位,13 64位。浮點數大小的公式是 x 1 2 e m e exp 2 1 將 exp ...
浮點數在計算機中的表示
浮點數在計算機中的表示 最後編輯於 2010 4 13 計算機中數字是以0和1二進位制儲存的,我們熟悉的是整數的如何在計算機中表示,那麼浮點數是如何表示的呢?一 轉換 我們先來看看如何將十進位制的浮點數轉換成二進位制。乙個十進位制的浮點數,例如 abcd.efg 其中a g為0.9 其值用多項式為 ...
計算機中的浮點數
寫這篇blog,是因為在上工程碩士數學時候,又開始講到了浮點數的儲存,運算和精度的問題。這個問題已經見了好多次了,從微機原理的課到計算機視覺處理矩陣時候的conditioning,到這次。但感覺一直都沒有理清楚。所以這次嘗試梳理一下。一般主要分為兩種形式,這裡以8位的儲存進行解釋 所以用浮點數表示數...