最小負數−2∗
2127
-2*2^
−2∗212
7 最大負數−1∗
2−126-1 * 2^
−1∗2−1
26,0最小正數 1∗2
−126
1*2^
1∗2−12
6最大正數2∗2
1272*2^
2∗2127
。負數:(-1.7976931348623157e+308,-4.94065645841246544e-324);
零:0 ;
正數:(4.94065645841246544e-324,1.7976931348623157e+308)。
即絕對值為0和2^1022 —— 2^1024。
float和double的精度是由尾數的位數來決定的;
浮點數在記憶體中是按科學計數法來儲存的,其整數部分始終是乙個隱含著的「1」,由於它是不變的,故不能對精度造成影響;
float:2^23 =8388608,共七位,意味著最多能有7位有效數字,但絕對能保證的為6位,也即float的精度為6~7位有效數字;
double:2^52 = 4503599627370496,一共16位,同理,double的精度為15~16位。
原因float:1bit(符號位)+8bits(指數字)+23bits(尾數字);
double:1bit(符號位)+ 11bits(指數字)+ 52bits(尾數字)。
以float為例,階碼(指數)用移碼來表示,8位移碼(偏移量為127) 本來應該可以表示-128~127,但是全0和全1被用來 表示特殊狀態的指數 ,所以為-126~127(無符號8位表示0-255,去除全0和1後是1-254,減去偏移量127,就是-126~127)。 這裡為什麼要使用127來作為偏移量,若使用128 則8位移碼表示範圍-127~126,由於表示乙個大的正數 比乙個小的負數更加重要,所以127作為偏移量比較合適。 現在可以計算其表示範圍了: 尾數部分的取值範圍[1,2),所以最小負數−2∗
2127
-2*2^
−2∗212
7,最大負數−1∗
2−126-1*2^
−1∗2−1
26,最小正數 1∗2
−126
1*2^
1∗2−12
6 ,最大正數 2∗2
1272*2^
2∗2127
以上我們不難看出,儘管float
和double
可以表示的數字範圍很大,但是他們的精度是十分有限的,這主要受制於他們各自的尾數(m)長度有限,float
僅有23
位尾數長度,double
也只有52
位的尾數長度。
浮點數的二進位制
1.前幾天,我在讀一本c語言教材,有一道例題 include void main void 在我的編譯器下 編譯是會發生錯誤的。錯誤 cannot convert from int to float win7 vc6.0 sp6 執行結果如下 num的值為 9 pfloat的值為 0.000000 ...
浮點數轉化二進位制
乙個int型別表示的整數值是 2 31 2 31 1 32位二進位制表示 1111111111111111 11111111 11111111 011111111 11111111 11111111 1111111 類似整數聯想到浮點數是怎麼表示的呢?最初正常人可能為這樣想的 但是這樣好像表示的數也...
浮點數的二進位制表示
前幾天,我在讀一本c語言教材,有一道例題 includevoid main void 執行結果如下 num的值為 9 pfloat的值為 0.000000 num的值為 1091567616 pfloat的值為 9.000000 我很驚訝,num和 pfloat在記憶體中明明是同乙個數,為什麼浮點數...