你知道嗎,有個數字它和自身不相等,你知道嗎,有兩個數字他們是相等的,但是1.0除以他們得到的結果卻是大相逕庭。本文將為你揭開這神秘的面紗,並自此開啟 java jvm 之旅。關注我,我接下來將持續更新 java jvm 知識 、數據結構與算法,你若關注,我必不負所望!
今天,我們說 jvm 裡浮點數的表示,已經整理如下:
浮點數的表示,目前幾乎都是用 IEEE754 標準,它包括了:正負數,正負0,正負無窮大,以及 NaN(Not a number),其中,NaN = 0.0f / 0.0f,NaN 是無序的,而且 NaN != NaN,本身不相等,這是唯一一例,也無法用標準形式表示。
正負 0 雖然是相等的,但是有區別,1.0 / 0.0 等於正無窮大,1.0/-0.0 等於 負無窮大。此外,正負 0 就沒區別了。
現在,我們正式走進浮點數的世界,java jvm 裡不只有 單精度浮點數集合,還有單精度擴展指數集合,不只有雙精度浮點數集合,還有雙精度擴展指數集合。但是,單、雙精度擴展指數集合是可選的,而單雙精度浮點數集合是必須要實現的,擴展指數集合可以代替浮點數集合。
IEEE754 標準裡,一個浮點數表示為:s × m × 2^(e-N+l) 來表示,其中,s 為正負1,表示數字的符號,
m 是一個小於 2^N 的正整數, e 是一個介於 Emin=-(2^(k-1) - 2) 和 Emax=2^(K-l) - l 之間的整數,包括 Emin 和 Emax。N 與 K 的範圍則取決於當前採用的浮點數集合。
對於一個數字,可能存在多組 s、m與e的值來表示,此時,可以把 m 的值減半,而 e + 1,得到另一種表示,如果某種表示裡 m >= 2^(n-1),則稱該表示為標準表示,如果沒有,如果 m >= 2^(n-1) 不成立,則稱為非標準表示,如果一個數字不存在標準表示,則稱這個值為非標準值。
至於 N、K 的範圍,請參考下圖:
我得承認,浮點數的表示理解起來是比較吃力,我當年讀大學時就不理解,如今,還是一知半解。
關注我,帶你揭秘 java jvm 奧妙,成為 java 大神。記得關注 + 收藏哦,請隨意評論,多謝。