Java Double.POSITIVE_INFINITY==Float.POSITIVE_INFINITY
我试过了 结果是Java Double.POSITIVE_INFINITY==Float.POSITIVE_INFINITY,java,floating-point,Java,Floating Point,我试过了 结果是 System.out.println(Double.isInfinite(Float.POSITIVE_INFINITY)) System.out.println(Double.isInfinite(Float.NEGATIVE_INFINITY)); 这意味着两种数据类型的“无穷大”是相同的?是和否。是的,因为在抽象意义上,无穷大就是无穷大(并且,正如我下面解释的,出于大多数代码浮点数的目的,无论如何都会转换为双精度浮点数) 不,但是,因为在位级别,两个无穷大是不同的。do
System.out.println(Double.isInfinite(Float.POSITIVE_INFINITY))
System.out.println(Double.isInfinite(Float.NEGATIVE_INFINITY));
这意味着两种数据类型的“无穷大”是相同的?是和否。是的,因为在抽象意义上,无穷大就是无穷大(并且,正如我下面解释的,出于大多数代码浮点数的目的,无论如何都会转换为双精度浮点数) 不,但是,因为在位级别,两个无穷大是不同的。double在Java中是64位,float在Java中是32位,所以它们在表示级别上的差别很小 在Java中,浮点数(浮点数和双精度浮点数)是用浮点格式表示的,这是现在几乎所有人都使用的标准格式。每个数字在二进制中表示为一个符号位,加上一定数量的指数位,再加上一定数量的尾数(有效位)位。在浮点或双精度中,正无穷大用符号位0表示,指数位全部为1,尾数位全部为0。负无穷大以相同的方式表示,符号位为1除外。所以无穷大用两种非常相似的方式表示,但由于浮点和双精度之间的指数和尾数位数不同,位级模式也不同
为了编写代码,可以将它们视为相同的对象。无论何时同时使用double和float,除非您明确表示不使用,否则float将自动转换为double,表达式将生成double,因此float infinity“在大多数实际情况下表现为”double infinity。这取决于您所说的“same”是什么意思。位模式是不同的,因为符号不同,但它们仍然都是无限的
此外,当转换为双精度浮点时,浮点的提升规则将保留无限性。在Java中,您不能直接将
double
与float
进行比较。相反,当您尝试执行此操作时,float
首先自动转换为double
。当您将float
传递给接受double
参数的方法时,也会发生同样的情况。当你把Float.POSITIVE无限(例如)转换成double
时,你会得到double.POSITIVE无限
所以你的问题的答案是,
Double.POSITIVE无限
和Float.POSITIVE无限
不是完全相同的东西,但它们都表示“一个太大而无法表示的数字”因此,=
给出的答案在逻辑上是一致的。在Java中,无法将浮点值
与双精度
进行比较。在将float
简单地向上转换为double
后,您可能会使用的所有操作将double
与double
进行比较
true
true
我所说的“相同”是指如果你取两者之差,你会得到零。我还没有检查这两种情况下的位模式。但是它们不应该是相同的,因为Double.compare(…)方法就是依赖于这个吗?@user1064918不,位模式不一样,因为浮点是32位,而Double是64位。此外,如果你取二者之差,你会得到NaN,因为无穷大-无穷大在数学上也不是一个数字。@user1064918:事实上,
Float.POSITIVE\u Infinity-Float.POSITIVE\u Infinity-Float.POSITIVE\u Infinity
也是NaN
,就像Float.POSITIVE\u Infinity+Float.NEGATIVE\u Infinity
一样。无论使用哪种数据类型,两个无穷大的减法都没有定义。我明白了。而Double.compare(Double,Double)
方法将是聪明的(或者,可能是愚蠢的?)足以为Double.compare(Float.POSITIVE,Double.POSITIVE)
?@user1064918这与Double.compare(Double,Double)
无关。正如我在回答中所提到的,只要预期有一个double,并且提供了一个float,float就会自动转换为double,因此double.compare(double,double)
只能看到两个double。JVM和硬件足够聪明,可以识别32位无穷大(float)并将其转换为64位无穷大(double)。只是出于好奇,你知道NaN的二进制表示形式是什么吗?@user1064918当然知道。在NaN中,指数位都是1,尾数位不都是0。符号位可以是0或1。
float f=
double d =
Double.compare(f, d);
// equivelent to
Double.compare((double) f, d);