C 語言中的 double 型別所能表示的數的範圍為什麼這麼大,不是說只佔32(或64)位嗎?
範圍是那麼大,但是不是裡面所有的數都可以表示。
浮點數是有精度限制的。浮點數有兩個部分組成,一個尾數一個階碼。表示的方法類似科學計數法,比如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
浮點數是有精度限制的,請搜尋“浮點數的比較”,“浮點運算 誤差”等
我也覺得很奇怪,從理論上說最多也就是2的64次方種不同組合,為什麼可以表示那麼大的範圍啊,就算全部來表示整數,也只能從0~2的64次方啊?何況還有整數……
現在懂了,沒有精度。。。。
浮點數的本質是科學計數法,其佔用的 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
看,精度誤差就這麼出現了。所以浮點數雖然表示範圍大,可是有效數字少,精度是有限的,並不能表示範圍內的所有數字。