NaN和Infinity如何在内存中存储一​​个float或double?

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

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

这为三种特殊情况留下了不必要的空位:

  • 为NaN
  • 正无限
  • 负无穷

我可以猜测,负0可以用来存储其中之一。

这些在内存中是如何performance的?

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 

维基百科解释说 ,当指数字段是全比特-1时,数字是Inf或NaN。 Inf具有尾数零的所有位; NaN的尾数至less有一位设置为1.符号位保留其对Inf的正常含义,但对NaN没有意义。 Java的Double.NaN是一个特殊的值,将被解释为NaN,但是也有2 Double.NaN

从这里 :

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

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

另请参阅关于NAN,正无穷和负无穷的Javadoc。

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

Java使用IEEE 754浮点。

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

指数(全零和全1)的极值不能用作正常的指数值。 相反,他们被用来代表特殊情况。

指数字段中的所有零用来表示数字(包括正数和负数零),这些数字太小而不能以正常格式表示。

指数中的所有元素都用来表示特殊的值。 如果尾数中的所有位均为零,则该值为正负无穷(符号位指示的符号)。 否则,值是NaN。

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

一般数字的forms是:1.M * 2 ^ e。

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

在浮点

MSB(最高有效位)被用作符号位,从23到31的位数被用作超过-127forms的指数值,0到30的位数被用于存储尾数。

在双

MSB(最高有效位)被用作符号位,并且从52到63的位号被用作超过-127forms的指数值,并且从0到0的位数被用于存储尾数。

所以现在我们有能力了解NaN,Infinity在float或double中的表示。

NaN (不是数字)

在NaN的表示forms中,所有的指数位都是1,并且尾数位可以是任何东西,不pipe它是浮点还是小数。

无穷

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