为什么JAVA的float取值范围是-3.4*10^38 ~ -3.4*10^38

在IEEE754标准中进行了单精度浮点数(float)和双精度数浮点数(double)的定义。float有32bit,double有64bit。它们的构成包括符号位、指数位和尾数位。 
这些位的构成如下: 
符号位-------------指数位----------------尾数位---- 
下面对于这3部分我分别用s,e,f来表示。浮点数从最高位到最低位是这样表示的s(1位),e(8位),f(23位) .浮点数大小
是(-1)^s * 2^(e-127) * 1.f

1。符号位s,如果是0则为正;否则是1则为负. 
 2。指数e有一个偏移量127,所以实际指数还要减去127。如果指数部分位1000 0000(10进制数128),那么实际
指
数应该是1(128-127)。
     如果e最大(8位全部为1),此时e=255,它应该实际表示的指数是255-127=128.不过在这个标准中它有其他的
意义:
     2.1 e=255,f=0(f的23位全部为0),此时表示的是INF,是正无穷大还是负无穷大由符号位s决定。
     2.2 e=255, f!=0(f的23位不全部为0),此时表示的是NaN。IEEE 标准中的NaN是有两类,一类是和算术
            有关,一类是和信号有关。不过通常的C库不区分的。
    如果e最小(8位全部为0),此时e=0,它应该实际表示的指数是0-127=-127,标准中规定了这不是一个规范的
浮点数,但它也是合法的(只是整数部分为0)。
3。最后面的23位全部为尾数,即2进制中的小数部分。

取值范围主要看指数部分: 
float的指数部分有8bit(2^8),由于是有符号型,所以得到对应的指数范围-127~128。 
double的指数部分有11bit(2^11),由于是有符号型,所以得到对应的指数范围-1024~1024。 

由于float的指数部分对应的指数范围为-128~128,所以取值范围为: 
-2^128到2^128,约等于-3.4E38 — +3.4E38 

精度(有效数字)主要看尾数位: 
float的尾数位是23bit,对应7~8位十进制数,所以有效数字有的编译器是7位,也有的是8位这个也间接说明
为什么浮点型比整数型处理速度会慢的多。主要是表示的方式不一样。浮点型转换比整数型转换的工作量大的多。



猜你喜欢

转载自blog.csdn.net/shayne_lee/article/details/53364572
38