据我所知,java会将一个浮点数存储在内存中,为32位整数,具有以下属性:
这不会为三种特殊情况留下任何备用位:
我猜可以用负0来存储其中一个。
这些实际上如何在内存中表现出来?
答案 0 :(得分:56)
Java指定浮点数遵循IEEE 754标准。
这就是它的存储方式:
现在,我已经使用不同的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。