您好,登錄后才能下訂單哦!
這篇文章主要講解了“Java中6.6f+1.3f !過程是怎樣的”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“Java中6.6f+1.3f !過程是怎樣的”吧!
打印結果是:7.8999996。什么個鬼,我的程序難道是個假程序嗎?
我們將 float 改為 double,在執行一下。
結果又變了,為:7.8999998569488525。
這是為什么呢?為什么和我預期的不一樣。
要說明這個問題,我們就要從計算機的底層的 0 和 1 說起。計算機只認識 0 和 1,所以所有的計算最終都會轉換成二進制的計算。
CPU 表示浮點數由三部分組成 分為三個部分,符號位(sign),指數部分(exponent)和有效部分(fraction, mantissa)。 其中 float 總共占用 32 位,符號位,指數部分,有效部分各占 1 位,8 位,23 位。
對于實數,轉化為二進制分為兩部分,第一部分整數部分,第二部分是小數部分。整數部分計算二進制大家都很熟悉。
我們再看一個小數部分的計算過程。
將小數乘以2,取整數部分作為二進制的值,然后再將小數乘以2,再取整數部分,以此往復循環。
你會發現,上面的計算過程會發生循環,循環體為 1001。所以 0.6 轉化為二進制為 0.10011001…,6.6轉化為二進制為 110.10011001… 無限循環。
那么計算機該如何處理小數呢?人們是非常聰明的,所以想出了“規約化”和“指數偏移值”。
規約化,就是我們通過規約化將小數轉為規約形式,類似我們用的科學計數法,就是保證小數點前面有一個有效數字。
在二進制里面,就是保證整數位是一個 1。那么 110.10011001 規約化后就為:1.1010011001*2^2
是指浮點數中指數部分的值,它的值為規約形式的指數值加上某個固定的值,float 的固定值為 127,計算方法是 2^e-1 其中的 e 為存儲指數部分的比特位數,前面提到的 float 為 8 位,double 為 11 位。在這里,因為是 2 的 2 次方,偏移值就是 127+2=129,轉換為二進制就是 10000001
前面說了,采用二進制科學計數法計算浮點數的,有三個部分。符號位,指數部分,有效部。
6.6 為正數,符號位為 0,指數部分為偏移值的二進制 10000001,有效部分為規約形式的小數部分,為什么只取小數部分?因為整數肯定是 1,去掉了不會產生誤差。我們去取小數的前 23 位即 10100110011001100110011,最后拼接到一起即 01000000110100110011001100110011。 同理,我們可以計算出 1.3 的浮點數為 00111111101001100110011001100110。
感謝各位的閱讀,以上就是“Java中6.6f+1.3f !過程是怎樣的”的內容了,經過本文的學習后,相信大家對Java中6.6f+1.3f !過程是怎樣的這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。