float和double的數值怎麼儲存在二進位制中
稍微淺學過二進位制的人,都清楚二進位制是個什麼東西。我們都瞭解正整數是怎麼轉化成二進位制的,那麼計算機中,又是怎麼儲存folat,double型別的數值的呢?
要像弄清楚這個問題,首先得清楚二進位制是怎麼表示小數的。(這一點請注意了)
十進位制是怎麼表示小數的呢?
比如,125.456 其實可以分解成 1*10^2+2*10^1+5*10^0+4*10^-1+5*10^-2+6*10^-3
如果用指數表示的話就是 1.25456E2--------(1+2*10^-1+5*10^-2+4*10^-3+5*10^-4+6*10^-5)*10^2
瞭解清楚了上面的關係,那麼二進位制中的小數表示應該也很清楚了
0.1---------------------------等於--------------------1*2^-1(0.5)
0.01-------------------------等於--------------------1*2^-2(0.25)
0.001-----------------------等於--------------------1*2^-3(0.125)
0.0001---------------------等於--------------------1*2^-4 (0.0625)
0.00001------------------- --------------------1*2^-5 (0.03125)
那麼任意一個帶小數的二進位制表示我們都可以表示成這樣,例如
10001.101----------------等於-------------1*2^4+1*2^0+1*2^-1+1*2^-3
用指數表示為1.0001101*2^4----------(1+1*2^-4+1*2^-5+1*2^-7)*2^4
接下來就很清楚了,任意一個十進位制的數值都可以表示成或者近似表示成(1+1*2^-n+...1*2^-m)*2^k
例如:8.5=1*2^4+1*2^-1
5.4約等於4+1+0.25+0.125+0.015625=1*2^2+1*2^0+1*2^-2+1*2^-3+1*2^-6
(這也解釋了為什麼二進位制是不能精確表示1/10,因為無論加多少階,1/10都不能被上述樣式精確表示出來。有些時候也會出現能夠除盡的算式,計算機中卻不能除盡例如:double f1=3240.0;
double f2=8.0;
double f3=(f1*(f2/100))/(1+(f2/100));//結果應該為240
System.out.println(f3);輸出結果為239.99999999999997
這點參考自:http://www.xue163.com/588880/39103/391036655.html)
總結:現在我們知道了二進位制是怎麼表示小數,並且任何十進位制的數都可以等於或近似表示成(1+1*2^-m+...1*2^-n)*2^k。
那麼剩下的就很簡單了。我們只要知道:
float有4個位元組32為,首位表示符號,接下來8位表示階數K,剩下23表示二進位制的小數部分。
double有8個位元組,64位,首位表示符號,11位表示階數k,剩下表示小數部分。
更詳細的表示方法,別人已經寫了,詳見:
http://blog.csdn.net/gjw198276/article/details/6956244
完!!歡迎吐槽和評論,敬請指出不足之處!!!