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

rob*_*ock 39 java nan infinity

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

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

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

  • 为NaN
  • 正无穷大
  • 负无穷大

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

这些实际上如何在记忆中表现出来?

Dar*_*hta 57

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

这就是它的存储方式:

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

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

public static void print(double d){
    System.out.println(Long.toBinaryString(Double.doubleToRawLongBits(d)));
}
Run Code Online (Sandbox Code Playgroud)

我执行了这些值:

print(Double.NaN);
print(Double.NEGATIVE_INFINITY);
print(Double.POSITIVE_INFINITY);
print(-Double.MAX_VALUE);
print(Double.MAX_VALUE);
Run Code Online (Sandbox Code Playgroud)

并获得上述值的以下输出(格式化为可读性):

 NaN: 0111111111111000000000000000000000000000000000000000000000000000
-Inf: 1111111111110000000000000000000000000000000000000000000000000000
+Inf: 0111111111110000000000000000000000000000000000000000000000000000
-Max: 1111111111101111111111111111111111111111111111111111111111111111
+Max: 0111111111101111111111111111111111111111111111111111111111111111
Run Code Online (Sandbox Code Playgroud)

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

  • 请写下您从代码中获得的实际输出 - 它实际上从不打印文本,只打印二进制文件 - 或更新您的代码以打印您所说的内容.此外,由于现在很难快速比较,请排列数字. (3认同)

Rah*_*thi 17

从这里:

问:使用IEEE 754如何表示零,无穷大和NaN?

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

另请参阅Javadocs有关NAN,正无穷大和负无穷大的信息.

  • 这也意味着可以存在多个NaN,它们可以彼此区分(即使它们都是NaN).某些应用程序使用它来存储有关非数字性质的其他信息. (8认同)

yol*_*ole 5

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