日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

為什么float4個字節比long8個字節所表示的數值范圍廣

作者:柒畫503 更新時間: 2022-09-22 編程語言

在Java語言中,我們知道基本數據類型包括數值型、字符型以及布爾型。其中數值型包括整數類型(byte、short、int、long)和浮點類型(float、double)。long型占用8個字節的存儲空間,即64bit,最左邊一位是符號位,0表示正,1表示負,其余23位存儲數值,所以long型可以表示的數值范圍為-263到263-1。這個很好理解,而float型占用4個字節,即32bit,所表示的數值范圍為-3.403E38到3.403E38,這個數值范圍是要大于long型所表示的數值范圍的。為什么會這樣呢?要搞懂這個問題,就先要明白float型是如何存儲的。

float型的存儲方式


為了方便說明,這里用單精度浮點數定義的一張圖。


其中,左邊第一位為符號位,0表示正,1表示負。上圖中sign為0,所以為正數。

中間8bit表示指數,但是這里和byte不同,byte型也是8bit,表示的數值范圍是-27到27-1,即-128到127。這里exponent的8bit表示的則是-127到128。在IEEE 754(IEEE二進制浮點數算術標準)[2]中規定,在指數的實際值上要加上一個固定的值,目的是為了方便浮點數的計算,該固定值為2e-1-1,其中e表示存儲指數的bit的長度。在單精度浮點數中,e的值為8,所以固定值是127。所以,exponent中存儲的數值是0(-127+127)到255(128+127),共256個數。在上圖中,指數部分存儲的是01111100,轉換為十進制是124,124減去127(加的固定值)即為實際指數值,即-3。

在小數部分中,最左側省略了一個1,上圖中的小數部分為01,其實就是1.01(二進制),轉換為十進制就是1+2-2(這里看不懂的話去復習二進制小數轉十進制)。
所以,最終上圖所表示的數值為(-1)sign ×\times× fraction ×\times× 2exponent = (+1) ×\times× (1 + 2-2) ×\times× 2-3 = 0.15625。

不過還沒有結束,關于浮點數其實還分為零、非規約形式,規約形式、無窮以及NaN,以4字節單精度浮點數為例,具體如下:

形式 ?指數? 小數部分
零? ??0(實際-127) 0
非規約形式 ?0(實際-126) ?大于0小于1
規約形式? 1到254(實際-126到127) 大于等于1小于2
無窮? ?255(實際128) 非0
NaN? 255(實際128) ?非0

???
規約形式的浮點數就是指數大于0小于等于2e-2(e為8時值為254),fraction最高位省略了1。“規約”就是指用唯一確定的浮點形式去表示一個值。

如果指數部分的值為0(實際-126,為什么不是0-固定值127 = -127?因為IEEE 754規定非規約形式的浮點數的指數偏移值比規約形式的浮點數的指數偏移值小1),小數部分不為0,那么這個浮點數就是非規約形式的浮點數,這個時候最高位省略的就不是1了,而是0了,所以小數部分是大于0小于1的。所有的非規約浮點數比規約浮點數更加接近0。

下面列出了單精度浮點數各種極值的情況:


我們常說的float型的表示范圍其實說的是單精度浮點數最大的規約數的范圍。

為什么float4個字節比long8個字節所表示的數值范圍還大?


回到這個問題,我想你已經有答案了。
就是float型它有指數部分,規約數的指數可以表示到2127,差不多是1038這么大。再扯遠一點,從信息論的角度看,我們有額外的信息(IEEE 754的編碼格式規定)嵌入在了數值范圍的表示中,即我們知道哪個是符號位,哪些是指數部分,哪些是小數部分,以及省略的最高位的1,所以float型32個bit才能存下這么多信息。
?

原文鏈接:https://blog.csdn.net/weixin_56373368/article/details/126084889

欄目分類
最近更新