提问者:小点点

浮点数或双精度的NaN和Infinity如何存储在内存中?


据我所知java将浮点数存储在内存中作为32位整数,具有以下属性:

  • 第一位用于确定符号
  • 接下来的8位代表指数
  • 最后的23位用于存储分数

这为三种特殊情况留下了没有备用位:

  • NaN
  • 正无穷
  • 负无穷

我可以猜到负0可以用来存储其中一个。

这些在记忆中是如何表现的?


共3个答案

匿名用户

Java指定浮点数遵循IEEE754标准。

这是它的存储方式:

  • 位0:符号位
  • 位1到11:指数
  • 位12到63:分数

现在,我已经使用不同的双精度值执行了下面的方法:

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值。