据我所知java将浮点数存储在内存中作为32位整数,具有以下属性:
这为三种特殊情况留下了没有备用位:
我可以猜到负0可以用来存储其中一个。
这些在记忆中是如何表现的?
Java指定浮点数遵循IEEE754标准。
这是它的存储方式:
现在,我已经使用不同的双精度值执行了下面的方法:
public static void print(double d){
System.out.println(Long.toBinaryString(Double.doubleToRawLongBits(d)));
}
我使用这些值执行:
print(Double.NaN);
print(Double.NEGATIVE_INFINITY);
print(Double.POSITIVE_INFINITY);
print(-Double.MAX_VALUE);
print(Double.MAX_VALUE);
并获得了上述值的以下输出(为易读性而格式化):
NaN: 0111111111111000000000000000000000000000000000000000000000000000
-Inf: 1111111111110000000000000000000000000000000000000000000000000000
+Inf: 0111111111110000000000000000000000000000000000000000000000000000
-Max: 1111111111101111111111111111111111111111111111111111111111111111
+Max: 0111111111101111111111111111111111111111111111111111111111111111
维基百科解释说,当指数字段为all-bits-1时,数字是Inf或NaN。Inf的尾数为零;NaN在尾数中至少有一位设置为1。符号位保留了Inf的正常含义,但对NaN没有意义。Java的Double. NaN
是一个将被解释为NaN的特定值,但还有253−3个其他值。
从这里:
零、无穷和NaN如何用IEEE754表示?
A.通过将所有指数位设置为1。正无穷=0x7ff00000000000(所有指数位1,符号位0和所有尾数位0),负无穷=0xfff0000000000000(所有指数位1,符号位1和所有尾数位0),NaN=0x7ff8000000000000(所有指数位1,至少设置一个尾数位)。正零=所有位0。负零=所有位0,除了符号位为1。
另请参考关于NAN、正无穷和负无穷的Javadocs。
如维基百科所述,所有位都设置为1的指数用于标识这些数字。设置为0的分数字段用于标识无穷大(正或负,由符号标识),非零分数字段标识NaN值。