jvm規範之浮點數 - 你知道嗎,有個數字它和自身不相等

2020-12-25 財富自由之旅

你知道嗎,有個數字它和自身不相等,你知道嗎,有兩個數字他們是相等的,但是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 大神。記得關注 + 收藏哦,請隨意評論,多謝。

相關焦點

  • 變量專題之二:double,float和浮點變量底層表示
    整數只是數字世界的一部分,為了讓計算機運行能夠進一步映射數學運算,我們引入了浮點變量類型。浮點類型其實就是小數類型。小數在程序界被稱為浮點數 (Floating-point arithmetic),這個名稱的由來和浮點數在計算機底層中的存在方式有關。
  • 淺析浮點數精度問題
    相比於整數,浮點數的存儲和表示方法更為複雜。很多開發人員因浮點數難以掌控的精度問題而儘量避免使用浮點數。本文從浮點數的表示方法入手,淺析浮點數的精度問題,希望可以加深大家對浮點數的理解。常用的浮點數有單精度浮點數(float)和雙精度浮點數(double),本文主要以單精度浮點數為例,雙精度浮點數原理相同。通常使用IEEE754標準存儲和表示浮點數。
  • 數字系列之完結篇——九和十
    這個數字系列,我最開始寫六和七的時候只是偶發奇想,後來才想著寫寫數字五,再接下來就寫了四和八、三、一和二。其中關於三和五的都是單獨成篇,並專門寫了三角形和正五邊兩篇文章。既然已經寫了這麼多,如果不寫一下九和十好像不完整似的,那麼就讓我繼續努力一下吧。
  • 數字真奇妙系列之完結篇——自然數九和十
    這個數字系列,我最開始寫六和七的時候只是偶發奇想,後來才想著寫寫數字五,再接下來就寫了四和八、三、一和二。其中關於三和五的都是單獨成篇,並專門寫了三角形和正五邊兩篇文章。既然已經寫了這麼多,如果不寫一下九和十好像不完整似的,那麼就讓我繼續努力一下吧。
  • Go 數據類型篇(二):布爾類型、整型、浮點型和複數類型
    ,其類型將被自動設置為 float64,而不管賦值給它的數字是否是用 32 位長度表示的。也要保證操作數的類型一致,float32 和 float64 類型數據不能混合運算,需要手動進行強制轉化才可以,這一點和動態語言不同。
  • 浮點類型全面解讀
    0.1 + 0.2 == 0.3 嗎?…別看這些問題都看似簡單,但是其實還是有點東西的這些問題。正文為什麼負數要用補碼表示?十進位轉換二進位的方法相信大家都熟能生巧了,如果你說你還不知道,我覺得你還是太謙虛,可能你只是忘記了,即使你真的忘記了,不怕,貼心的小林在和你一起回憶一下。
  • 03.大數整除問題,趣說python數字類和算術運算符
    12:能同時被3和4整除13:去掉個位後的數加上個位數的4倍是13的倍數。18:能同時被2和9整除19:去掉個位後的數加上個位數的2倍是19的倍數。複數先不用管,整型(int)和浮點型(float)不就是我們數學裡說的整數和小數嘛。在python裡,如何知道一個實例是什麼類呢?
  • 單精度浮點加法器的FPGA實現
    如果利用軟體實現,運行時會耗費較多的PC資源,而且算法越複雜時耗費的資源就越多,對於需要高速處理的情況不適用;而如果採用DSP實現,提高並行性的同時指令執行速度必然會提高,較高的指令速度可能導致系統設計複雜化,並增加功耗和成本。新一代的低功耗現場可編程門陣列(FPGA)憑藉其強大的高速並行能力,日益成為高速實時圖像處理的主流器件。
  • 單精度、雙精度和半精度浮點格式之間的區別
    單精度、雙精度和半精度浮點格式之間的區別 strongerHuang 發表於 2020-11-29 09:57:55 我們學過數學,都知道有理數和無理數,然後在有理數中有一類叫浮點數的數字
  • 《我的世界》純BCD正負數浮點四則計算器介紹
    導 讀 展開 《我的世界》中相信很家都知道合理的運用紅石能夠製作出很多智能的設備,下面就為大家帶來
  • 計算機界 TOP 3難題:「相等」是軟體工程中許多重大問題的根源!
    有一個笑話說,計算機科學界有兩大難題:一是緩存失效問題,二是命名問題。但我認為還有第三個更難的問題:相等問題。你沒看錯,等號「=」看似簡單,但等號的使用和誤用,是軟體工程中許多重大問題的根源。另一種應該採用引用相等的情況是,事先知道引用相等的結果與結構相等相同。測試結構相等顯然需要額外開銷,如果真的需要測試結構相等,那麼這個額外開銷是正常的。但是,假設你創建了大量的對象,而且事先知道每個對象都是結構不相等的,那麼花費額外開銷來測試結構相等是沒有必要的,因為僅僅測試引用相等就可以得出同樣的結果。
  • JAVA定義變量和基礎的數據類型和關鍵字,詳解!
    標識符語法1)java中定義標識符格式以字母,數字,下劃線,$符合組成,不能以數字開頭,且不能為java中的關鍵字。2)基本數據類型中數值類型的自動類型提升圖中依次表示了各數值類型的字節數和相應的取值範圍。在Java中,整數類型(byte/short/int/long)中,對於未聲明數據類型的整形,其默認類型為int型。在浮點類型(float/double)中,對於未聲明數據類型的浮點型,默認為double型。
  • JVM超神之路:年後跳槽需要的JVM知識點,周末給你整理了一份!!!
    為什麼要GC2、你能保證GC執行嗎?JDK內置的可視化界面:JConsole、VisualVM,這兩個在QA環境壓測的時候很有用。阿里巴巴開源的arthas:神器,線上調優很方便,安裝和顯示效果都很友好。3、如果有一個系統,內存一直消耗不超過10%,但是觀察GC日誌,發現FGC總是頻繁產生,會是什麼引起的?
  • 浮點型數據存儲方式分析
    筆試面試的過程中難免會遇到很多自己不清楚或者是當時不清楚的問題,關於浮點型數據的問題我認為是比較難的問題啦,如果不清楚浮點型存儲問題,回答問題只有猜結果了。
  • Python數據類型之數字(Numbers)和運算符
    ># 2、浮點數 float# 3、複數 complex# 整型:通常被稱為整數,可以是正整數或負整數,不攜帶小數點;Python3中整型是沒有限制大小的,可以當做長整型(long)類型使用。# 浮點數:浮點數由整數部分與小數部分組成(a = 1.11111),浮點數也可以使用科學計數法表示(2.5e2 = 2.5 x 102 = 250)# 複數:複數由實數部分和虛數部分構成,可以用a + bj,或者complex(a,b)表示, 複數的實部a和虛部b都是浮點型。
  • 來自JVM的一封ClassFile介紹信
    其實這個你可以想像下在.java文件中的entity。什麼userinfo啦,orderinfo啦。這裡我們把這個結構叫做table。也就是類似資料庫裡的表結構的樣子。嗯,沒錯。在classfile的世界裡,有兩種類型,一種就是之前說的那種無符號數,另外一種就是這裡的table類型。你再看看這些名字,也就知道大概存儲什麼東西啦。
  • Javascript每日一學-Javascript中關於浮點數運算的坑
    Javascript中的數字都是雙精度的浮點數。Javascript中的整數並不是一個獨立的數據類型,而是浮點數的一個子集。浮點數的坑我們直接看下面的一個例子。控制臺的浮點數運算通過控制臺的運算,我們可以很驚奇的看到答案,有些運算結果竟然和我們想像的不一樣,比如0.1+0.2的返回結果不是0.3,而是0.30000000000000004。
  • 聊到JVM(還怕面試官問JVM嗎?)
    JVM是Java Virtual Machine(Java虛擬機)的縮寫,JVM是一種用於計算設備的規範,它是一個虛構出來的計算機,是通過在實際的計算機上仿真模擬各種計算機功能來實現的。雖然Java 虛擬機規範把方法區描述為堆的一個邏輯部分,但是它卻有一個別名叫做Non-Heap(非堆),目的應該是與Java 堆區分開來。1. 方法區中有啥?靜態變量(static)常量(final)類信息(構造方法、接口定義)運行時的常量池2.
  • MySQL資料庫中float、double、decimal三個浮點類型到底有什麼區別?
    1. float 浮點類型用於表示單精度浮點數值 2. double浮點類型用於表示雙精度浮點數值 這裡肯定有些小夥伴要問了 什麼是單精度? 什麼是雙精度 ?下面我們就來簡單了解一下吧!首先,我們知道一個bytes(字節) 佔8位 對吧!
  • 這道考 switch 控制語句的阿里基礎面試題你能答對嗎?
    所以,這小節的答案是這樣的嗎?肯定不是的,我們多想一步:首先你得知道 switch 支持 String 是 Java 的一顆語法糖。既然是語法糖, 我們就看看它的 class 文件:不就是為了保證 java 文件裡面的 case 對應的值剛好能和偏移量對上嗎?不就是為了搞一串連續的數字嗎?假設這個時候 switch 表達式的值是 2,我直接根據偏移量 2 ,就可以取到 2 對應的接下來需要執行的地方 47,然後接著執行輸出語句了: