当前位置:网站首页>为什么float4个字节比long8个字节所表示的数值范围广
为什么float4个字节比long8个字节所表示的数值范围广
2022-08-02 14:19:00 【柒画503】
在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才能存下这么多信息。
边栏推荐
猜你喜欢

网络运维系列:网络出口IP地址查询

Nvm,Nrm使用教程

VMware 安装openwrt

2021年度总结——收获圆满的一年
【滤波器】最小均方(LMS)自适应滤波器

hybrid 实现同网段但不同vlan之间通讯

2021 Huawei Cup Mathematical Modeling Contest E question - Ultra-Wideband (UWB) precise positioning problem under signal interference

为什么四个字节的float表示的范围比八个字节的long要广?

解决跨域问题的方法 --- JSONP

小知识点系列:数组与多维数组
随机推荐
IDEA如何进行远程Debug
Mysql锁机制与事务隔离
CDN的加速原理是什么?
GC垃圾回收ZGC
C语言中国象棋源码以及图片
搭建Spark开发环境
【网络设备远程登陆配置SSH/Telnet 】
华为Vlan创建及原理简单说明
详解C语言中的位操作运算符可以怎么用?
面试追问系列-Redis技术原理
时频分析之Wigner-Ville分布
Servlet 技术2
H3C 交换机配置端口组、DHCP、DHCP中继、管理用户
一个简单的 erlang 的 udp 服务器和客户端
smart rtmpd web 接口说明
解决跨域的方法 --- Proxy
Homebrew的简单介绍
CUDA programming based on Visual Studio 2015 (1): basic configuration
makefile——杂项
XML技术