如何将浮点数或双精度的NaN和无穷大存储在内存中?

时间:2016-03-22 09:55:07

标签: java nan infinity

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

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

这不会为三种特殊情况留下任何备用位:

  • 的NaN
  • 正无穷大
  • 负无穷大

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

这些实际上如何在内存中表现出来?

5 个答案:

答案 0 :(得分:56)

Java指定浮点数遵循IEEE 754标准。

这就是它的存储方式:

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

现在,我已经使用不同的double值执行了以下方法:

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

Wikipedia explains当指数字段为全位-1时,该数字为Inf或NaN。 Inf具有尾数零的所有位; NaN在尾数中至少有一位设置为1.符号位保留其对于Inf的正常含义,但对NaN没有意义。 Java Double.NaN是一个特殊值,将被解释为NaN,但有2个 53 -3个其他值。

答案 1 :(得分:17)

来自here

  

Q值。如何使用IEEE 754表示零,无穷大和NaN?

     

一个。通过将所有指数位设置为1.正无穷大=   0x7ff0000000000000(所有指数位1,符号位0和所有尾数   位0),负无穷大= 0xfff0000000000000(所有指数位1,   符号位1和所有尾数位0),NaN = 0x7ff8000000000000(全部   指数位1,至少一个尾数位组)。正零=全部   位0负零=所有位0,除了符号位为1。

另请参阅Javadocs关于NAN, Positive Infinity and Negative Infinity

答案 2 :(得分:5)

Wikipedia中所述,所有位设置为1的指数用于标识这些数字。设置为0的分数字段用于标识无穷大(正或负,由符号标识),非零分数字段标识NaN值。

答案 3 :(得分:3)

Java使用IEEE 754浮点。

大多数数字以符号 - 指数 - 尾数格式表示,尾数具有隐含的前导1.

指数(全零和全1)字段的极值不用作正常指数值。相反,它们用于表示特殊情况。

指数字段中的所有零用于表示太小而无法以正常格式表示的数字(包括正零和负零)。

exponenent中的所有内容都用于表示特殊值。如果尾数中的所有位都为零,则该值为正或负无穷大(符号位指示的符号)。否则,该值为NaN。

答案 4 :(得分:0)

首先,我们必须了解数字如何表示为浮点数并在内存中加倍。

一般数字的形式为:1.M * 2 ^ e。

(其中M称为尾数,e是超出-127中的指数)

浮点

MSB(最高有效位)用作符号位,23到31的位数用于指数值,以超过127的形式,0到30的位数用于存储尾数

在Double

MSB(最高有效位)用作符号位,52到63的位数用于超过127形式的指数值,0到0的位数用于存储尾数。

所以现在我们能够理解浮点数中的NaN,无穷大表示或双倍。

NaN (非数字)

在NaN的表示中,所有Exponent位都是1,Mantissa位可以是任何东西,并且它在float或decimal中无关紧要。

<强>无限

在无穷大的表示中,所有指数位均为1,尾数位为0,无论是浮点数还是十进制数都无关紧要。 正无穷大与上述相同,但符号位为0,负无穷大也表示相同,但​​符号位为1。