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

  • Post author:
  • Post category:java


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



版权声明:本文为shichimiyasatone原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。