float 4個(gè)字節(jié)(采用IEEE754標(biāo)準(zhǔn):標(biāo)準(zhǔn)規(guī)定了計(jì)算機(jī)程序設(shè)計(jì)環(huán)境中的二進(jìn)制和十進(jìn)制的浮點(diǎn)數(shù)自述的交換、算術(shù)格式以及方法)
浮點(diǎn)數(shù)在內(nèi)存中是按科學(xué)計(jì)數(shù)法來存儲(chǔ)的,其整數(shù)部分始終是一個(gè)隱含著的"1"
例如:123.45=1.2345*10^2;
一個(gè)float類型的數(shù)據(jù)在內(nèi)存中的存儲(chǔ)格式為
符號(hào)位 指數(shù)位 底數(shù)位
0 00000000 0000000 00000000 00000000
S EEEEEEEE MMMMMMM MMMMMMMM MMMMMMMM
1位 8位 23位
S: 1位,表示負(fù)數(shù),0表示正數(shù)
E: 8位,表示指數(shù),可表示數(shù)據(jù)范圍(00000000-11111111,對(duì)應(yīng)的十進(jìn)制為0-255)
因?yàn)橹笖?shù)可以是正數(shù)也可以是負(fù)數(shù),IEEE754標(biāo)準(zhǔn)規(guī)定:指數(shù)減去127才是實(shí)際的指數(shù)(這是規(guī)定)
float的指數(shù)表示范圍是-127到128;
M: 24位(實(shí)際只存儲(chǔ)23位),表示底數(shù)
因?yàn)樗械男?shù)都可以表示為1.xx*10^n;小數(shù)點(diǎn)前面永遠(yuǎn)是1,所以小數(shù)點(diǎn)前面一位默認(rèn)不存儲(chǔ),只存儲(chǔ)小數(shù)點(diǎn)后面的23位
所以float的數(shù)據(jù)范圍
1*-2^128到1*2^128 也即 -3.04E38~3.04E38(E表示10的幾次方)
精度問題
float的底數(shù)部分由23位二進(jìn)制組成
所以底數(shù)的最大值為2^23=8388607(最大為7位),所以float類型的有效數(shù)字最大為7位
double 8個(gè)字節(jié)(采用IEEE754標(biāo)準(zhǔn))
浮點(diǎn)數(shù)在內(nèi)存中是按科學(xué)計(jì)數(shù)法來存儲(chǔ)的,其整數(shù)部分始終是一個(gè)隱含著的"1"
例如:123.45=1.2345*10^2;
一個(gè)double類型的數(shù)據(jù)在內(nèi)存中的存儲(chǔ)格式為
符號(hào)位 指數(shù)位 底數(shù)位
0 00000000000 0000000 00000000 00000000 00000000 00000000 00000000 00000000 0000
S EEEEEEEEEEE MMMMMMM MMMMMMMM MMMMMMMM MMMMMMMM MMMMMMMM MMMMMMMM MMMMMMMM MMMM
1位 11位 52位
S: 1位,表示負(fù)數(shù),0表示正數(shù)
E: 11位,表示指數(shù),可表示數(shù)據(jù)范圍(00000000000-11111111111,對(duì)應(yīng)的十進(jìn)制為0-2047)
因?yàn)橹笖?shù)可以是正數(shù)也可以是負(fù)數(shù),IEEE754標(biāo)準(zhǔn)規(guī)定:指數(shù)減去1023才是實(shí)際的指數(shù)(這是規(guī)定)
float的指數(shù)表示范圍是-1023到1024;
M: 53位(實(shí)際只存儲(chǔ)52位),表示底數(shù)
因?yàn)樗械男?shù)都可以表示為1.xx*10^n;小數(shù)點(diǎn)前面永遠(yuǎn)是1,所以小數(shù)點(diǎn)前面一位默認(rèn)不存儲(chǔ),只存儲(chǔ)小數(shù)點(diǎn)后面的52位
所以double的數(shù)據(jù)范圍
1*-2^1024到1*2^1024 也即 -1.798E308~1.789E308(E表示10的幾次方法)
精度問題
double的底數(shù)部分由52位二進(jìn)制組成
所以底數(shù)的最大值為最大值為2^52=4503599627370496(最大為16位),所以double類型的有效數(shù)字最大為16位
float數(shù)據(jù)十進(jìn)制和二進(jìn)制的轉(zhuǎn)換
23.125轉(zhuǎn)換為二進(jìn)制
整數(shù)和小數(shù)部分分別轉(zhuǎn)換
23的二進(jìn)制
23/2 11 1
11/2 5 1
5/2 2 1
2/2 1 0
1/2 0 1
23的二進(jìn)制位10111
0.125的二進(jìn)制
0.625*2=1.25 取整1,小數(shù)部分0.25
0.25*2=0.5 取整0,小數(shù)部分0.5
0.5*2=1.0 取整1,小數(shù)部分0
0.125的二進(jìn)制0.101
23.125的二進(jìn)制10111.101
10111.101將"."向左移動(dòng),直到小數(shù)點(diǎn)前面只剩1位;
10111.101=1.0111101*2^4;(類比十進(jìn)制數(shù)123.456=1.23456*10^2)
指數(shù):實(shí)際為4,因?yàn)镮EEE754標(biāo)準(zhǔn)規(guī)定,存儲(chǔ)的指數(shù)減去127才是實(shí)際的指數(shù)(這是規(guī)定)
所以4+127=131轉(zhuǎn)換為二進(jìn)制才是存儲(chǔ)的指數(shù)10000011
底數(shù):0111101(只記錄小數(shù)點(diǎn)后面即可)
所以23.125在的在內(nèi)存中存儲(chǔ)形式為
符號(hào)位 指數(shù)位 底數(shù)位
0 10000011 01111010000000000000000