float和double型別的記憶體分布

2022-03-18 21:07:58 字數 1722 閱讀 9486

c/c++的浮點資料型別有float和double兩種。

型別float大小為4位元組,即32位,記憶體中的儲存方式如下:

符號位(1 bit)

指數(8 bit)

尾數(23 bit)

型別double大小為8位元組,即64位,記憶體布局如下:

符號位(1 bit)

指數(11 bit)

尾數(52 bit)

符號位(1 bit)

指數(8 bit)

尾數(23 bit)

符號位(1 bit)

指數(8 bit)

尾數(23 bit)

符號位決定浮點數的正負,0正1負。

指數和尾數均從浮點數的二進位制科學計數形式中獲取。

如,十進位制浮點數2.5的二進位制形式為10.1,轉換為科學計數法形式為(1.01)*(10^1),由此可知指數為1,尾數(即科學計數法的小數部分)為01。

根據浮點數的儲存標準(ieee制定),float型別指數的起始數為127(二進位制0111 1111),double型別指數的起始數為1023(二進位制011 1111 1111),在此基礎上加指數,得到的就是記憶體中指數的表示形式。尾數則直接填入,如果空間多餘則以0補齊,如果空間不夠則0舍1入。所以float和double型別分別表示的2.5如下(二進位制):

符號位

指數 尾數

0 1000 0000

010 0000 0000 0000 0000 0000

0 100 0000 0000

0100 0000 0000 0000 0000 0000 0000

0000 0000 0000 0000 0000 0000

浮點數2.5可以用二進位制小數準確表示(2.5=1*(2^1)+0*(2^0)+1*(2^-1)),但很多小數不可以準確表示,其二進位制形式的小數部分會無限迴圈,如浮點數-1.2表示如下(二進位制):

符號位

指數 尾數

1 0111 1111

0011 0011 0011 0011 0011 010

1 011 1111 1111

0011 0011 0011 0011 0011 0011 0011

0011 0011 0011 0011 0011 0011

由於對無限迴圈尾數的擷取遵循0舍1入,尾數的第21~24位為0011,第53~56位為0011,而float尾數容量為23位,double尾數容量為52位,所以,float形式的最後三位因進製而成010,double形式則沒有進製發生。

型別float和double通過==,>,《等比較不會引起編譯錯誤,但是非常可能得到錯誤的結果。這是因為它們的記憶體分布不同,不可以直接比較。正確的方法是轉換為同一型別後比較兩者差值,如果結果小於規定的小值,則視為相等。

如,乙個比較double的實現:

另外,本文參考了如下webs:

p.s.

1) ieee浮點數標準:     4位元組浮點數:1位符號位,8位階數(基數為127的移碼),23位尾數;     8位元組浮點數:1位符號位,11位階數(基數為1023的移碼),52位尾數

2 )

在vc中: float數值範圍約在 -10e38~10e38,並提供7位有效數字位,絕對值小於10e38地數被處理成零值 double數值範圍約在-10e308~10e308,並提供15~16位有效數字,絕對值小於10e308地數被處理成零值

0給主人留下些什麼吧!~~

float和double型別的記憶體分布

c c 的浮點資料型別有float和double兩種。型別float大小為4位元組,即32位,記憶體中的儲存方式如下 符號位 1 bit 指數 8 bit 尾數 23 bit 型別double大小為8位元組,即64位,記憶體布局如下 符號位 1 bit 指數 11 bit 尾數 52 bit 符號位...

float和double型別的記憶體分布和比較方法

c c 的浮點資料型別有float和double兩種。型別float大小為4位元組,即32位,記憶體中的儲存方式如下 符號位 1 bit 指數 8 bit 尾數 23 bit 型別double大小為8位元組,即64位,記憶體布局如下 符號位 1 bit 指數 11 bit 尾數 52 bit 符號位...

C 之Float型別, double型別

c 裡的小數分為float和double兩種型別,這兩種型別,直接看 及執行結果我們來看一下他們有什麼區別 include iostream using namespace std int main 再來看 的執行結果 接下來分析一下 邏輯很簡單,這裡只說一行 cout.setf ios base ...