Java中的浮點數(shù)分析
浮點數(shù)分為單精度和雙精度,Java中的單精度和雙精度分別為float和double.你們知道float和double是怎么存儲的嗎?
float占4個字節(jié),double占8個字節(jié),為了方便起見,這里就只討論float類型.
float其實和一個int型的大小是一樣的,一共32位,第一位表示符號,2-9表示指數(shù),后面23位表示小數(shù)部分.這里不多說,請參考:http://blog.csdn.net/treeroot/archive/2004/09/05/95071.aspx
這里只舉一個例子,希望能拋磚引玉,就是研究一下浮點數(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) { static void pr(int 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; |
| 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.
其他的不多說了,輸入結(jié)果是一樣的,可以說0.1這個浮點數(shù)肯定是不精確的,但是0.5可以精確的表示,想想為什么吧
相關(guān)文章
Java實現(xiàn)設(shè)計模式之責(zé)任鏈模式
責(zé)任鏈模式是一種行為設(shè)計模式,允許你將請求沿著處理鏈發(fā)送,然后處理者都可對其進(jìn)行處理,完成后可以再將其傳遞給下一個處理者。下面將會舉例說明什么是責(zé)任鏈模式,責(zé)任鏈模式該如何使用2022-08-08
java多線程編程之慎重使用volatile關(guān)鍵字
volatile關(guān)鍵字相信了解Java多線程的讀者都很清楚它的作用。volatile關(guān)鍵字用于聲明簡單類型變量,下面看一下為什么要慎重使用volatile關(guān)鍵字2014-01-01
MAC上IntelliJ IDEA的svn無法保存密碼解決方案
今天小編就為大家分享一篇關(guān)于MAC上IntelliJ IDEA的svn無法保存密碼解決方案,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2018-10-10
關(guān)于Selenium的UI自動化測試屏幕截圖功能實例代碼
今天小編就為大家分享一篇關(guān)于Selenium的UI自動化測試屏幕截圖功能實例代碼,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-05-05
在CentOS上安裝Java 17并實現(xiàn)多版本共存的詳細(xì)教程
在現(xiàn)代軟件開發(fā)中,Java 作為一種廣泛使用的編程語言,其版本更新頻繁,不同項目可能依賴不同版本的 Java 運行環(huán)境,CentOS 作為一款流行的 Linux 發(fā)行版,常被用于服務(wù)器部署和開發(fā)環(huán)境,本文將詳細(xì)介紹如何在 CentOS 上安裝 Java 17,并實現(xiàn)與現(xiàn)有 Java 8 的多版本共存2025-03-03

