[Java]浮点数float、double取值范围与精度

版权声明:本文为博主原创文章,转载请申明出处,感谢。 https://blog.csdn.net/shichimiyasatone/article/details/85276316

1、Java浮点数

在Java中,浮点数取值范围的表示不像整数那么简单。对于int来说,他的规则标准是:一个int类型变量占32位,最高位为符号位,剩下31位表示值,所以取值范围 [-2^{31}, 2^{31}-1] 。而浮点数有另一套标准,IEEE 754

2、float结构

我们以float为例子,一个float数占4字节32位,分为三部分:符号位,指数位,尾数位。

符号位(S):1bit 指数位(E):8bit 尾数位(M):23bit
  1. 符号位:0表示正数,1表示负数;
  2. 指数位:格式为:2^{E-127},值范围\left [ 2^{-127}, \right 2^{128}]
  3. 尾数位:形式为1.M或0.M。其中当E=0时,取1.M,称为正规形式,当E!= 0时,取0.M,称为非正规形式。

3、取值范围

正规形式float值 = (-1)^{S}*2^{E-127}*(1.M),非正规形式float值 = (-1)^{S}*2^{-127}*(0.M)

根据上式,很容易就能计算出float取值范围\left (-2^{128}, \right 2^{128}),能取到区间内的近似值。float最小绝对值2^{(-126-23)} = 2^{-149}

除了正规与非正规形式,浮点数还包含多个特殊值,具体形式如下:

符号 指数部分 指数部分-127 尾数部分

小数部分的

最高有效位

形式
1 255 128 非0 没有 NaN
1 255 128 0 没有 负无穷
1 1~254 -126~127 任意 1 正规形式(负数)
1 0 -127 非0 0 非正规形式(负数)
1 0 -127 0 没有 负0
0 0 -127 0 没有 正0
0 0 -127 非0 0 非正规形式(正数)
0 1~254 -126~127 任意 1 非正规形式(负数)
0 255 128 0 没有 正无穷
0 255 128 非0 没有 NaN

4.浮点数double

符号位(S):1bit 指数位(E):11bit 尾数为(M):52bit

浮点数double使用的规则和float相似,不过每个部分位数与float不同。正规double值 = (-1)^{S}*2^{E-1023}*(1.M)

5.精度

尾数代表的是2的负数次方,使用二进制的科学计数法近似表示十进制科学计数法。对于float来说,尾数最小值2^{-23}只能近似表示10^{-7},所以只能精确表示6~7位小数。对于double来说,尾数最小值2^{-52}只能近似表示10^{-16},只能精确表示15~16位小数。

 

参考:

https://blog.csdn.net/shenziheng1/article/details/79471340

https://blog.csdn.net/a327369238/article/details/52354811/#commentBox

https://baike.baidu.com/item/IEEE%20754/3869922?fromtitle=IEEE754标准&fromid=10427270

猜你喜欢

转载自blog.csdn.net/shichimiyasatone/article/details/85276316