實驗樓學習筆記 float和double區別

2021-06-27 03:41:10 字數 1439 閱讀 8614

c語言和c#語言中,對於浮點型別的資料採用單精度型別(float)和雙精度型別(double)來儲存,float資料占用32bit,double資料占用64bit,我們在宣告乙個變數float f= 2.25f的時候,是如何分配記憶體的呢?如果胡亂分配,那世界豈不是亂套了麼,其實不論是float還是double在儲存方式上都是遵從ieee的規範的,float遵從的是ieee r32.24 ,而double 遵從的是r64.53。

無論是單精度還是雙精度在儲存中都分為三個部分:

符號位(sign) : 0代表正,1代表為負

指數字(exponent):用於儲存科學計數法中的指數資料,並且採用移位儲存

尾數部分(mantissa):尾數部分

其中float的儲存方式如下圖所示:

而雙精度的儲存方式為: 

r32.24和r64.53的儲存方式都是用科學計數法來儲存資料的,比如8.25用十進位制的科學計數法表示就為:8.25*,而120.5可以表示為:1.205*,這些小學的知識就不用多說了吧。而我們傻蛋計算機根本不認識十進位制的資料,他只認識0,1,所以在計算機儲存中,首先要將上面的數更改為二進位制的科學計數法表示,8.25用二進位制表示可表示為1000.01,我靠,不會連這都不會轉換吧?那我估計要沒轍了。120.5用二進位制表示為:1110110.1用二進位制的科學計數法表示1000.01可以表示為1.00001*,1110110.1可以表示為1.1101101*,任何乙個數都的科學計數法表示都為1.****,尾數部分就可以表示為***x,第一位都是1嘛,幹嘛還要表示呀?可以將小數點前面的1省略,所以23bit的尾數部分,可以表示的精度卻變成了24bit,道理就是在這裡,那24bit能精確到小數點後幾位呢,我們知道9的二進位制表示為1001,所以4bit能精確十進位制中的1位小數點,24bit就能使float能精確到小數點後6位,而對於指數部分,因為指數可正可負,8位的指數字能表示的指數範圍就應該為:-127-128了,所以指數部分的儲存採用移位儲存,儲存的資料為元資料 127,下面就看看8.25和120.5在記憶體中真正的儲存方式。

首先看下8.25,用二進位制的科學計數法表示為:1.00001*

按照上面的儲存方式,符號位為:0,表示為正,指數字為:3 127=130 ,位數部分為,故8.25的儲存方式如下圖所示:

而單精度浮點數120.5的儲存方式如下圖所示:

那麼如果給出記憶體中一段資料,並且告訴你是單精度儲存的話,你如何知道該資料的十進位制數值呢?其實就是對上面的反推過程,比如給出如下記憶體資料:0100001011101101000000000000,首先我們現將該資料分段,0 10000 0101 110 1101 0000 0000 0000 0000,在記憶體中的儲存就為下圖所示:

根據我們的計算方式,可以計算出,這樣一組資料表示為:1.1101101*=120.5

而雙精度浮點數的儲存和單精度的儲存大同小異,不同的是指數部分和尾數部分的位數。所以這裡不再詳細的介紹雙精度的儲存方式了,只將120.5的最後儲存方式圖給出,大家可以仔細想想為何是這樣子的

實驗樓 Linux 學習筆記

1.1 linux 歷史的歷史 早期作業系統能夠處理批處理程式,它從檔案或者穿孔卡片讀取資料,然後輸出到另乙個檔案或者印表機,稱為批處理作業系統。後來,出現了能夠支援多個使用者從不同終端同時操作主機的系統,稱為分時作業系統。然後許多人紛紛嘗試開發分時作業系統,unix 就如此誕生,實現了 tcp i...

Linux實驗樓學習筆記

目錄linux指令彙總 環境變數 etc profile 環境變數的作用域比自定義變數的要大,如 shell 的環境變數作用於自身和它的子程序。在所有的 unix 和類 unix 系統中,每個程序都有其各自的環境變數設定,且預設情況下,當乙個程序被建立時,除了建立過程中明確指定的話,它將繼承其父程序...

實驗樓學習小記

linux基本操作總結圖 python基礎型別和基本語法 python的流程控制 python類基礎 class student object init 是乙個特殊方法用於在建立物件時進行初始化操作 通過這個方法我們可以為學生物件繫結name 和 age兩個屬性 def init self,name...