從存儲結構和算法上來講,double和float是一樣的,不一樣的地方僅僅是float是32位的,double是64位的,所以double能存儲更 高的精度。 任何數據在內存中都是以二進制(0或1)順序存儲的,每一個1或0被稱爲1位,而在x86CPU上一個字節是8位。比如一個16位(2 字節)的short int型變量的值是1000,那麼它的二進制表達就是:00000011 11101000。由於Intel CPU的架構原因,它是按字節倒 序存儲的,那麼就因該是這樣:11101000 00000011,這就是定點數1000在內存中的結構。 目前C/C++編譯器標準都遵照IEEE制定的浮點數表示法來進行float,double運算。這種結構是一種科學計數法,用符號、指數和 尾數來表示,底數定爲2——即把一個浮點數表示爲尾數乘以2的指數次方再添上符號。下面是具體的規格: ````````符號位 階碼 尾數 長度 float 1 8 23 32 double 1 11 52 64 臨時數 1 15 64 80 由於通常C編譯器默認浮點數是double型的,下面以double爲例: 共計64位,摺合8字節。由最高到最低位分別是第63、62、61、……、0位: 最高位63位是符號位,1表示該數爲負,0正; 62-52位,一共11位是指數位; 51-0位,一共52位是尾數位。 按照IEEE浮點數表示法,下面將把double型浮點數38414.4轉換爲十六進制代碼。 把整數部和小數部分開處理:整數部直接化十六進制:960E。小數的處理: 0.4=0.5*0+0.25*1+0.125*1+0.0625*0+…… 實際上這永遠算不完!這就是著名的浮點數精度問題。所以直到加上前面的整數部分算夠53位就行了(隱藏位技術:最高位的1 不寫入內存)。 如果你夠耐心,手工算到53位那麼因該是:38414.4(10)=1001011000001110.0110101010101010101010101010101010101(2) 科學記數法爲:1.001……乘以2的15次方。指數爲15! 於是來看階碼,一共11位,可以表示範圍是-1024 ~ 1023。因爲指數可以爲負,爲了便於計算,規定都先加上1023,在這裏, 15+1023=1038。二進制表示爲:100 00001110 符號位:正—— 0 ! 合在一起(尾數二進制最高位的1不要): 01000000 11100010 11000001 11001101 01010101 01010101 01010101 01010101 按字節倒序存儲的十六進制數就是: 55 55 55 55 CD C1 E2 40
關於float double的數據類型的細節,在處理轉換問題的時候非常有用
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章
過濾器、攔截器、監聽器三者的區別與使用
靈熙雲
2020-06-23 20:37:34
Session、Cookie、Token的區別
靈熙雲
2020-06-23 20:37:22
工作相關總結一
qingkongxiaoyang
2020-06-23 04:08:12
關聯與依賴的區別
qingkongxiaoyang
2020-06-23 04:08:12
商品推薦之CIKM 2019 EComm AI:超大規模推薦之用戶興趣高效檢索
智慧的牛
2020-06-23 00:27:05
IIS與ASP.NET執行解析關係
ASP.NET是一個非常強大的構建Web應用的平臺,它提供了極大的靈活性和能力以致於可以用它來構建所有類型的Web應用。 絕大多數的人只熟悉高層的框
zlkingdom
2020-06-21 16:30:07
談談C#中的六大數組
一.先來說說數組的不足(也可以說集合與數組的區別): 1.數組是固定大小的,不能伸縮。雖然System.Array.Resize這個泛型方法可以重
zlkingdom
2020-06-21 16:30:07
ASP.NET中NHibernate的應用
zlkingdom
2020-06-21 16:29:56
xml文件中使用的轉義字符
zlkingdom
2020-06-21 16:29:56
Centos簡單快速切換jdk方法
zlkingdom
2020-06-21 16:29:56
Redis實戰(通俗易懂,超詳細攻略) V2.0版本
bernkafly
2020-06-16 13:56:16
eclipse中安裝插件方式(links方式)
起飞---为梦想而飞
2020-06-10 10:42:55