二進位制浮點數表示機制

2021-10-07 04:31:49 字數 1560 閱讀 6778

最小負數−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

以上我們不難看出,儘管floatdouble可以表示的數字範圍很大,但是他們的精度是十分有限的,這主要受制於他們各自的尾數(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在記憶體中明明是同乙個數,為什麼浮點數...