2018-06-22 14:05:09 1232瀏覽
本篇文章扣丁學堂Java培訓小編和大家分享一下Java中的浮點數(shù)分析情況,文章中會有代碼列出供大家參考。對Java感興趣的小伙伴現(xiàn)在就隨扣丁學堂的小編一起來了解一下吧。
浮點數(shù)分為單精度和雙精度,Java中的單精度和雙精度分別為float和double.你們知道float和double是怎么存儲的嗎?
float占4個字節(jié),double占8個字節(jié),為了方便起見,這里就只討論float類型。float其實和一個int型的大小是一樣的,一共32位,第一位表示符號,2-9表示指數(shù),后面23位表示小數(shù)部分。
這里只舉一個例子,希望能拋磚引玉,就是研究一下浮點數(shù)0.1的存儲形式,先運行這個程序。
public class Test{ public static void main(String[] args) { int x = 0x3d800000; int i = 1 << 22; int j = 1 << 4; float f = 0.1f; int y = Float.floatToIntBits(f); float rest = f - ( (float) 1) / j; while (i > 0) { j <<= 1; float deta = ( (float) 1) / j; if (rest >= deta) { rest -= deta; x |= i; } i >>= 1; } pr(x); pr(y); } static void pr(int i) { System.out.println(Integer.toBinaryString(i)); } }
結(jié)果:
111101110011001100110011001101
111101110011001100110011001101
程序說明:
int x=0x3d80000;
因為浮點表示形式為1.f*2n-127我們要表示0.1,可以知道n-127=-4,到n=123
符號為正,可知前9是 001111011,暫時不考慮后面的23位小數(shù),所以我們先假設(shè)x=0x3d800000;
|
int i = 1 << 22; |
i初始為第右起第23位為1,就是x的第10位
int j = 1 << 4;
i初始為4,因為n-127為-4,這里是為了求它的倒數(shù).
float f = 0.1f;
int y = Float.floatToIntBits(f);
y就是它的32位表示
float rest = f - ( (float) 1) / j;
這個rest表示除了1.f中的1剩下的,也就是0.f
while (i > 0) {
j <<= 1;
float deta = ( (float) 1) / j;
if (rest >= deta) {
rest -= deta;
x |= i;
}
i >>= 1;
}
這個循環(huán)來計算23位小數(shù)部分,如果rest不小于deta,表示這個位可以置為1。
以上就是扣丁學堂Java在線學習小編給大家分享的Java中的浮點數(shù)分析,希望對小伙伴們有所幫助。想要了解更多內(nèi)容的小伙伴可以登錄扣丁學堂官網(wǎng)咨詢,扣丁學堂是專業(yè)的Java培訓機構(gòu),不僅有專業(yè)的老師和與時俱進的課程體系,還有大量的Java在線視頻供學員觀看學習。喜歡Java開發(fā)想要學習的小伙伴快快行動吧。扣丁學堂Java技術(shù)交流群:670348138。
【關(guān)注微信公眾號獲取更多學習資料】
查看更多關(guān)于“Java開發(fā)資訊”的相關(guān)文章>>