溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Java中6.6f+1.3f !過程是怎樣的

發(fā)布時間:2022-01-06 16:28:51 來源:億速云 閱讀:148 作者:iii 欄目:云計(jì)算

這篇文章主要講解了“Java中6.6f+1.3f !過程是怎樣的”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“Java中6.6f+1.3f !過程是怎樣的”吧!

Java中6.6f+1.3f !過程是怎樣的

打印結(jié)果是:7.8999996。什么個鬼,我的程序難道是個假程序嗎?

我們將 float 改為 double,在執(zhí)行一下。

Java中6.6f+1.3f !過程是怎樣的

結(jié)果又變了,為:7.8999998569488525。

這是為什么呢?為什么和我預(yù)期的不一樣。

要說明這個問題,我們就要從計(jì)算機(jī)的底層的 0 和 1 說起。計(jì)算機(jī)只認(rèn)識 0 和 1,所以所有的計(jì)算最終都會轉(zhuǎn)換成二進(jìn)制的計(jì)算。

float 存儲原理      

CPU 表示浮點(diǎn)數(shù)由三部分組成 分為三個部分,符號位(sign),指數(shù)部分(exponent)和有效部分(fraction, mantissa)。 其中 float 總共占用 32 位,符號位,指數(shù)部分,有效部分各占 1 位,8 位,23 位。

Java中6.6f+1.3f !過程是怎樣的

對于實(shí)數(shù),轉(zhuǎn)化為二進(jìn)制分為兩部分,第一部分整數(shù)部分,第二部分是小數(shù)部分。整數(shù)部分計(jì)算二進(jìn)制大家都很熟悉。

Java中6.6f+1.3f !過程是怎樣的

我們再看一個小數(shù)部分的計(jì)算過程。

將小數(shù)乘以2,取整數(shù)部分作為二進(jìn)制的值,然后再將小數(shù)乘以2,再取整數(shù)部分,以此往復(fù)循環(huán)。

Java中6.6f+1.3f !過程是怎樣的

你會發(fā)現(xiàn),上面的計(jì)算過程會發(fā)生循環(huán),循環(huán)體為 1001。所以 0.6 轉(zhuǎn)化為二進(jìn)制為 0.10011001…,6.6轉(zhuǎn)化為二進(jìn)制為 110.10011001… 無限循環(huán)。

那么計(jì)算機(jī)該如何處理小數(shù)呢?人們是非常聰明的,所以想出了“規(guī)約化”和“指數(shù)偏移值”。

規(guī)約化      

規(guī)約化,就是我們通過規(guī)約化將小數(shù)轉(zhuǎn)為規(guī)約形式,類似我們用的科學(xué)計(jì)數(shù)法,就是保證小數(shù)點(diǎn)前面有一個有效數(shù)字。

在二進(jìn)制里面,就是保證整數(shù)位是一個 1。那么 110.10011001 規(guī)約化后就為:1.1010011001*2^2

指數(shù)偏移值      

是指浮點(diǎn)數(shù)中指數(shù)部分的值,它的值為規(guī)約形式的指數(shù)值加上某個固定的值,float 的固定值為 127,計(jì)算方法是 2^e-1 其中的 e 為存儲指數(shù)部分的比特位數(shù),前面提到的 float 為 8 位,double 為 11 位。在這里,因?yàn)槭?2 的 2 次方,偏移值就是 127+2=129,轉(zhuǎn)換為二進(jìn)制就是 10000001

拼接      

前面說了,采用二進(jìn)制科學(xué)計(jì)數(shù)法計(jì)算浮點(diǎn)數(shù)的,有三個部分。符號位,指數(shù)部分,有效部。

6.6 為正數(shù),符號位為 0,指數(shù)部分為偏移值的二進(jìn)制 10000001,有效部分為規(guī)約形式的小數(shù)部分,為什么只取小數(shù)部分?因?yàn)檎麛?shù)肯定是 1,去掉了不會產(chǎn)生誤差。我們?nèi)ト⌒?shù)的前 23 位即 10100110011001100110011,最后拼接到一起即 01000000110100110011001100110011。 同理,我們可以計(jì)算出 1.3 的浮點(diǎn)數(shù)為 00111111101001100110011001100110。

Java中6.6f+1.3f !過程是怎樣的

感謝各位的閱讀,以上就是“Java中6.6f+1.3f !過程是怎樣的”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對Java中6.6f+1.3f !過程是怎樣的這一問題有了更深刻的體會,具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是億速云,小編將為大家推送更多相關(guān)知識點(diǎn)的文章,歡迎關(guān)注!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI