当前位置:网站首页>为什么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才能存下这么多信息。
边栏推荐
猜你喜欢
随机推荐
【数据知多少】一文学懂通过Tushare、AKshare、baostock、Ashare、Pytdx获取股票行情数据(含代码)
C语言的基本程序结构详细讲解
DOM —— 事件机制及事件链
2021 annual summary - complete a year of harvest
lammps学习(二)联合原子模型聚乙烯拉伸
WeTest----如何查看Wetest生成测试报告?
小知识点系列:数组与多维数组
加点字符就能让qq昵称很酷的神奇代码?
Jenkins 参数化构建(Extended Choice Parameter)
IIR滤波器设计之冲激响应不变法与双线性变换法
【无标题】
JSP技术
Principles of permutation entropy, fuzzy entropy, approximate entropy, sample entropy and approximate entropy implemented by MATLAB
DOM —— 事件对象
2021 Huawei Cup Mathematical Modeling Contest E question - Ultra-Wideband (UWB) precise positioning problem under signal interference
Xshell 使用删除键乱码问题
基于Visual Studio 2015的CUDA编程(一):基本配置
【网络设备远程登陆配置SSH/Telnet 】
常见(MySQL)面试题(含答案)
Explain in detail how the bit manipulation operators in C language can be used?