Java_语法基础_浮点数据的存储

在Java中,浮点类型的结构与运算符合IEEE754标准。浮点类型使用符号位、指数与有效位数(尾数)来表示。其中,符号位用来表示浮点值得正负,指数位用来存储指数值,有效位数用来存储小数值。在Java中,浮点类型float与double的结构如下:
类型    符号位      指数域      有效位数域
float  1位(第31位) 8位(第23~30位)  23位(第0~22位)
double 1位(第63位) 11位(第52~62位) 52位(第0~51位)
其中,符号位为0,浮点值为正,符号位为1,浮点值为负。浮点类型的指数与有效位数都是无符号的,指数采用了偏移量方式来存储指数值,偏移量为2^x-1(比实际指数大2^x-1),其中x为指数域的位数,float类型为8位,double类型为11位。例如,浮点值float类型值8.1f的指数为3,在指数位中实际存储的值为127+3,即130。任何一个非0并且非无穷大的浮点数v都可以表示为v=s*m*2^e的形式。s为1或-1,m为有效位数(小数),e为指数。
根据指数与有效位数的不同,可以将浮点数分为3类。

  • 正规化浮点数
  • 非正规化浮点数
  • 特殊浮点数

1.正规化浮点数
当指数域不全为0并且不全为1,该浮点数就是正规化浮点数。正规化浮点数的有效位数(小数部分)会在实际存储小数值的结果上加1。例如:float类型值99.5f的32位存储结构如下:
0 10000101 10001110000000000000000
二进制的有效位数为0.1000111,加1的二进制结果为1.1000111。而指数部分(133)减去偏移量(2^8-1=127)后的值为6,因此根据浮点值可以表示为v=s*m*2^e,99.5f就可以写成:
99.5f=1*1.1000111*2^6

2.非正规化浮点数
当指数域全为0并且有效位数域不全为0时,该浮点数就是非正规化浮点数。需要注意的是,非正规化浮点数的指数值为1-偏移量。例如,float类型值5.877472E-39f的32位存储结构如下:
0 00000000 10000000000000000000000
二进制的有效位数为0.1,实际上也就是这个值(不再加1),指数为1-偏移量,float类型的偏移量为127,即-126,因此该浮点数可以写成:
5.877472E-39f=1*0.1*2^(-126)

3.特殊浮点数
浮点数  符号位  指数域  有效位数域
0     0    全为0   全为0
-0     1    全为0   全为0
正无穷大   0   全为1   全为0
负无穷大   1   全为1   全为0
NaN    任意   全为1  不全为0

你可能感兴趣的:(Java_语法基础_浮点数据的存储)