java里float型变量范围

初学java,问个白痴问题
为什么float型变量分配4字节,范围那么大?
同样的int型变量也是内存分配4字节,范围那么小。

浮点类型的位模式不同与整数类型。

浮点的位模式分为指数位和有效位两部分。例如 100,可用的2的最高次幂是6,所以指数部分就是6,剩下的36就是在有效位部分。

但是要得到指数部分的直接位模式,我们还需要知道一个位移的概念,例如float的位移是127,所以实际上如果指数是6,那么,直接的指数部分位模式是:127+6 = 133,所以位模式是:10000101

回头再看 100.5, 它的位模式是:0 10000101 10010010000000000000000

我们分析一下这个值的由来:

第一个0,是符号位
后8位是上面算出来的,133,其中指数为6,位移为127
剩下的值表示36.5
小数点的位置是以指数来决定的,例如此处指数为6,刚小数点的位置从有效位最左开始算6位,也就是

100100 。10000000000000000

可以看出前六位计算得到:36;后面一个1算出来就是0.5。

后记:从此可以看出浮点的表示方式,也知道如果一个数路够大,因为浮点在java中占32位,其中第一位是符号位,当数足够大的时候,分数部分最先损失,然后是整数部分。

从int 型到float型;或是从long型到double型的转换被认为是向上的,这是因为他们认为只要量级不损失就是安全的,这些转换只损失精度。

转自(http://liugang594.javaeye.com/blog/556433
温馨提示:答案为网友推荐,仅供参考
第1个回答  2019-09-17
IEEE
754规定了四种表示浮点数值的方式:单精确度(32位元)、双精确度(64位元)、延伸单精确度(43位元以上,很少使用)与延伸双精确度(79位元以上,通常以80位元实做)Java
里面的Float都是遵循IEEE
754
规范的。float的单精度
32

(4字节)由于采用的数值存储格式不一样,所以范围也不一样。 最大值
(2-2-23)*2127
最小值
2-149
浮点数保存的字节格式如下:
地址
+0
+1
+2
+3
内容
SEEE
EEEE
EMMM
MMMM
MMMM
MMMM
MMMM
MMMM
这里
S
代表符号位,1是负,0是正
E
偏移127的幂,二进制阶码=(EEEEEEEE)-127。
M
24位的尾数保存在23位中,只存储23位,最高位固定为1。此方法用最较少的位数实现了
较高的有效位数,提高了精度。
零是一个特定值,幂是0
尾数也是0。
浮点数-12.5作为一个十六进制数0xC1480000保存在存储区中,这个值如下:
地址
+0
+1
+2
+3
内容0xC1
0x48
0x00
0x00
浮点数和十六进制等效保存值之间的转换相当简单。下面的例子说明上面的值-12.5如何转
换。
浮点保存值不是一个直接的格式,要转换为一个浮点数,位必须按上面的浮点数保存格式表
所列的那样分开,例如:
地址
+0
+1
+2
+3
格式
SEEE
EEEE
EMMM
MMMM
MMMM
MMMM
MMMM
MMMM
二进制
11000001
01001000
00000000
00000000
十六进制
C1
48
00
00
从这个例子可以得到下面的信息:
符号位是1
表示一个负数
幂是二进制10000010或十进制130,130减去127是3,就是实际的幂。
尾数是后面的二进制数10010000000000000000000
在尾数的左边有一个省略的小数点和1,这个1在浮点数的保存中经常省略,加上一个1和小数
点到尾数的开头,得到尾数值如下:
1.10010000000000000000000
接着,根据指数调整尾数.一个负的指数向左移动小数点.一个正的指数向右移动小数点.因为
指数是3,尾数调整如下:
1100.10000000000000000000
结果是一个二进制浮点数,小数点左边的二进制数代表所处位置的2的幂,例如:1100表示
(1*2^3)+(1*2^2)+(0*2^1)+(0*2^0)=12。
小数点的右边也代表所处位置的2的幂,只是幂是负的。例如:.100...表示(1*2^(-1))+
(0*2^(-2))+(0*2^(-2))...=0.5。
这些值的和是12.5。因为设置的符号位表示这数是负的,因此十六进制值0xC1480000表示-12.5。
相似回答