C/C++的浮點(diǎn)數(shù)據(jù)類型有float和double兩種。
類型float大小為4字節(jié),即32位,內(nèi)存中的存儲(chǔ)方式如下:
符號(hào)位(1 bit) 指數(shù)(8 bit) 尾數(shù)(23 bit)
類型double大小為8字節(jié),即64位,內(nèi)存布局如下:
符號(hào)位(1 bit) 指數(shù)(11 bit) 尾數(shù)(52 bit)
符號(hào)位決定浮點(diǎn)數(shù)的正負(fù),0正1負(fù)。
指數(shù)和尾數(shù)均從浮點(diǎn)數(shù)的二進(jìn)制科學(xué)計(jì)數(shù)形式中獲取。
如,十進(jìn)制浮點(diǎn)數(shù)2.5的二進(jìn)制形式為10.1,轉(zhuǎn)換為科學(xué)計(jì)數(shù)法形式為(1.01)*(10^1),由此可知指數(shù)為1,尾數(shù)(即科學(xué)計(jì)數(shù)法的小數(shù)部分)為01。
根據(jù)浮點(diǎn)數(shù)的存儲(chǔ)標(biāo)準(zhǔn)(IEEE制定),float類型指數(shù)的起始數(shù)為127(二進(jìn)制0111 1111),double類型指數(shù)的起始數(shù)為1023(二進(jìn)制011 1111 1111),在此基礎(chǔ)上加指數(shù),得到的就是內(nèi)存中指數(shù)的表示形式。尾數(shù)則直接填入,如果空間多余則以0補(bǔ)齊,如果空間不夠則0舍1入。所以float和double類型分別表示的2.5如下(二進(jìn)制):
符號(hào)位 指數(shù) 尾數(shù)
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
浮點(diǎn)數(shù)2.5可以用二進(jìn)制小數(shù)準(zhǔn)確表示(2.5=1*(2^1)+0*(2^0)+1*(2^-1)),但很多小數(shù)不可以準(zhǔn)確表示,其二進(jìn)制形式的小數(shù)部分會(huì)無限循環(huán),如浮點(diǎn)數(shù)-1.2表示如下(二進(jìn)制):
符號(hào)位 指數(shù) 尾數(shù)
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
由于對(duì)無限循環(huán)尾數(shù)的截取遵循0舍1入,尾數(shù)的第21~24位為0011,第53~56位為0011,而float尾數(shù)容量為23位,double尾數(shù)容量為52位,所以,float形式的最后三位因進(jìn)位而成010,double形式則沒有進(jìn)位發(fā)生。
類型float和double通過==,>,<等比較不會(huì)引起編譯錯(cuò)誤,但是非常可能得到錯(cuò)誤的結(jié)果。這是因?yàn)樗鼈兊膬?nèi)存分布不同,不可以直接比較。正確的方法是轉(zhuǎn)換為同一類型后比較兩者差值,如果結(jié)果小于規(guī)定的小值,則視為相等。
如,一個(gè)比較double的實(shí)現(xiàn):
http://metasharp.net/index.php?title=How_to_compare_double_or_float_in_Cpp
另外,本文參考了如下webs:
http://cdatatype.blogspot.com/2008/01/memory-map-of-floatdouble.html
http://blog.csdn.net/hzb1983/archive/2007/09/24/1798555.aspx
P.S.
1)
IEEE浮點(diǎn)數(shù)標(biāo)準(zhǔn): 4字節(jié)浮點(diǎn)數(shù):1位符號(hào)位,8位階數(shù)(基數(shù)為127的移碼),23位尾數(shù); 8字節(jié)浮點(diǎn)數(shù):1位符號(hào)位,11位階數(shù)(基數(shù)為1023的移碼),52位尾數(shù)
2 )
在VC中: float數(shù)值范圍約在 -10e38~10e38,并提供7位有效數(shù)字位,絕對(duì)值小于10e38地?cái)?shù)被處理成零值 double數(shù)值范圍約在-10e308~10e308,并提供15~16位有效數(shù)字,絕對(duì)值小于10e308地?cái)?shù)被處理成零值
本文來自CSDN博客,轉(zhuǎn)載請(qǐng)標(biāo)明出處:http://blog.csdn.net/vinsendai/archive/2008/06/27/2593035.aspx