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);