Java 中 float 的取值範圍
阿新 • • 發佈:2019-02-04
.
float佔用4個位元組,和int是一樣,也就是32bit.
第1個bit表示符號,0表示正數,1表示負數,這個很好理解,不用多管.
第2-9個bit表示指數,一共8位(可以表示0-255),這裡的底數是2,為了同時表示正數和負數,這裡要減去127的偏移量.這樣的話範圍就是(-127到128),另外全0和全1作為特殊處理,所以直接表示-126到127.
剩下的23位表示小數部分,這裡23位表示了24位的數字,因為有一個預設的前導1(只有二進位制才有這個特性).
最後結果是:(-1)^(sign) * 1.f * 2^(exponent)
這裡:sign是符號位,f是23bit的小數部分,exponent是指數部分,最後表示範圍是(因為正負數是對稱的,這裡只關心正數)
2^(-126) ~~ 2(1-2^(-24)) * 2^127
這個還不是float的取值範圍,因為標準中還規定了非規格化表示法,另外還有一些特殊規定.
非規格化表示
當指數部分全0而且小數部分不全0時表示的是非規格化的浮點數,因為這裡預設沒有前導1,而是0.
取值位0.f * 2^(-126),表示範圍為 2^(-149)~~ (1-2^(-23)) * 2^(-126) 這裡沒有考慮符號.這裡為什麼是-126而不是-127? 如果是-127的話,那麼最大表示為
2^(-127)-2^(-149),很顯然2^(-127) ~~2^(-126) 就沒法表示了.
float佔用4個位元組,和int是一樣,也就是32bit.
第1個bit表示符號,0表示正數,1表示負數,這個很好理解,不用多管.
第2-9個bit表示指數,一共8位(可以表示0-255),這裡的底數是2,為了同時表示正數和負數,這裡要減去127的偏移量.這樣的話範圍就是(-127到128),另外全0和全1作為特殊處理,所以直接表示-126到127.
剩下的23位表示小數部分,這裡23位表示了24位的數字,因為有一個預設的前導1(只有二進位制才有這個特性).
最後結果是:(-1)^(sign) * 1.f * 2^(exponent)
這裡:sign是符號位,f是23bit的小數部分,exponent是指數部分,最後表示範圍是(因為正負數是對稱的,這裡只關心正數)
2^(-126) ~~ 2(1-2^(-24)) * 2^127
非規格化表示
當指數部分全0而且小數部分不全0時表示的是非規格化的浮點數,因為這裡預設沒有前導1,而是0.
取值位0.f * 2^(-126),表示範圍為 2^(-149)~~ (1-2^(-23)) * 2^(-126) 這裡沒有考慮符號.這裡為什麼是-126而不是-127? 如果是-127的話,那麼最大表示為
2^(-127)-2^(-149),很顯然2^(-127) ~~2^(-126) 就沒法表示了.