|
C語言和C#語言中,對于浮點類型的數據采用單精度類型(float)和雙精度類型(double)來存儲,float數據占用32bit, double數據占用64bit, 無論是單精度還是雙精度在存儲中都分為三個部分: 首先說一下原,反,補,移碼. 移碼其實就等于補碼,只是符號相反. 對于正數而言,原,反,補碼都一樣, 對負數而言,反碼除符號位外,在原碼的基礎上按位取反,補碼則在反碼的基礎之上,在其最低位上加1,要求移碼時,仍然是先求補碼,再改符號.
A,階碼是用移碼表示的,這里會有一個127的偏移量,它的127相當于0,小于127時為負,大于127時為正,比如:10000001表示指數為129- 127=2,表示真值為2^2,而01111110則表示2^(-1). 有移碼表示階碼有是有原因的,主要是移碼便于對階操作,從而比較兩個浮點數的大小. 這里要注意的是,階碼不能達到11111111的形 式,IEEE規定,當編譯器遇到階碼為0XFF時,即調用溢出指令. 總之,階碼化為整數時,范圍是:-127~127. float: 符號位1,階碼08(固定偏移 7F),尾數23,固定隱含位有 double: 符號位1,階碼11(固定偏移 3FF),尾數52,固定隱含位有 long double:符號位1,階碼15(固定偏移3FFF),尾數64,固定隱含位無 某些編譯器中把long double作double處理
其中float的存儲方式如下圖所示:
而雙精度的存儲方式為:
2 精度 float和double的精度是由尾數的位數來決定的。浮點數在內存中是按科學計數法來存儲的,其整數部分始終是一個隱含著的“1”,由于它是不變的,故不能對精度造成影響。 float:2^23 = 8388608,一共七位,這意味著最多能有7位有效數字,但絕對能保證的為6位,也即float的精度為6~7位有效數字; double:2^52 = 4503599627370496,一共16位,同理,double的精度為15~16位。
注:本文在寫作過程中,參照了如下資料: http://blog.csdn.net/ganxingming/archive/2006/12/19/1449526.asp http://blog.csdn.net/hziee_/archive/2007/01/08/1477427.aspx http://blog.csdn.net/biblereader/article/details/819428
|


浙公網安備 33010602011771號