網站首頁 編程語言 正文
在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
- 上一篇:繼承關系下構造方法的訪問特點
- 下一篇:IO流技術中的File類
相關推薦
- 2022-07-03 c語言中的二級指針做函數參數說明_C 語言
- 2022-09-19 django安裝xadmin及問題解決_python
- 2023-03-03 Android獲取RecyclerView滑動距離方法詳細講解_Android
- 2022-02-27 uniapp swiper內有點擊事件時會觸發 swiper的animationfinish事件
- 2022-09-25 git提交代碼版本沖突問題
- 2022-10-30 在C#程序中注入惡意DLL的方法詳解_C#教程
- 2022-12-22 基于WPF實現代碼查看器控件_C#教程
- 2022-07-14 React?Native?Popup實現示例_React
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支