C 語言中的 double 型別所能表示的數的範圍為什麼這麼大,不是說只佔32(或64)位嗎?余天升2012-02-24 22:57:59

範圍是那麼大,但是不是裡面所有的數都可以表示。

浮點數是有精度限制的。浮點數有兩個部分組成,一個尾數一個階碼。表示的方法類似科學計數法,比如2。99792458x10^8,那麼就會存299792458和9兩個整數,其中299792458就是尾數,而9就是階碼。如果使用1個位元組來表示階碼,那麼表示數的範圍可以輕易突破10^127次方。

不過,浮點數是會截斷的。比如295 430 243 968 902 328 9

05 321

和295 430 243 968 902 328 9

00 000

很可能沒有什麼差別,都用類似於0。295 430 243 969x10^25來表示了,後面那些都被截斷了。

詳見:

http://

en。wikipedia。org/wiki/F

loating_point

C 語言中的 double 型別所能表示的數的範圍為什麼這麼大,不是說只佔32(或64)位嗎?Belleve2014-01-02 00:26:42

C 語言中的 double 型別所能表示的數的範圍為什麼這麼大,不是說只佔32(或64)位嗎?

C 語言中的 double 型別所能表示的數的範圍為什麼這麼大,不是說只佔32(或64)位嗎?

C 語言中的 double 型別所能表示的數的範圍為什麼這麼大,不是說只佔32(或64)位嗎?henix2014-01-02 16:22:52

浮點數是有精度限制的,請搜尋“浮點數的比較”,“浮點運算 誤差”等

C 語言中的 double 型別所能表示的數的範圍為什麼這麼大,不是說只佔32(或64)位嗎?學習積極分子2019-11-03 17:38:55

我也覺得很奇怪,從理論上說最多也就是2的64次方種不同組合,為什麼可以表示那麼大的範圍啊,就算全部來表示整數,也只能從0~2的64次方啊?何況還有整數……

現在懂了,沒有精度。。。。

C 語言中的 double 型別所能表示的數的範圍為什麼這麼大,不是說只佔32(或64)位嗎?Doraemon2019-12-25 11:03:54

浮點數的本質是科學計數法,其佔用的 32 / 64 位二進位制只是浮點數的有效數字和冪的位而已。

比如 1234。5 這樣的數,二進位制為 10011010010。1,轉換為科學計數法即為 1。00110100101E1010。E 後面的數表示的是以 2 為底的冪,1010 也是二進位制表示,對應的是 10 進位制的 10。

32 位浮點數就不說了,和 64 位差不多同樣的道理,就只說 64 位浮點數好了。64 位浮點數里,首位是符號位,0 表示正,1 表示負。接下來的 11 位是指數位,就是以 2 為底的冪64 位浮點數里,指數位整體向上偏移了 1023,也就是說指數位為全 0 時,其表示的是 2 的負 1023 次方。再接下來的 52 位是底數位,這裡面只記錄了小數點後面的二進位制序列,小數點前面的 1 沒有記錄。所以 1234。5 這樣的數,如果用 64 位浮點數儲存的話,相應的二進位制序列應該為

0 10000001001 0011010010100000000000000000000000000000000000000000

所以很明顯,浮點數受限於有效數字位數(也就是底數的位數),不能精確表示一些較為複雜的數字。比如說 1145141919810364364 這樣的數字,二進位制為

111111100100010111001000001001000011101101001010001111001100

轉換為科學計數法後得

1。11111100100010111001000001001000011101101001010001111001100E111011

其底數部分有 59 位小數,超過了 64 位浮點數所能容納的 52 位小數的範圍。所以實際儲存時會對第 53 位及之後小數做一個 0 舍 1 入的處理,實際儲存的數值用科學計數法表示為

1。1111110010001011100100000100100001110110100101001000E111011

二進位制序列為

0 10000111010 1111110010001011100100000100100001110110100101001000

我們再將這個做過處理的二進位制數還原為十進位制數,得 1145141919810364416

看,精度誤差就這麼出現了。所以浮點數雖然表示範圍大,可是有效數字少,精度是有限的,並不能表示範圍內的所有數字。