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。